首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

PHP MySQL UPDATE 失敗無報錯:單引號缺失與預處理最佳實踐

     編輯:程式設計綜合問答

問題代碼

$sql = "UPDATE user SET u_name=$name,u_phone=$phone,u_email=$email WHERE id='$UID'";

字符串字段 $name、$phone、$email 未加單引號,導致 SQL 語法錯誤,但 mysqli_query 返回 false 卻未觸發彈出錯誤信息。

修正方案

方案一:手動加引號(不推薦,有注入風險)

$sql = "UPDATE user SET u_name='$name', u_phone='$phone', u_email='$email' WHERE id='$UID'";

方案二:mysqli 預處理語句(推薦,防注入)

$stmt = $conn->prepare("UPDATE user SET u_name=?, u_phone=?, u_email=? WHERE id=?");
$stmt->bind_param("sssi", $name, $phone, $email, $UID);
if ($stmt->execute()) {
    echo "修改成功";
} else {
    echo "修改失敗: " . $stmt->error;
}
$stmt->close();

方案三:PDO(更通用)

$pdo = new PDO("mysql:host=localhost;dbname=records", "root", "");
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$stmt = $pdo->prepare("UPDATE user SET u_name=?, u_phone=?, u_email=? WHERE id=?");
$stmt->execute([$name, $phone, $email, $UID]);

為什麼原代碼「無報錯」?

  • mysqli_query 失敗返回 false,但代碼只判斷 if (mysqli_query(...)),未打印 mysqli_error($conn)。
  • 建議開啟彈出模式:mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT); 讓錯誤直接拋出異常。

檢查清單

  1. 變量 $UID 是否正確獲取($_GET['ID'] vs $_POST['ID'])。
  2. 表名、字段名大小寫是否與數據庫一致。
  3. 主鍵 id 類型是否為整數,WHERE id='$UID' 隱式轉換可能導致索引失效。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved