PHP - MySQLi准备更新语句抛出错误

时间:2014-08-28 22:24:09

标签: php mysqli sql-update prepared-statement

代码:

function getRealIpAddr()
{
    if (!empty($_SERVER['HTTP_CLIENT_IP']))   //check ip from share internet
    {
      $ip=$_SERVER['HTTP_CLIENT_IP'];
    }
    elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR']))   //to check ip is pass from proxy
    {
      $ip=$_SERVER['HTTP_X_FORWARDED_FOR'];
    }
    else
    {
      $ip=$_SERVER['REMOTE_ADDR'];
    }
    return $ip;
}
/* ^^^ taken from http://roshanbh.com.np/2007/12/getting-real-ip-address-in-php.html */
$time=(string) time();
$ip=getRealIpAddr();
$username=mysqli_real_escape_string($connect, $_POST['Username']);
//$pwcde is defined as a hashed password from a form
$iptme=mysqli_prepare($connect, "UPDATE users SET ip_last=?, time_last=? WHERE username=? AND password=?");
mysqli_stmt_bind_param($iptme, "ssss", $ip, $time, $username, $pwcde);
mysqli_stmt_execute($iptme);

当这段代码运行时,我得到:

  

警告:mysqli_stmt_bind_param()期望参数1为   mysqli_stmt,在......中给出的布尔值。

     

警告:mysqli_stmt_execute()期望参数1为mysqli_stmt,   布尔值在......中给出。

这显然意味着mysqli_prepare失败(返回false)。我知道连接是好的,因为它之前的其他语句运行良好。但这是唯一一个带有2个SET字段的UPDATE语句。我无法找到问题的解决方案。

导致函数失败的语法错误或问题是什么?

1 个答案:

答案 0 :(得分:1)

如果$iptme获取值false,则您知道查询失败,这很好。但是,您是否知道在收到致命错误或警告尝试使用false作为语句资源之前,您可以对此进行测试?你知道你可以查询MySQL错误信息吗?

每当您prepare()execute()查询时,请使用API​​获取错误消息:

if (!($iptme=mysqli_prepare($connect, ...))) {
  die($connect->error);
}

...

if (!mysqli_stmt_execute($iptme)) {
    die($iptme->error);
}

错误可能在准备或执行期间发生,因此您必须在两种情况下测试返回值。

或者,您可以启用mysqli在准备或执行时发生错误时抛出异常,因此您不必编写重复代码来检查返回值。见http://php.net/manual/en/mysqli-driver.report-mode.php

PS:如果你使用绑定参数,不要使用mysqli_real_escape_string()。您将在SQL查询中添加文字\个字符。