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

PHP 字符串拼接 SQL:雙引號變量解析 vs 串聯運算符對比

     編輯:程式設計綜合問答

兩種寫法

// 1. 串聯運算符 .
$query1 = "insert into books values (' ".$isbn." ', ' ".$author." ', ' ".$title." ', ' ".$price." ')";

// 2. 雙引號直接解析變量
$query2 = "insert into books values (' $isbn ', ' $author ', ' $title', ' $price ')";

執行結果

**兩者最終生成的 SQL 字符串完全相同**(假設變量無特殊字符)。PHP 雙引號字符串**自動解析內部變量**,`$var` 或 `{$var}` 會被替換為值。

差異對比

維度串聯運算符 `.`雙引號直接解析
可讀性變量邊界清晰、IDE 高亮友好緊湊但易誤讀(如 `$title`s 會解析 `$titles`)
性能微弱優勢(編譯期優化)運行期解析,極微小開銷
複雜表達式支持任意表達式 `' '.($a+$b).' '`需 `{$a+$b}` 包裹,否則語法錯誤
數組/對象屬性`' '.$arr['key'].' '` 清楚`" {$arr['key']} "` 需花括號
安全性同樣需防注入,無本質差異同樣需防注入

最佳實踐:預處理語句

**拼接 SQL 字符串本身就是反模式**,無論哪種拼接方式都有注入風險。正確做法:

$stmt = $db->prepare("INSERT INTO books (isbn, author, title, price) VALUES (?, ?, ?, ?)");
$stmt->bind_param("sssd", $isbn, $author, $title, $price); // s=string, d=double
$stmt->execute();

遷移建議

  1. 將所有拼接 SQL 改為 `prepare` + `bind_param`。
  2. 歷史代碼暫時無法重構時,**統一用串聯運算符 `.`** 保持團隊風格一致。
  3. 開啟 `mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT)` 自動拋異常。

總結

雙引號解析變量與串聯運算符**功能等價**,但**串聯運算符可讀性更強、IDE 支持更好、複雜表達式更靈活**。生產環境**拒絕拼接 SQL,強制使用預處理語句**。

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