PHP PDO无法绑定值

时间:2013-11-24 09:59:23

标签: php pdo bind sql-injection sanitization

我正在尝试为网站做一个小型搜索引擎。

这是简单的代码

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.namep.descriptionb.name是否包含此字词。如果我搜索samsung computers,则查询会检查p.namep.descriptionb.name是否包含单词samsungcomputers,依此类推更多搜索字词。

问题是我找不到绑定$keywords的方法,我不想像在查询中那样硬编码,而是在执行查询时传递它。

我尝试使用?:keyword,但都没有效果。如果我转储查询,则LIKE语句为空,""

我的猜测是问题存在于查询内部的implode函数中,它不允许我参数化数组$keywords

此时我只是在没有绑定值的情况下查询数据库,而且我打开SQL注入。

问:如何绑定数组keywords,如果不可能,在这种情况下保护SQL注入的最佳方法是什么?

谢谢

0 个答案:

没有答案