![](/img/trans.png)
[英]Setting PDO::ATTR_EMULATE_PREPARES to false not working
[英]Setting PDO emulate to false results in SQL wildcard Like query failure
如果我將PDO模擬設置為false,因為我已經多次讀取SQL注入安全性,在LIKE
查詢中使用通配符導致無輸出。
這是設置:
$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
這是一個失敗的查詢:
$query = $db->prepare("SELECT * FROM video WHERE name like :search and removed='0' and verified='1' or subgenre like :search and removed='0' and verified='1' LIMIT :lb, :lt");
$query->bindValue(':search', '%'.$search.'%', PDO::PARAM_STR);
$query->bindValue(':lb', $limitbottom, PDO::PARAM_INT);
$query->bindValue(':lt', $limittop, PDO::PARAM_INT);
$query->execute();
$array = $query->fetchAll(PDO::FETCH_ASSOC);
如果我刪除模擬設置,查詢將按預期運行並返回一個數組。 如果我正確理解了所有內容,則應在腳本中設置模擬為false以防止SQL注入。 我該如何糾正? 是否有可能有like
使用通配符和仿真關閉查詢?
PHP為5.4.10,MySQL為5.1.66
問題是參數:search
已被使用了兩次,仿真關閉時不支持此操作。
這解決了這個問題:
$query = $db->prepare("SELECT * FROM video WHERE name like :search1 and removed='0' and verified='1' or subgenre like :search2 and removed='0' and verified='1' LIMIT :lb, :lt");
$query->bindValue(':search1', '%'.$search.'%', PDO::PARAM_STR);
$query->bindValue(':search2', '%'.$search.'%', PDO::PARAM_STR);
$query->bindValue(':lb', $limitbottom, PDO::PARAM_INT);
$query->bindValue(':lt', $limittop, PDO::PARAM_INT);
$query->execute();
$array = $query->fetchAll(PDO::FETCH_ASSOC);
現在查詢將按預期返回數組。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.