[英]Dynamic arguments in prepared statements
人!
我有此查詢從$_POST
獲取其WHERE
參數。 問題是我想動態獲取兩個比較值,而不為每個值創建查詢。 我現在所擁有的是:
$what = $mysqli->real_escape_string($_POST['what']);
........
$query = "SELECT * FROM list WHERE ";
$query .= $what . " = ? LIMIT 0,10";
........
$stmt->bind_param('s', $what);
我的第一個問題: 實踐中這有多安全? 因為我無法綁定兩個參數,還有其他更好的方法可以管理同一件事嗎?
我遇到的第二個問題是:我想更改= ?
LIKE %?%
,但我無法正常運行。 我嘗試使用CONCAT('%', ?, '%')
(不好,我知道),但仍然無法正常工作。 基本上,我最終想要實現的是:在WHERE ? LIKE %?%
WHERE ? LIKE %?%
。 可能嗎? 你能幫我一下嗎?
干杯,亞歷克斯
只需檢查$where
嚴格的參數集:
if (!in_array($where, array("table1", "table2"))) {
//do smth with wrong parameter
}
請注意, in_array
以O(N)
復雜度運行,因此,如果您的參數集很大,則最好將關聯數組與表名用作鍵。
mysql_real_escape_string或類似函數不會轉引號(`),因此您的應用程序容易受到SQL注入的攻擊。
只需為所有列定義一個白名單,然后檢查該列是否在數組中。
要在LIKE %?%
之后進行搜索,只需在搜索項的前面和后面添加一個%
。 對於正確的轉義,請參閱: 轉義MySQL通配符
您可以像這樣進行動態查詢,但是您的網站將容易受到SQL注入的攻擊。
mysql_real_escape_string轉義反引號,但是您可以手動轉義它們。
將所有轉義的內容移到某種幫助程序庫中也是一個好主意。 因此,您將分兩行獲取數據:
$sql = "SELECT * FROM list WHERE ?n = ?s LIMIT 0,10";
$data = $db->getAll($sql, $_POST['what'], $_POST['where']);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.