 |
Forum PHP Romania - Discutii despre PHP, MySQL, Javascript, AJAX, etc Comunitatea PHP Romania
|
| 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 |
|
| |
|