在MySQL語句中嵌入PHP變數
使用PHP變數增強SQL語句可以動態產生查詢。以下是您遇到的問題:
<code class="language-php">$type = 'testing'; mysql_query("INSERT INTO contents (type, reporter, description) VALUES($type, 'john', 'whatever')");</code>
為了解決此錯誤,請遵循以下指南:
1. 使用預處理語句
對於在語句中表示SQL文字(字串、數字)的任何變量,這都是強制性的。以下是工作流程:
prepare()
方法。 bind_param()
將佔位符與變數值關聯。 execute()
執行預處理查詢。 在mysqli(PHP 8.2 ):
<code class="language-php">$type = 'testing'; $reporter = "John O'Hara"; $description = 'whatever'; //添加了description变量 $sql = "INSERT INTO contents (type,reporter,description) VALUES (?,?,?)"; //修改了占位符数量 $stmt = $mysqli->prepare($sql); $stmt->bind_param("sss", $type, $reporter, $description); //修改了参数类型和数量 $stmt->execute();</code>
在mysqli(較舊的PHP版本):
<code class="language-php">$type = 'testing'; $reporter = "John O'Hara"; $description = 'whatever'; //添加了description变量 $sql = "INSERT INTO contents (type,reporter,description) VALUES (?,?,?)"; //修改了占位符数量 $stmt = $mysqli->prepare($sql); $stmt->bind_param("sss", $type, $reporter, $description); //修改了参数类型和数量 $stmt->execute();</code>
在PDO中:
<code class="language-php">$type = 'testing'; $reporter = "John O'Hara"; $description = 'whatever'; //添加了description变量 $sql = "INSERT INTO contents (type,reporter,description) VALUES (?,?,?)"; //修改了占位符数量 $stmt = $pdo->prepare($sql); $stmt->execute([$type, $reporter, $description]); //修改了参数数量</code>
2. 實作白名單過濾
對於關鍵字、識別碼或運算子等查詢部分,請使用白名單方法。透過預先定義的允許值清單過濾這些變數:
<code class="language-php">$orderby = $_GET['orderby'] ?? "name"; // 使用 null 合并运算符 $allowed = ["name", "price", "qty"]; if (!in_array($orderby, $allowed, true)) { // 使用 in_array 进行更简洁的检查 throw new InvalidArgumentException("无效的字段名称"); }</code>
確保根據資料庫語法正確格式化識別碼(例如,MySQL的反引號)。然後,安全地將此變數包含在SQL字串中:
<code class="language-php">$query = "SELECT * FROM `table` ORDER BY `{$orderby}` $direction"; // 使用大括号避免变量名冲突</code>
透過使用預處理語句和白名單過濾,您可以有效地防止SQL注入攻擊,並安全地將PHP變數整合到您的MySQL查詢中。 請注意,mysql_query
函數已被棄用,建議使用 mysqli
或 PDO
。 程式碼範例已更新以反映這一點,並修復了原始範例中的錯誤。
以上是如何在 MySQL 語句中安全地嵌入 PHP 變數?的詳細內容。更多資訊請關注PHP中文網其他相關文章!