2011-09-17 6 views
0

Eh bien j'ai essayé d'étendre la classe mysqli avec son héritage appelé base de données, qui peut facilement récupérer des informations de base de données (dans une ligne si c'est fait correctement). Il ne fonctionne pas à ce jour, que je reçois les erreurs suivantes:erreurs avec mysqli et son héritage

Voici la classe de base de données tel que défini:

class Database extends mysqli{ 
    private $select, $create, $insert, $alter, $update, $delete, $drop; 
    protected $mysql, $result, $table, $column, $where, $value, $limit, $order, $type; 

    public function __construct($host, $user, $pass, $db){ 
    $this->mysql = new mysqli($host, $user, $pass, $db) 
      or die("Error connecting to the database {$db}"); 

    } 

    public function __destruct(){ 
    $this->mysql->close(); 
    } 

    protected function prepareQuery(){ 
    if ($prepare = $this->mysqli->prepare($this->query)) { 
     trigger_error("Problem preparing query ($this->query) ".$this->mysqli->error, E_USER_ERROR); 
    } 
    return $prepare; 
    } 

    protected function reset(){ 
    unset($this->table); 
    unset($this->column); 
    unset($this->where); 
    unset($this->value); 
    unset($this->limit); 
    unset($this->order); 
    } 

    public function select($column){  
    $this->select = implode(",", $column); 
    return $this; 
    } 

    public function table($table){ 
    $this->table = $table; 
    return $this; 
    } 

    public function where($where, $comparison = "=", $logic){ 
    $i = 0; 
    foreach ($where as $col => $val){ 
     $wherestring .= (is_array($comparison)) ? " {$col} {$comparison[$i]} '{$val}'" : " WHERE {$col} {$comparison} '{$val}'"; 
     $wherestring .= ($i < (count($where)-1))?" {$logic[$i]}" :" "; 
     $i++; 
    } 
    $this->where = $wherestring; 
    return $this; 
    } 

    public function limit($limit){ 
    $this->limit = $limit; 
    return $this; 
    } 

    public function order($order){ 
    $this->order = $order; 
    return $this; 
    } 

    public function runquery($method){ 
    $query = "{$method} {$this->select} FROM {$this->table}"; 
    if(!empty($this->where)) $query .= " WHERE {$this->where}"; 
    if(!empty($this->limit)) $query .= " LIMIT {$this->limit}"; 
    if(!empty($this->order)) $query .= " ORDER BY {$this->order}"; 
    echo "The generated Query is: \n".$query; 
    $this->result = parent::query($query); 
    $result = parent::fetch_array($this->result); 
    return $result; 
    } 

} 

Et c'est la façon dont je le lance à partir d'un fichier de script:

include("inc/config.php"); 
include("classes/class_data.php"); 

$db = new Database($dbhost, $dbuser, $dbpass, $dbname); 
$row = $db->select(array("password","email"))->table($prefix."users")->where(array("uid"=>1, "username"=>Admin"),array("=","="),array("AND"))->limit(2)->order("uid")->runquery("SELECT"); 

Il ne fonctionne pas, et j'ai l'avertissement suivant et les messages d'erreur: code:

Warning: mysqli::query() [mysqli.query]: Couldn't fetch Database in classes/class_data.php on line 70 
Fatal error: Call to undefined method mysqli::fetch_array() inclass_data.php on line 71 

Je suis un peu confus maintenant car je n'arrive pas à trouver un moyen de résoudre ce problème. Quelqu'un d'entre vous peut-il aider? Je l'apprécie beaucoup.

Merci

Répondre

0

fecth_array() est pas la méthode de mysqli mais la classe MySQLi_STMT.

Et votre ne devrait pas concevoir comme ça, vous faites chose qui extend mysqli, mais vous faites aussi $this->mysql = new mysqli(...), entre is-A et has-A, vous devez simplement choisir un. Je recommande has-A.

0

En plus de ce que xdazz dit, vous mélangez aussi les « hérite de » et les « usages » motifs: vous avez une instance nommée mysqli $this->mysql ainsi que $this, héritée de la parent:: mysqli. Vous devriez choisir l'un ou l'autre mais ne pas utiliser les deux. Si vous voulez que l'utilisateur de votre classe puisse faire tout ce qu'elle peut avec une instance mysqli normale (y compris appeler elle-même toutes les méthodes de la super-classe), utilisez l'héritage. Si vous souhaitez restreindre les cas d'utilisation, utilisez une variable d'instance de type mysqli et supprimez l'héritage. Vous pouvez ensuite sélectivement proxy méthodes de l'intérieur $this->mysql pour permettre aux utilisateurs de les appeler.

+0

Oh, ma réponse vient d'être remplacée, xdazz le dit aussi ... –