"在非对象上调用成员函数fetch_assoc()"使用DB Singleton

时间:2014-04-01 23:35:07

标签: php mysqli

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

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

DatabaseConnection.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;
}

}

SkillController.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);
    }
}

的index.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 />");

?>

感谢任何帮助。我故意将这个作为我的网站的一部分作为源代码示例提供,这是我想要展示我作为开发人员的技能。不幸的是,我把我的大部分编码生涯花在了微软方面,所以所有这些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) 

2 个答案:

答案 0 :(得分:0)

执行查询的调用如果失败或没有要返回的数据,则返回false。这就是你的while()失败的原因。

答案 1 :(得分:0)

简单回答:我必须进入错误并找到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);
    }
}