ошибки с mysqli и его наследованием - PullRequest
0 голосов
/ 17 сентября 2011

Ну, я попытался расширить класс mysqli с его наследованием, называемым Database, который может легко извлекать информацию из базы данных (в одну строку, если все сделано правильно).Пока это не работает, так как я получаю следующие ошибки:

Вот класс базы данных, как определено:

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

}

И вот как я запускаю его из скриптаfile:

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

Я немного запутался, так как не могу понять,способ решить эту проблему.Может кто-нибудь из вас, пожалуйста, помогите?Я очень ценю это.

Спасибо

Ответы [ 2 ]

0 голосов
/ 17 сентября 2011

В дополнение к тому, что сказал xdazz, вы также смешиваете «наследует от» и «использует» шаблоны: у вас есть экземпляр mysqli с именем $this->mysql и $this, унаследованный от parent:: mysqli. Вы должны выбрать один из них, но не использовать оба. Если вы хотите, чтобы пользователь вашего класса мог делать с ним все, что он может делать с обычным экземпляром mysqli (включая сам вызов всех методов суперкласса), используйте наследование. Если вы хотите ограничить варианты использования, используйте переменную экземпляра типа mysqli и удалите наследование. Затем вы можете выборочно прокси-методы внутреннего $this->mysql, чтобы позволить пользователям вызывать их.

0 голосов
/ 17 сентября 2011

fecth_array() - это не метод mysqli, а класс MySQLi_STMT.

И вы не должны так проектировать, вы делаете то, что extend mysqli, но вы также делаете $this->mysql = new mysqli(...), между is-A и has-A, вы должны просто выбрать один. Я рекомендую has-A.

...