假设我有一份准备好的声明。它准备的查询无关紧要。我取得上面的结果(我无法显示实际代码,因为这是我不想炫耀的。请专注于问题,而不是示例无意义)我得到了
致命错误:在...中的非对象上调用成员函数bind_param()。在被调用对象中引起的错误。
<?php
$mysqli = new mysqli(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME);
class table2Info{
private $mysqli;
public function __construct($_mysqli){
$this->mysqli = $_mysqli;
}
public function getInfo($id)
{
$db = $this->mysqli->prepare('SELECT info FROM table2 WHERE id = ? LIMIT 1');
$db->bind_param('i',$db_id);
$db_id = $id;
$db->bind_result($info);
$db->execute();
$db->fetch();
$db->close();
return $info;
}
}
$t2I = new table2Info($mysqli);
$stmt->prepare('SELECT id FROM table1 WHERE name = ?');
$stmt->bind_param('s',$name);
$name = $_GET['name'];
$stmt->bind_result($id);
$stmt->execute();
while($stmt->fetch())
{
//This will cause the fatal-error
echo $t2I->getInfo($id);
}
$stmt->close();
?>
问题是:有没有办法做另一个准备好的陈述,而另一个仍在开放?它会简化我的代码。我不能用SQL JOIN或类似的东西解决这个问题,它必须是这样的。现在我在数组中收集获取的数据并在$stmt->close();
之后循环遍历它,但这不是一个好的解决方案。当一个更好时,我为什么要做两个循环?
答案 0 :(得分:0)
从您收到的错误中看来,您的陈述准备失败了。 mysqli::prepare
会在失败时返回MySQLi_STMT
个对象或false
。
检查导致错误的语句准备中的返回值。如果它是假的,您可以通过查看mysqli::error
来查看更多详细信息。