首頁 > 後端開發 > php教程 > 為什麼我的SQL語句的ORDER BY子句中不能使用PDO參數?

為什麼我的SQL語句的ORDER BY子句中不能使用PDO參數?

DDD
發布: 2024-12-27 01:39:09
原創
948 人瀏覽過

Why Can't I Use PDO Parameters in the ORDER BY Clause of My SQL Statement?

PDO 語句中的 ORDER BY 參數

在 SQL 語句的 ORDER BY 子句中使用參數時遇到困難。 :order 和 :direction 參數無法產生任何結果。

問題原因

PDO 參數不能直接在 ORDER BY 子句中使用。它們必須是靜態字串。

列名稱或排序方向沒有 PDO 常數。因此,您必須將這些值直接插入 SQL 語句中。但是,採取預防措施至關重要:

  1. 對腳本中的每個運算符和標識符進行硬編碼。
$orders = array("name", "price", "qty");
$key = array_search($_GET['sort'], $orders);
$order = $orders[$key];
$query = "SELECT * from table WHERE is_live = :is_live ORDER BY $order";
登入後複製
  1. 使用白名單助理function:
$order = white_list($order, ["name", "price", "qty"], "Invalid field name");
$direction = white_list($direction, ["ASC", "DESC"], "Invalid ORDER BY direction");

$sql = "SELECT field from table WHERE column = ? ORDER BY $order $direction";
$stmt = $db->prepare($sql);
$stmt->execute([$is_live]);
登入後複製

說明

白名單功能檢查值,如果不正確則引發錯誤,降低SQL 風險注射攻擊。

範例

$sql = "SELECT field from table WHERE column = :my_param";

$stmt = $db->prepare($sql);
$stmt->bindParam(':my_param', $is_live, PDO::PARAM_STR);
$stmt->bindParam(':order', $order, PDO::PARAM_STR);
$stmt->bindParam(':direction', $direction, PDO::PARAM_STR);
$stmt->execute();
登入後複製

以上是為什麼我的SQL語句的ORDER BY子句中不能使用PDO參數?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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