“调用非对象上的成员函数 fetch_assoc()”使用 DB Singleton


"Call to a member function fetch_assoc() on a non-object" using DB Singleton

我正在开发一个小的API,为我的个人网站抽象一个个人数据库。我决定最好的做法是对数据库连接使用单一实例,然后为我要从中获取值的每个表创建控制器。对于另一个Call to a member function fetch_assoc() on a non-object问题,我深表歉意,但我还没有看到第一个调用有效然后在后续调用中失败的问题。为了证明这一点,我调用了相同的方法两次。它工作一次,之后给了我可怕的错误。

我认为这可能与单例对象有关——也许连接在调用后关闭?或者,如果要重用该对象,也许我没有正确关闭当前查询?在代码上:

数据库连接.php

include_once('./helpers/Config.php');
class DatabaseConnection{
private static $instance;
private function __construct(){}
private function __clone() { }
public static function getInstance()
{
    if(!isset(self::$instance))  
    {
        self::$instance = new MySQLi(Config::$database_hostname, Config::$database_user, Config::$database_password, Config::$database_name);
        if(self::$instance->connect_error)
            throw new Exception('MySQL connection failed: '.self::$instance->connect_error);
    }
    return self::$instance;
}

}

技能控制器.php

include_once('./singletons/DatabaseConnection.php');
include_once('./helpers/JsonConverter.php');
include_once('./models/Skill.php');
class SkillController extends JsonConverter
{
    public function getAllItems()
    {
        $i = 0;
        $results = array();
        $sqlResult = DatabaseConnection::getInstance()->query("CALL S_SKILLS");
        while($row = $sqlResult->fetch_assoc())
        {
            $results[$i] = new Skill($row['Title'], $row['Ranking']);
            $i++;
        }
        return $this->toJson($results);
    }
}

索引.php

<?php
include_once("controllers/SkillController.php");
print "Controller: ".$_GET['controller']."<br/>";
print "ID: ".$_GET['id']."<br/>";
$test = new SkillController();
echo($test->getAllItems()."<br />");
echo($test->getAllItems()."<br />");
?>

任何帮助,不胜感激。我故意使这比将来作为源代码示例作为我网站的一部分提供的源代码示例更难,我想展示我作为开发人员的技能。不幸的是,我大部分的编码生涯都在Microsoft的一边度过,所以所有这些PHP的麻烦都对我造成了沉重的打击。

编辑以下是要index.php的输出(截断):

Controller: 
ID: 
object(mysqli_result)#3 (0) { } [{"Title":"HTML5","Ranking":"9999"},{"Title":"CSS","Ranking":"200"},{"Title":"JavaScript","Ranking":"200"},{"Title":"C#","Ranking":"190"},...,{"Title":"IBM 360 Assembly","Ranking":"25"},{"Title":"Python","Ranking":"25"}]
bool(false) 
如果执行

查询失败或没有要返回的数据,则执行查询的调用将返回false。这就是为什么你的while()失败了。

简单的答案:我不得不进入错误并找到Commands out of sync; you can't run this command now.我发现存储过程会返回两个结果 - 我想。无论如何,这是解决方案。感谢@staticsan带领我。

class SkillController extends JsonConverter
{
    public function getAllItems()
    {
        $i = 0;
        $results = array();
        $sqlResult = DatabaseConnection::getInstance()->query("CALL S_SKILLS");
        if($sqlResult)
        {
            while($row = $sqlResult->fetch_assoc())
            {
                $results[$i] = new Skill($row['Title'], $row['Ranking']);
                $i++;
            }
            $sqlResult->close();
            DatabaseConnection::getInstance()->next_result();
        }
        return $this->toJson($results);
    }
}