我有这个PHP Prepared语句代码:
/* Register a prepared statement */
if ($stmt = $mysqli->prepare('UPDATE house_room1 SET rotation = (rotation + 1) % 4 WHERE ref_id = ?')) {
/* Bind parametres */
$stmt->bind_param('i', $item_number);
/* Execute the query */
$stmt->execute();
/* Bind results */
$stmt->bind_result($rotation);
/* Fetch it */
$stmt->fetch();
/* Close statement */
$stmt->close();
} else {
/* Something went wrong */
echo 'Something went terribly wrong' . $mysqli->error;
}
问题是我收到错误说:
mysqli_stmt::bind_result(): Number of bind variables doesn't match number of fields in prepared statement in /blablabla/bla/database/update_settings_rotate.php on line 21
第21行是绑定结果的地方。
好吧,所以我猜这与旋转等于某事并且没有出现在"?"这有关。它通常应在准备好的陈述中。我尝试改变它,但仍然存在错误。我不认为当它变为变量时它会知道rotation
等于什么,否则它不会让我将参数绑定为整数,因为我正在划分。即使它总是一个真实的数字。有任何想法吗? HM
我认为在更新声明时绑定结果存在一些问题,但我不知道如何以任何方式解决这个问题?有没有更好的方法?
答案 0 :(得分:0)
在更新查询中使用括号
if ($stmt = $mysqli->prepare('UPDATE house_room1 SET rotation = ((rotation + 1) % 4) WHERE ref_id = ?')) {
答案 1 :(得分:0)
试试这个
/* Register a prepared statement */
if ($stmt = $mysqli->prepare('UPDATE house_room1 SET rotation = (rotation + 1) % 4 WHERE ref_id = :val')) {
/* Bind parametres */
$stmt->bind_param(':val', $item_number);
/* Execute the query */
$stmt->execute();
/* Bind results */
$stmt->bind_result($rotation);
/* Fetch it */
$stmt->fetch();
/* Close statement */
$stmt->close();
} else {
/* Something went wrong */
echo 'Something went terribly wrong' . $mysqli->error;
}
答案 2 :(得分:0)
原始代码没有太大错误。我还没有更改您的更新查询。 您遇到的问题是尝试从“更新”中读取更新后的值。言。
不是漂亮的代码,我已经留下了一些调试代码。我对语法很迂腐。所有的反引号都是多余的。我没有使用所有变量,例如' allOk'。我在调试/检查代码时更早地使用了它们。
它经过测试,适用于Windows XP上的PHP 5.3.18,mysql 5.5.16。
它更新数据库,然后显示更新的值。
<?php
/* Q22377771 :
/* */
// new connection
$db = new mysqli('localhost', 'test', 'test', 'testmysql');
// ref_id of row to update...
$item_number = 1;
// the update statement
$stmt = $db->prepare('UPDATE `house_room1` SET `rotation` = (`rotation` + 1) % 4 WHERE `ref_id` = ?');
echo '<br/>prepare error: ', $db->errno, ' : ', $db->error, '<br/>';
/* Bind parametres */
$stmt->bind_param('i', $item_number);
// execute the update..
if ($allOk = $stmt->execute()) {
if ($db->affected_rows >= 1) {
echo '<br/>record updated!<br/>';
}
else {
echo '<br/>record NOT updated!<br/>';
}
}
else{
var_dump($db->affected_rows, $stmt->affected_rows, $allOk. $db->sqlstate, $stmt->sqlstate);
echo 'update error', $db->errno, ' : ', $db->error, '<br/>';
}
/* Close statement */
$stmt->close();
unset($stmt);
/* -------------------------------------------------------
* Now read the row so that we can get the rotation value
*/
// result in here...
$rotation = -1;
// the query statement
$stmt = $db->prepare('select `rotation` FROM `house_room1` WHERE `ref_id` = ?');
echo '<br/>prepare error: ', $db->errno, ' : ', $db->error, '<br/>';
/* Bind parametres */
$stmt->bind_param('i', $item_number);
$allOk = $stmt->execute();
/* Bind results */
$stmt->bind_result($rotation);
/* Fetch it */
$stmt->fetch();
// show result...
var_dump('rotation : '. $rotation);
/* Close statement */
$stmt->close();
$db->close();
?>