簡體   English   中英

准備好的語句中的動態參數

[英]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_arrayO(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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM