我之前提出了一个问题并添加了赏金,但是我把错误的代码我刚才意识到了。
$getgames = $db->prepare("SELECT `id`, `name`, `picture` FROM `games` WHERE `status` = '1' ORDER BY `id` ASC");
$getgames->execute();
$getgames->bind_result($gid, $name, $picture);
while($getgames->fetch()){
$getgames->free_result();
$gettokens = $db->prepare("SELECT SUM(`amount`) AS `tokenamount` FROM `tokens` WHERE `game` = ? AND `user` = ?");
$gettokens->bind_param('ii', $gid, $sesid);
$gettokens->execute();
$gettokens->bind_result($tokenamount);
$gettokens->fetch();
此代码正确返回第一行,但是第二行没有显示它并返回以下错误。
Fatal error: Uncaught exception 'mysqli_sql_exception' with message 'Attempt to read a row while there is no result set associated with the statement'
它引用的行是$getgames->execute();
的行。
free_result是错误的?我还在学习MySQLi所以我有很多问题。
更新:
当我删除$getgames->free_result();
时,我收到Commands out of sync; you can't run this command now
的新错误。在$getgames->bind_result($gid, $name, $picture);
答案 0 :(得分:1)
SELECT查询将始终返回结果集。事情是这样的。它可以为空,但始终存在,除非执行期间出错。但是如果有的话,错误会因准备或执行调用而产生不同。即使从空表中选择也会返回结果集。
这会为当前代码不可能呈现上述错误消息。
这意味着此错误是由其他一些代码引起的。这里有正确问题的问题。正确提问的问题始终包含完整错误消息,包括文件名,行号和堆栈跟踪。以及来自OP的注释,指向发布代码中的行,在错误消息中提到。如果OP遵循这个简单的规则,他们会发现错误是由其他一些代码引起的。
从编辑过的代码开始,像这样更改
$getgames->execute();
$getgames->store_result();
$getgames->bind_result($gid, $name, $picture);
while($getgames->fetch()){
$gettokens = $db->prepare( ...
或更好地在一个查询中进行
SELECT `id`, `name`, `picture`, SUM(`amount`) AS `tokenamount`
FROM `games` g JOIN tokens t ON t.game = g.id
WHERE `status` = '1' AND `user` = ?