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

PHP 字符串拼接錯誤:mysql_query 中變量拼接導致的資源無效問題

     編輯:程式設計綜合問答

在 PHP 開發中,字符串拼接是基礎操作,但新手常混淆拼接運算符。本文通過一個實際案例,分析 mysql_query 中因使用 + 而非 . 導致的「supplied argument is not a valid MySQL result resource」錯誤,並提供正確寫法與最佳實踐。

錯誤代碼現場

mysql_select_db($database_member, $member);
$dizhi = mysql_query("SELECT * FROM member WHERE username like '"+ $row_Recordset1['articles_author'] +"'");
$row = mysql_fetch_array($dizhi);
// 報錯:mysql_fetch_array(): supplied argument is not a valid MySQL result resource

錯誤原因深度解析

PHP 中的字符串拼接運算符

  • .(點號):字符串拼接運算符,如 "abc" . "def" 結果為 "abcdef"
  • +(加號):數學加法運算符,當用於字符串時會嘗試將字符串轉換為數字進行運算

具體發生了什麼

代碼中:

"SELECT * FROM member WHERE username like '"+ $row_Recordset1['articles_author'] +"'"

PHP 會將整個表達式視為數學運算:

  1. 字符串 "SELECT * FROM member WHERE username like '" 轉換為數字 → 0
  2. $row_Recordset1['articles_author'] 若為字符串(如 "john")也轉為 0
  3. 字符串 "'" 轉為 0
  4. 最終結果:0 + 0 + 0 = 0(整數)

mysql_query(0) 會執行失敗並返回 false,隨後 mysql_fetch_array(false) 觸發錯誤。

正確寫法

$dizhi = mysql_query("SELECT * FROM member WHERE username like '". $row_Recordset1['articles_author'] ."'");

使用 . 進行字符串拼接,生成正確的 SQL 語句:

SELECT * FROM member WHERE username like 'john'

進階建議:使用預處理語句

注意: mysql_* 系列函數已在 PHP 5.5.0 棄用,PHP 7.0.0 移除。現代開發應使用 PDO 或 mysqli 的預處理語句,既安全又避免拼接錯誤:

PDO 寫法(推薦)

$pdo = new PDO("mysql:host=localhost;dbname=test", $user, $pass);
$stmt = $pdo->prepare("SELECT * FROM member WHERE username LIKE ?");
$stmt->execute([$row_Recordset1['articles_author']]);
$row = $stmt->fetch(PDO::FETCH_ASSOC);

mysqli 寫法

$mysqli = new mysqli("localhost", $user, $pass, "test");
$stmt = $mysqli->prepare("SELECT * FROM member WHERE username LIKE ?");
$stmt->bind_param("s", $row_Recordset1['articles_author']);
$stmt->execute();
$result = $stmt->get_result();
$row = $result->fetch_assoc();

常見拼接錯誤對比表

錯誤寫法結果正確寫法
"abc" + "def"0 (數字)"abc" . "def" → "abcdef"
"5" + "3"8 (數字)"5" . "3" → "53"
$a + $b數學加法$a . $b 字符串拼接

總結

本質上是運算符混淆導致 SQL 語句生成錯誤,進而查詢失敗。遷移到 PDO/mysqli 並使用預處理語句,可從根源消除此類問題,同時防範 SQL 注入攻擊。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved