2013-02-11 4 views
0

У меня есть это (от кого-то другого полученного из моей первой попытки в классе базы данных):MySQLi подключение к базе данных

require_once("declarations.php"); 

    class Database{    
     private static $mysqli; 
     private static $dbName = ''; 
     private static $username = ''; 
     private static $password = ''; 
     private static $host = 'localhost'; 
     private static $prefix = ''; 

     public function __construct(){ 
      if(self::$host & self::$username & self::$password & self::$dbName) 
      { 
       self::$mysqli = new mysqli(self::$host, self::$username, self::$password, self::$dbName); 

       if (self::$mysqli->connect_error) { 
       die('Connect Error (' . self::$mysqli->connect_errno . ') ' 
        . self::$mysqli->connect_error); 
       } 
      } 
      else 
      { 
       echo "You forgot to fill in your database connection details"; 
      } 
     } 

     public function Query($query){ 
      $query = self::$mysqli->real_escape_string($query); 

      if ($query = self::$mysqli->prepare($query)) { 
       $query->execute(); 
       $query->store_result();    


       $stmt = $query->result;   
       //$query->mysql_num_rows = $stmt->num_rows();     
       $query->close(); 
       return $stmt;     
      } 
     } 

     public function Close() 
     { 
      self::$mysqli->close(); 
     } 
    }      

Это, как я звоню его:

include_once("system/database.php"); 

    $query = "SELECT * FROM app";  
    $dbr = new Database(); 

    //Change this here since your method is query and not $mysqli 
    while($row = $dbr->Query($query)->fetch_object()){ 
     echo '<td>'. $row['id'] . '</td>' ; 
     echo '<td>'. $row['title'] . '</td>' ; 
    } 

    Database::Close(); 

я получаю ошибка Вызов функции-члена fetch_object() на не-объект в цикле while.

Любые идеи?

+1

Скорее всего, ваш запрос не удался, вы предположили, что это удалось, и теперь он взорван в вашем лице. НИКОГДА не связывайте вызовы db. ** ВСЕГДА ** проверяйте ошибки на каждом этапе. Скорее всего, это связано с тем, что вы закрыли соединение с БД, и в обработчиках mysqli нет результата '->. –

+0

Посмотрите на свою функцию 'Query()'. Он не возвращает никакого результата, если утверждение 'if' внутри не соответствует действительности. Поэтому вы не можете вызвать метод 'fetch_object()' для неопределенной переменной/объекта. – Val

ответ

0

fetch_object работает с результатом набора, возвращаемого после запроса выполняется с помощью методов, таких как: mysql_query или использовать FETCH_ASSOC вместо с

$query->execute(); 
$result = $query->get_result(); 
while ($myrow = $result->fetch_assoc()) { 
    //Your logic 
} 
+0

Итак, каков запрос $ перед использованием execute? – Jimmyt1988

+0

$ mysqli = new mysqli («127.0.0.1», «пользователь», «пароль», «мир»); $ query = $ mysqli-> stmt_init(); $ query-> prepare ("SELECT * FROM tablename"); $ Query-> Execute(); –

0

Ну, ваша первая попытка закончилась с полностью непригодным для использования кода.
Существует 2 критических разлома и один серьезный.

  1. Как я уже говорил, делать $query = self::$mysqli->real_escape_string($query); бесполезно и вредно сразу. Вы должны избавиться от этой линии. Полностью и навсегда.
  2. Подготовка запроса без обязательных переменных абсолютно бесполезна.
  3. Вы должны проверить наличие ошибок mysql.

Так, по крайней мере, ваша функция запроса() должны быть

public function query($query) 
{ 
    $res = self::$mysqli->query($query); 
    if (!$res) 
    { 
     throw new Exception(self::$mysqli->error); 
    } 
    return $res; 
} 

Но опять же - эта функция не является безопасным, как это не не осуществляет заполнители подменять данные в запросе.

Смежные вопросы