我正在使用PHP中的mysqli进入预备语句,以帮助防止SQL注入。我理解弹出命令不同步的情况,但这种情况似乎不是其中之一。这是一个代码段:
require_once("dbconnect.php")
$id = isset($_POST['g']) ? $_POST['g'] : false;
if ($id) {
$id_stmt = $mysqli->prepare("SELECT * FROM users WHERE id=?");
$id_stmt->bind_param("i", $id);
$id_res = $id_stmt->execute();
//FIX - per Jim's answer: Must store_result for the statement, so num_rows can be accurate.
$id_stmt->store_result();
if ($id_res && $id_stmt->num_rows > 0) {
//user exists, do stuff
$id_stmt->close();
processUser($id);
} else {
$id_stmt->close();
echo "Error, user ({$id}) doesn't exist.";
echo " Problem: ".$mysqli->stat;
}
}
以下是dbconnect的基础知识:
$mysqli = new mysqli("localhost", "user", "pass", "db_name");
if ($mysqli->connect_errno) {
echo "Failed to make database connection!";
die();
}
//This function is here so other files that connect to the DB can perform this common operation
function processUser($id) {
$global $mysqli;
$now = new DateTime();
$now_str = $now->format("Y-m-d H:i:s");
$set_modified_stmt = $mysqli->prepare("UPDATE users SET last_modified=? WHERE id=?");
$set_modified_stmt->bind_param("si", $now_str, $id);
$set_modified_res = $set_modified_stmt->execute();
$set_modified_stmt->close();
return $set_modified_res;
}
这是输出:
Error user (3) doesn't exist Problem: Commands out of sync; you can't run this command now
请注意,问题字符串由于某种原因不在$mysqli->error
而在$mysqli->stat
。任何想法可能是什么?这里有点蠢事,可能是我和我的代码。
编辑,这是第一个$mysqli
电话后的$id_stmt->execute()
个对象:
mysqli Object
(
[affected_rows] => -1
[client_info] => 5.5.33
[client_version] => 50533
[connect_errno] => 0
[connect_error] =>
[errno] => 0
[error] =>
[error_list] => Array
(
)
[field_count] => 5
[host_info] => Localhost via UNIX socket
[info] =>
[insert_id] => 0
[server_info] => 5.5.33
[server_version] => 50533
[stat] => Commands out of sync; you can't run this command now
[sqlstate] => HY000
[protocol_version] => 10
[thread_id] => 9
[warning_count] => 0
)
答案 0 :(得分:1)
您正在使用$mysqli->stat
(大概)检查错误。消息所指的可能就是这个电话。
使用$mysqli->error
代替显示上一个错误。
请参阅mysqli->error。
另外,请注意docs for num_rows上的消息:
返回结果集中的行数。 mysqli_stmt_num_rows()的使用取决于您是否使用mysqli_stmt_store_result()来缓冲语句句柄中的整个结果集。
在使用num_rows之前尝试调用store_result
:
$id_stmt->store_result();
答案 1 :(得分:0)
在准备下一个声明之前,您需要关闭第一个声明。在您的情况下,您需要在$id_stmt->close();
processUser();