站点用户使用搜索表单来查询产品数据库。输入的关键字在数据库中搜索产品的标题。
public function startSearch($keywords){
$keywords = preg_split('/[\s]+/', $keywords);
$totalKeywords = count($keywords);
foreach($keywords as $key => $keyword){
$search .= '%'.$keyword.'%';
if($key != ($totalKeywords)-1){
$search .= ' AND itemTitle LIKE ';
}
}
$sql=$this->db->prepare("SELECT * FROM prodsTable WHERE itemTitle LIKE ?");
$sql->bindParam(1, $search);
$sql->execute ();
$sql->fetchALL(PDO::FETCH_ASSOC);
Run Code Online (Sandbox Code Playgroud)
如果用户输入单个关键字,则搜索有效,但是如果使用多个关键字,则查询不会执行。
如果:$ keywords ='apple ipod'; $ search ='%apple%AND itemTitle Like%ipod%';
因此,准备好的语句应如下所示:
“从prodsTable中选择*,其中itemTitle喜欢%apple%和itemTitle喜欢%ipod%”
当两个产品的标题中同时包含“ apple”和“ ipod”时,没有结果返回。
我究竟做错了什么?
准备好的语句可保护您免受sql注入的侵害,因此不会解释参数中的sql代码。AND itemTitle LIKE ?在调用prepare()之前,您将必须使用正确数量的sql查询。
$keywords = preg_split('/[\s]+/', $keywords);
$totalKeywords = count($keywords);
$query = "SELECT * FROM prodsTable WHERE itemTitle LIKE ?";
for($i=1 ; $i < $totalKeywords; $i++){
$query .= " AND itemTitle LIKE ? ";
}
$sql=$this->db->prepare($query);
foreach($keywords as $key => $keyword){
$sql->bindParam($key+1, '%'.$keyword.'%');
}
$sql->execute ();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4094 次 |
| 最近记录: |