1 回答

TA貢獻1788條經驗 獲得超4個贊
這將是我已經在我的網站上教授的幾種技術的有趣組合,即
動態創建 WHERE 子句
為 IN 子句創建準備好的語句
白名單以防止SQL 注入
最后會變成這樣
$allowed = ["Firstname", "Lastname"];
$conditions = [];
$parameters = [];
foreach ($filter as $key => $values) {
? ? if (array_search($key, $allowed, true) === false) {?
? ? ? ? throw new InvalidArgumentException("invalid field name!");?
? ? }
? ? $conditions[] = "`$key` in (".str_repeat('?,', count($values) - 1) . '?'.")";
? ? $parameters = array_merge($parameters, $values);
}
$sql = "SELECT * FROM table_name ";
if ($conditions)
{
? ? $sql .= " WHERE ".implode(" AND ", $conditions);
}
將生成您正在尋找的查詢,
SELECT * FROM table_name WHERE WHERE `Firstname` in (?,?) AND `Lastname` in (?)
以及要在 中使用的值數組PDO::execute(),制作防彈解決方案,其中值通過參數保護,文件名通過白名單過濾保護不受保護
我唯一的懷疑是問題中出現的案例可能過于簡單化了。一旦您不僅需要精確匹配,還需要部分匹配或更大/更小的比較,代碼的復雜性就會飆升。
- 1 回答
- 0 關注
- 162 瀏覽
添加回答
舉報