首頁 > 資料庫 > mysql教程 > 如何在 MySQL 語句中安全地嵌入 PHP 變數?

如何在 MySQL 語句中安全地嵌入 PHP 變數?

Mary-Kate Olsen
發布: 2025-01-25 16:56:10
原創
372 人瀏覽過

How to Safely Embed PHP Variables in MySQL Statements?

在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文字(字串、數字)的任何變量,這都是強制性的。以下是工作流程:

  • 使用佔位符:在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 函數已被棄用,建議使用 mysqliPDO。 程式碼範例已更新以反映這一點,並修復了原始範例中的錯誤。

以上是如何在 MySQL 語句中安全地嵌入 PHP 變數?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板