在 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
"abc" . "def" 結果為 "abcdef"代碼中:
"SELECT * FROM member WHERE username like '"+ $row_Recordset1['articles_author'] +"'"
PHP 會將整個表達式視為數學運算:
"SELECT * FROM member WHERE username like '" 轉換為數字 → 0$row_Recordset1['articles_author'] 若為字符串(如 "john")也轉為 0"'" 轉為 00 + 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 = 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 = 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 注入攻擊。