“命令不同步;您现在无法运行此命令”第一次查询时出错?

时间:2014-03-28 15:02:02

标签: php mysqli

我正在使用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
)

2 个答案:

答案 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();