Avatar billede mrfunder Nybegynder
05. april 2007 - 13:27 Der er 2 kommentarer

Fejl i sql class - cannot acces private property

Hej eksperter. Jeg er igang med at lave en mysql class, men ved test får jeg fejlen:

Fatal error: Cannot access protected property DB_MysqlStatement::$result in C:\Server\www\cache\lib\DB_Mysql.php on line 52

Umiddelbart kan jeg ikke selv se hvor fejlen ligger. Jeg er relativ ny i OO Programmering.


---------test.php--------------------
<?php
require "lib/DB_Mysql.php";
$dbh = new DB_Mysql("brugernavn","kodeord","localhost","database");
$query = "SELECT * FROM users WHERE user_id = '1'";
$stmt = $dbh->execute($query);
?>
---------DB_Mysql.php-----------------
<?php
class DB_Mysql {

    protected $user;
    protected $pass;
    protected $dbhost;
    protected $dbname;
    protected $dbh;        // Database connection handle
   
    public function __construct($user, $pass, $dbhost, $dbname) {
        $this->user = $user;
        $this->pass = $pass;
        $this->dbhost = $dbhost;
        $this->dbname = $dbname;
    }
   
    protected function connect() {
        $this->dbh = mysql_pconnect($this->dbhost, $this->user, $this->pass);
        if(!is_resource($this->dbh)) {
            throw new Exception;
        }
        if(!mysql_select_db($this->dbname, $this->dbh)) {
            throw new Exception;
        }
    }
   
    public function execute($query) {
        if(!$this->dbh) {
            $this->connect();
        }
        $ret = mysql_query($query, $this->dbh);
        if(!$ret) {
            throw new Exception;
        }
        else if(!is_resource($ret)) {
            return true;
        } else {
            $stmt = new DB_MysqlStatement($this->dbh, $query);
            $stmt->result = $ret;
            return $stmt;
        }
    }
}

class DB_MysqlStatement {
   
    protected $result;
    public $query;
    protected $dbh;

    public function __construct($dbh, $query) {
        $this->query = $query;
        $this->dbh = $dbh;
        if(!is_resource($dbh)) {
            throw new Exception("Din database connection er ikke gyldig");
        }
    }
   
    public function fetch_row() {
        if(!$this->result) {
            throw new Exception("Din query-forespørgsel blev ikke fuldført");
        }
        return mysql_fetch_row($this->result);
    }
   
    public function fetch_assoc() {
        return mysql_fetch_assoc($this->result);
    }

    public function fetchall_assoc() {
        $retval = array();
        while($row = $this->fetch_assoc()) {
        $retval[] = $row;
        }
        return $retval;
    }
}
?>
Avatar billede erikjacobsen Ekspert
05. april 2007 - 13:39 #1
Det er ikke lige i linie 52 som vi ser det, men
      $stmt->result = $ret;
henviser jo ikke til en public  $result i den anden klasse. Jeg ville nok tage den med i constructoren.
Avatar billede windcape Praktikant
06. april 2007 - 00:46 #2
Derudover er det et utrolig dårligt class-layout. Hvis du agter at bruge OOP ordenlig, kan jeg anbefale at f.eks. kigge på følgende eksempel

http://dragons-lair.org/module/repository/PHP/DB/

Iterators er dejlige ;)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester