簡體   English   中英

PHP-MySQLi准備的更新語句引發錯誤

[英]PHP - MySQLi Prepared Update Statement Throwing Errors

編碼:

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語句。 我無法解決該問題。

導致函數失敗的語法錯誤或問題是什么?

最好知道,如果$iptme的值返回false,則查詢失敗。 但是您是否知道可以在收到致命錯誤或嘗試將false用作語句資源的警告之前對此進行測試? 並且您知道您可以查詢MySQL錯誤消息嗎?

每當您prepare()execute()查詢時,請使用API​​來獲取錯誤消息:

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

...

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

在准備或執行期間可能會發生錯誤,因此在兩種情況下都必須測試返回值。

或者,可以使mysqli在prepare或execute發生錯誤時引發異常,因此您不必編寫重復代碼來檢查返回值。 參見http://php.net/manual/en/mysqli-driver.report-mode.php

PS:如果您使用綁定參數, 請不要使用mysqli_real_escape_string()。 您將在SQL查詢中輸入文字\\字符。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM