MySQLi как статический класс - PullRequest
1 голос
/ 21 июня 2010

У меня есть следующий код, который может создать класс с одним статическим экземпляром объекта базы данных и двумя статическими функциями для строк и столбцов.

<?php class Database{

    private static $instance;

    private function __construct() {}
    private function __clone(){}

    public static function call(){
        if(!isset(self::$instance)){  
            self::$instance = new MySQLi("localhost", "foo", "bar", "fizz");  
            if(self::$instance->connect_error){  
                throw new Exception('Error MySQL: ' . self::$instance->connect_error);  
            }  
        } 
        return self::$instance;
    }

    public static function getRow($id, $db){
        $query = "SELECT * FROM ".$db." WHERE id=".$id;
        $result = self::call()->query($query);
        return $result->fetch_assoc();
    }
} ?>

Однако, когда я вызываю getRow из другого класса, вот так

$data = Database::getRow($id, "posts");

Я получаю следующую ошибку:

Неустранимая ошибка: вызов функции-члена fetch_assoc () для необъекта в database.php по линии 27

И я проверяю это снова и снова, и все, кажется, в порядке, может быть, у меня есть ошибка в вызове ()?

Ответы [ 6 ]

1 голос
/ 21 июня 2010

Это произойдет, если у вас есть ошибка в синтаксисе SQL - вы проверили ее и убедились, что ошибок нет?

Я бы проверил ошибки, что-то вроде

if( self::$instance->error ) {
    // Handle error
}
0 голосов
/ 04 сентября 2014

эта строка

if(!isset(self::$instance)){  

иногда будет вести себя странно. проверка isset () по нулевому значению подвержена ошибкам. попробуйте это:

private static $instance = null; // it defaults to null but hey, rather be on the sure side
// foo
if (self::$instance === null) {
// mysqli creation foo
0 голосов
/ 04 сентября 2014
public static function getRow($id,$table)
{
    $query = "SELECT * FROM ".$table." WHERE id=".$id." LIMIT 1";
    $result = $this->instance->query($query);
    return $result->fetch_assoc();
}
0 голосов
/ 21 июня 2010

Я пробовал этот код, и он работает, у вас должна быть ошибка в запросе. Что может вызвать эту ошибку:

  1. Проверьте, что вы передаете Database::getRow(). В вашем идентификаторе могут быть некоторые нечисловые символы

  2. Проверьте, существует ли имя столбца 'id', это звучит забавно, но это происходило со мной миллион раз, я запрашивал столбец 'id' вместо 'product_id' и т. Д.

  3. Проверьте, существует ли таблица $db

  4. Убедитесь, что вы не переключили параметры функции случайно. Database::getRow(24, 'people'); вместо Database::getRow('people', 24);

Я не могу думать ни о чем другом, что может вызвать эту ошибку.

0 голосов
/ 21 июня 2010

query() вернет false в случае сбоя SQL-запроса. Вы можете добавить следующее для обработки этой ошибки:

$result = self::call()->query($query)
if($result === false)
    throw new Exception(call()->error); // throw exception, use MySQLi error as message

return $result->fetch_assoc();
0 голосов
/ 21 июня 2010

Вы передаете переменную с именем $ db в getRow (), может быть, это должна быть таблица?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...