我正在开发一个小型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)
答案 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);
}
}