Mysqli::query()期望参数2是长字符串


mysqli::query() expects parameter 2 to be long, string given

我正在创建一个自定义购物车,我正在构建一个查询,该查询以检索我刚刚保存到购物车表中的session_id开始。我知道这个值被保存了,我在mysql命令行运行这个查询,它返回的正是我需要的,但我没有得到的值进入$cart_id。还有其他的INSERT查询上面和下面的这一点在脚本中,所以我知道我连接到数据库只是很好。

//Get cart id
$cart_id_select_q = "SELECT c.id FROM carts AS c WHERE c.user_session_id='$uid'";
$cart_id = $mysqli->query($conn, $cart_id_select_q);
echo "<pre>Debug: $cart_id_select_q</pre>";
if ( !$cart_id ) {
  printf("error: %s'n", mysqli_error($conn));
}
else {
  echo 'get session id from cart: execute success';
  print_r($cart_id);
  var_dump($cart_id);
}

我也在VPS服务器上,错误被抑制,而不是我没有得到mysqli_error在浏览器中显示,但我在我的error_log中得到以下2个警告。

[29-Jul-2011 09:29:24] PHP Warning:  mysqli::query() expects parameter 2 to be long, string given in /home/sopadmin/public_html/dev/cart.php on line 89
[29-Jul-2011 09:29:24] PHP Warning:  mysqli_error() expects parameter 1 to be mysqli, null given in /home/sopadmin/public_html/dev/cart.php on line 92

我也尝试使用mysqli_num_rows()和fetch_assoc(),但没有帮助。$cart_id仍然为空,我不知道如何在这个服务器配置中检索mysql错误。在玩弄了一整晚之后,在这里发帖是最后的手段。

我应该注意,我刚刚开始真正使用新的mysqli扩展,我也开始以更面向对象的方式编写代码。但我通常是从程序编码开始,然后在设计完成后创建类。但这只是对我的经验水平的评论,我不明白的是为什么这个查询在我的脚本中没有返回一个值。

当使用面向对象的mysqli API时,你不需要(事实上你不能)传递一个连接作为第一个参数。

This: $cart_id = $mysqli->query($conn, $cart_id_select_q);

应为:$cart_id = $mysqli->query($cart_id_select_q);

和这个:printf("error: %s'n", mysqli_error($conn));

应为:printf("error: %s'n", mysqli->error);

我不知道$conn是什么(看起来像一个字符串),但它肯定不是一个MySQLi连接对象。

避免这种失败的简单示例:

/* Select queries return a resultset */
$result = $mysqli->query("SELECT Name FROM City LIMIT 10");
if (!is_null($result)) {
    printf("Select returned %d rows.'n", $result->num_rows);
    /* free result set */
    $result->close();
} else {
    error_log("Mysql query failed" . $mysqli->error);
}