我正在尝试为网站做一个小型搜索引擎。
这是简单的代码
if ( Input::issetGet('q') ) {
$q = Input::get('q');
if ( !empty($q) ) {
$keywords = explode(' ', $q);
$findPhones = $dbh->prepare("
SELECT
p.id AS pId, p.name AS pName, p.original_price, p.price, p.img, p.brand, p.model, p.color, p.o_s, p.status, p.description,
b.id, b.name AS bName,
m.id, m.name AS mName
FROM phones AS p
LEFT JOIN brands AS b ON p.brand = b.id
LEFT JOIN phone_models AS m ON p.model = m.id
WHERE p.name LIKE '%" . implode("%' OR p.name LIKE '%", $keywords) . "%'
OR p.description LIKE '%" . implode("%' OR p.description LIKE '%", $keywords) . "%'
OR b.name LIKE '%" . implode("%' OR b.name LIKE '%", $keywords) . "%'
ORDER BY p.id DESC
");
$findPhones->execute();
$phones = $findPhones->fetchAll();
}
}
让我快速解释一下。如果我搜索samsung
,此查询将检查p.name
,p.description
或b.name
是否包含此字词。如果我搜索samsung computers
,则查询会检查p.name
,p.description
或b.name
是否包含单词samsung
或computers
,依此类推更多搜索字词。
问题是我找不到绑定$keywords
的方法,我不想像在查询中那样硬编码,而是在执行查询时传递它。
我尝试使用?
和:keyword
,但都没有效果。如果我转储查询,则LIKE
语句为空,""
。
我的猜测是问题存在于查询内部的implode函数中,它不允许我参数化数组$keywords
。
此时我只是在没有绑定值的情况下查询数据库,而且我打开SQL注入。
问:如何绑定数组keywords
,如果不可能,在这种情况下保护SQL注入的最佳方法是什么?
谢谢