我有以下代码能够创建一个具有数据库对象的单个静态实例的类,以及两个用于行和列的静态函数。
<?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()中有错误?
答案 0 :(得分:1)
如果你的SQL语法出错,那会发生这种情况 - 你检查过它并确保没有错误吗?
我会进行错误检查,例如
if( self::$instance->error ) {
// Handle error
}
答案 1 :(得分:0)
你传入一个名为$ db的变量到getRow(),也许这应该是一个表?
答案 2 :(得分:0)
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)
我已经尝试过此代码并且它可以正常工作,您必须在查询中出错。可能导致此错误的原因是:
检查您传递给Database::getRow()
的内容。您的ID中可能包含一些非数字字符
检查列名'id'
是否存在,这听起来很有趣,但它发生在我身上一百万次,我正在查询列'id'
而不是'product_id'
等等} p>
检查表$db
是否存在
确保不要因意外而切换功能参数。 Database::getRow(24, 'people');
代替Database::getRow('people', 24);
我无法想到可能导致此错误的任何其他内容。
答案 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