MySQLi作为静态类

时间:2010-06-20 22:06:25

标签: php mysql oop mysqli

我有以下代码能够创建一个具有数据库对象的单个静态实例的类,以及两个用于行和列的静态函数。

<?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行

我一次又一次地检查它,一切似乎都是有序的,也许我在call()中有错误?

6 个答案:

答案 0 :(得分:1)

如果你的SQL语法出错,那会发生这种情况 - 你检查过它并确保没有错误吗?

我会进行错误检查,例如

if( self::$instance->error ) {
    // Handle error
}

答案 1 :(得分:0)

你传入一个名为$ db的变量到getRow(),也许这应该是一个表?

答案 2 :(得分:0)

如果SQL查询失败,

query()将返回false。您可以添加以下内容来处理此错误:

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

return $result->fetch_assoc();

答案 3 :(得分:0)

我已经尝试过此代码并且它可以正常工作,您必须在查询中出错。可能导致此错误的原因是:

  1. 检查您传递给Database::getRow()的内容。您的ID中可能包含一些非数字字符

  2. 检查列名'id'是否存在,这听起来很有趣,但它发生在我身上一百万次,我正在查询列'id'而不是'product_id'等等

  3. 检查表$db是否存在

  4. 确保不要因意外而切换功能参数。 Database::getRow(24, 'people');代替Database::getRow('people', 24);

  5. 我无法想到可能导致此错误的任何其他内容。

答案 4 :(得分:0)

public static function getRow($id,$table)
{
    $query = "SELECT * FROM ".$table." WHERE id=".$id." LIMIT 1";
    $result = $this->instance->query($query);
    return $result->fetch_assoc();
}

答案 5 :(得分:0)

这一行

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

有时会有奇怪的行为。检查isset()对null值是否有失败。试试这个:

private static $instance = null; // it defaults to null but hey, rather be on the sure side
// foo
if (self::$instance === null) {
// mysqli creation foo