簡體   English   中英

將PDO模擬設置為false會導致SQL通配符像查詢失敗

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

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