2011-09-17 17 views
0

私はデータベースmysqliの継承をデータベースから呼び出すことができました。データベースの情報を簡単に(1行で正しく実行すると)検索できます。私は次のエラーを取得していますように、それは、これまでのところうまくいかない:mysqliとその継承でのエラー

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; 
    } 

} 

そして、これは私がスクリプトファイルからそれを実行方法です:定義されている。ここ

は、Databaseクラスです

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"); 

それは動作しませんでした、と私は次の警告やエラーメッセージました: コード:

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 
を210

私はこの問題を解決する方法を見つけ出すことができないので、少し混乱しています。あなたの誰かが助けてくれますか? Idはそれを非常に感謝します。

答えて

0

fecth_array()mysqliの方法が、MySQLi_STMTクラスではありません、ありがとうございました。

そして、あなたがそのように設計してはならない、あなたはextend mysqliということをやっているが、あなたはまた、is-Ahas-A間、$this->mysql = new mysqli(...)を行い、あなただけのいずれかを選択しなければなりません。私はhas-Aをお勧めします。

0

さらに何xdazzとするには、あなたはまた、「から継承」やパターン「を使用」混合されている:あなたはparent:: mysqliのから継承された、$this->mysqlなど$thisという名前のmysqliのインスタンスを持っています。どちらか一方を選択し、両方を使用しないでください。クラスのユーザが通常のmysqliインスタンス(すべてのスーパークラスメソッドを自分自身で呼び出すことを含む)で行うことができるようにするには、継承を使用します。ユースケースを制限する場合は、タイプ変数mysqliを使用して継承を削除します。その後、内部のメソッドを選択的に代理して、ユーザーが呼び出すことができるようにすることができます。$this->mysql

+0

私の答えはちょうど置き換えられました、xdazzはこれも同様に言っています... –