Pagina de start a forumului Forum PHP Romania - Discutii despre PHP, MySQL, Javascript, AJAX, etc Forum PHP Romania - Discutii despre PHP, MySQL, Javascript, AJAX, etc
Comunitatea PHP Romania
 

o problema la un handler de eroare
Vezi mesajul original

 
       Pagina de start a forumului Forum PHP Romania - Discutii despre PHP, MySQL, Javascript, AJAX, etc -> PHP Avansat
Subiectul anterior :: Subiectul următor  
Autor Mesaj
copot



Data înscrierii: 06/Apr/2005
Mesaje: 233
Locație: Undeva departe

Trimis: Joi Ian 12, 2006 10:38 am    Titlul subiectului: o problema la un handler de eroare  

<? error_reporting(E_ALL); function handler($errno, $errstr, $errfile, $errline) {   echo "Error no. <b>" . $errno . "</b> at line <b>" . $errline . "</b> in <b>" . $errfile ."</b>.<br>" . $errstr . "<br>";   } set_error_handler('handler'); // alter the include path $cur = ini_get("include_path"); $cur .= PATH_SEPARATOR.dirname(__FILE__).'\\db\\'; ini_set("include_path", $cur); // required classes require_once('application.db.class.php'); require_once('application.template.class.php');     // configuration date_default_timezone_set('Europe/Bucharest'); function __autoload($class)  {             include($class . '.php');         if ( !class_exists($class, false) ) {       trigger_error("Unable to locate class $class", E_USER_ERROR);         }   } // initiate database object $application->connection = mysql::getInstance('localhost', 'comert', 'root', '');  $application->connection->Open();  // initiate template system $application->template = & new CachedTemplate(application_root. '/cache/' . application_runningfile); ?>

Cand nu definesc un handler-ul de erori nu e nici o problema.
Dar cand e definit, totul se schimba.

La linia asta:
$application->connection = mysql::getInstance('localhost', 'comert', 'root', '');

primesc

Error no. 2048 at line 41 in d:\http\personal\include\application.engine.php.
Creating default object from empty value
Sus  
aurelian



Data înscrierii: 01/Iun/2003
Mesaje: 833
Locație: Bucuresti

Trimis: Joi Ian 12, 2006 10:59 am    Titlul subiectului: Re: o problema la un handler de eroare  

Fara nici o legatura,
copot a scris: an style="color: #000000"><?php <? // alter the include path $cur = ini_get("include_path"); $cur .= PATH_SEPARATOR.dirname(__FILE__).'\\db\\'; ini_set("include_path", $cur); 


liniile astea se pot scrie mai bine:

Cod:
ini_set("include_pth", get_include_path() . PATH_SEPARATOR . dirname(__FILE__) . DIRECTORY_SEPARATOR . 'db'. DIRECTORY_SEPARATOR);


Posibil sa fie ceva in neregula cu getinstance ala, cine stie.
Sus  
copot



Data înscrierii: 06/Apr/2005
Mesaje: 233
Locație: Undeva departe

Trimis: Joi Ian 12, 2006 11:30 am    Titlul subiectului: hai sa pun tot carnatul  

structura:
/
/include/
/include/application.db.class.php
/include/application.template.class.php
/include/application.db.class.php
/include/application.engine.php
/include/db/
/include/db/mysql.php
/index.php


application.engine.php
an style="color: #000000"><?php error_reporting(E_ALL); // user defined error handling function function errorhandler(parametri tra la la ) {   // handle error } set_error_handler('errorhandler'); set_include_path(get_include_path() . PATH_SEPARATOR . dirname(__FILE__) . DIRECTORY_SEPARATOR .';' . PATH_SEPARATOR . dirname(__FILE__) . DIRECTORY_SEPARATOR . 'db'. DIRECTORY_SEPARATOR . ';' . PATH_SEPARATOR . dirname(__FILE__) . DIRECTORY_SEPARATOR . 'debug'. DIRECTORY_SEPARATOR);  // required classes require_once('application.db.class.php'); require_once('application.template.class.php');     // configuration date_default_timezone_set('Europe/Bucharest'); function __autoload($class)  {             // include database wrapper     include($class . '.php');         if ( !class_exists($class, false) ) {       trigger_error("Database class error: unable to locate class $class", E_USER_ERROR);         }   } // initiate database object $application->connection = mysql::getInstance('localhost', 'comert', 'root', '');  $application->connection->Open();  // initiate template system $application->template = & new CachedTemplate(application_root. '/cache/' . application_runningfile); 


application.db.class.php

an style="color: #000000"><?php class Database {     private $props;        protected $connection;     protected $result;           protected $hostname;        protected $database;        protected $username;        protected $password;     private function __construct($dbhost=null, $dbname=null, $dbuser=null, $dbpassword=null) {         $this->database = $dbname;         $this->hostname = $dbhost;         $this->username = $dbuser;         $this->password = $dbpassword;     }         protected function __set($name, $value) {         if (isset($this->props[$name])) {             $this->props[$name] = $value;         }     }         protected function __get($name) {         if (isset($this->props[$name])) {             return $this->props[$name];         } else {             return null;            }     } } 

mysql.php
an style="color: #000000"><?php class Mysql extends Database {     static private $instance;     public function __construct($dbhost=null, $dbname=null, $dbuser=null, $dbpassword=null) {         parent::__construct($dbhost, $dbname, $dbuser, $dbpassword);     }     static function getInstance($dbhost, $dbname, $dbuser, $dbpassword) {         if(!Mysql::$instance) {             Mysql::$instance = new Mysql($dbhost, $dbname, $dbuser, $dbpassword);         }         return Mysql::$instance;     }     public function __set($name, $value) {         if (isset($name) && isset($value)) {             parent::__set($name, $value);         }     }     public function __get($name) {         if (isset($name)) {             return parent::__get($name);         }     }     public function Connected() {         if (is_resource($this->connection)) {             return true;         } else {             return false;         }     }          public function Open() {         if (is_null($this->database))                   throw Exception("MySQL database not selected ! \n Problem: " . __METHOD__ . " at " . __LINE__ . "!\n");                            if (is_null($this->hostname))             throw Exception("MySQL hostname not set ! ! \n Problem: " . __METHOD__ . " at " . __LINE__ . "!\n");                      try {             $this->connection = new mysqli($this->hostname, $this->username, $this->password, $this->database);                 }                 catch (Exception $ex)          {             throw Exception("Unable to connect to server. \n Problem: " . __METHOD__ . " at " . __LINE__ . "!\n Exception: ". $ex->getMessage());         }         try {              $this->connection->select_db($this->database);         }         catch (Exception $ex)         {             throw Exception("Could not select database. \n Problem: " . __METHOD__ . " at " . __LINE__ . "!\n Exception: ". $ex->getMessage());         }     }     public function Close() {         $this->connection->close();         $this->connection = null;     }     public function Query($sql) {         if ($this->connection === false) {             throw Exception("No database connection found. \n Problem: " . __METHOD__ . " at " . __LINE__ . "!\n");         }         $this->result = $this->connection->query($sql);         if ($this->result === false) {                    throw Exception($this->connection->error()." \n Problem: " . __METHOD__ . " at " . __LINE__ . "!\n");         }         return $this->result;     }     public function FetchArray()      {         if ($this->connection === false) {             throw Exception("No database connection found. \n Problem: " . __METHOD__ . " at " . __LINE__ . "!\n");         }                $data = $this->result->fetch_array();         if (!is_array($data)) {                    throw Exception($this->connection->error()." \n Problem: " . __METHOD__ . " at " . __LINE__ . "!\n");         }         return $data;     }     public function FetchAssoc()      {         if ($this->connection === false) {             throw Exception("No database connection found. \n Problem: " . __METHOD__ . " at " . __LINE__ . "!\n");         }                 $data = $this->result->fetch_assoc();         if (!is_array($data)) {                    throw Exception($this->connection->error()." \n Problem: " . __METHOD__ . " at " . __LINE__ . "!\n");         }         return $data;     }      } 


si in sfarsit
index.php
an style="color: #000000"><?php include_once('include/application.engine.php');                 $var_result = $application->connection->Query("SELECT * FROM shop_products where ProductID >1 ");     $var_products = $application->connection->FetchAssoc($result);     $application->connection->close;                  if(!($application->template->is_cached())) {         $application->template->set('products', $var_products);     }             echo $application->template->fetch_cache(application_root.'/templates/index.tpl'); 

Eroarea imi apare doar cand e setat ca handler -> errorhandler();

Mai exact:
Runtime Notice no. 2048 in d:\http\personal\include\application.engine.php at line 71
Creating default object from empty value

acilea:

$application->connection = mysql::getInstance('localhost', 'comert', 'root', '');
Sus  
aurelian



Data înscrierii: 01/Iun/2003
Mesaje: 833
Locație: Bucuresti

Trimis: Joi Ian 12, 2006 2:20 pm    Titlul subiectului:  

well, am "replicat" eroarea ta cu codul:
Cod:
error_reporting(E_ALL);
function ehandler($errno, $errstr, $errfile, $errline) {
    echo "Error no. <b>" . $errno . "</b> at line <b>" . $errline . "</b> in <b>" . $errfile ."</b>.<br>" . $errstr . "<br>";
}
set_error_handler('ehandler');

$person->name="aurelian";
var_dump($person);


Cod:
[aurelian@gremlin tmp]$ php5 inst.php
Error no. <b>2048</b> at line <b>9</b> in <b>/home/aurelian/tmp/inst.php</b>.<br>Creating default object from empty value<br>object(stdClass)#1 (1) {
  ["name"]=>
  string(8) "aurelian"
}


cred ca faci ceva cu adevarat stupid.

de exemplu, folosesti variabila $application fara initializare.(in application.engine.class.php ).
ar trebui:
$application= mysql::getinstance();
$application->open();
[...]

nu o sa iti analizez si restul codului, insa cateva recomandari:
nu defini variabile intr-un fisier pentru a le folosi in altul (cu include)
nu folosi si __autoload si apeluri catre include* (require)
foloseste nume adecvate si pentru fisiere dar si pentru clase/metode, de ex: application.engine.class.php ma duce cu gandul ca in fisierul respectiv ar fi o clasa.
Sus  
copot



Data înscrierii: 06/Apr/2005
Mesaje: 233
Locație: Undeva departe

Trimis: Joi Ian 12, 2006 2:40 pm    Titlul subiectului: Okay  

Multumesc pentru sugestii.

Ai perfecta dreptate cu Citat: nu defini variabile intr-un fisier pentru a le folosi in altul (cu include) (la care te referi totusi ?)
nu folosi si __autoload si apeluri catre include* (require)
.

Intr-adevar vroiam sa initializez totul in application.engine.php.
Dar macar fa-ma sa inteleg de ce nu e bine ?

Am scris gresit application.engine.class.php. De fapt era application.engine.php. (graba)
Sus  
aurelian



Data înscrierii: 01/Iun/2003
Mesaje: 833
Locație: Bucuresti

Trimis: Joi Ian 12, 2006 3:20 pm    Titlul subiectului:  

pai, de exemplu in index.php folosesti variabila $application definita in application.engine.php. este doar parerea mea, dar in felul acesta iti va fi mai greu peste 2-3 luni sa intelegi codul scris acum (mentnanta). gandeste-te ca un client va avea tot timpul noi cerinte si inevitabil tu va trebui sa le implementezi.

cu un __autoload() scris bine si cu respectarea unor nume pentru clase / fisiere si directoare nu mai ai nevoie de require* sau include*, tocmai asta e una dintre facilitatile oferite.
in manual nu se explica prea bine ce e cu __autoload asta, dar cu un search pe google te poti lamuri.
http://ro2.php.net/__autoload


astea sunt oricum doar parerile mele, capatate dupa cativa ani de programare in php.

apropos, te-ai prins cu eroarea aia?
Sus  
copot



Data înscrierii: 06/Apr/2005
Mesaje: 233
Locație: Undeva departe

Trimis: Joi Ian 12, 2006 3:30 pm    Titlul subiectului: Multam fain...  

Rezolvat cu eroarea.
Si cu __autoload, intr-adevar o conventie e necesara (clase-> nume fisiere). Desi practic o limitare exista.
Am rezolvat si problema asta.

Mersi mult de tot.
Sus  
PHPRomania Bot
Bot Member


Data înscrierii: 27/Dec/2007
Mesaje: 1
Locaţie: Server Google
Trimis: Mie Dec 26, 2007 7:01 pm   Titlul subiectului: Ad  

Sus  
 
       Pagina de start a forumului Forum PHP Romania - Discutii despre PHP, MySQL, Javascript, AJAX, etc -> PHP Avansat
Pagina 1 din 1


Powered by phpBB 2.0.22 © 2001, 2002 phpBB Group
Varianta în limba română: Romanian phpBB online community