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