【PHP】PDO中使用Like进行参数模糊查找
使用以下PDO代码进行参数的模糊查找,结果没有返回数据
$db = new PDO(DB_DSN, DB_USERNAME, DB_PASSWORD, $pdo_options); $query = $database->prepare('SELECT * FROM table WHERE name LIKE "%:name%"'); $query->bindValue(':name', $name, PDO::PARAM_STR); $query->execute(); while ($results = $query->fetch()) { echo $results['name']; }
分析了一下,原因是PDO在解析生成sql语句时做了防sql注入机制,将参数替换为值时默认在值的两倍增加了单引号‘,导致了最后的结果sql并非我们想要的。
正确的做法是,将模糊查询用的%放到bindValue中来,具体代码改为如下:
$db = new PDO(DB_DSN, DB_USERNAME, DB_PASSWORD, $pdo_options); $query = $database->prepare('SELECT * FROM table WHERE name LIKE :name'); $query->bindValue(':name', '%'.$name.'%', PDO::PARAM_STR); $query->execute(); while ($results = $query->fetch()) { echo $results['name']; }
以上代码测试有效。
P.S.目前碰到了一个相似的问题,利用PDO机制无法完美解决,代码如下:
$field = 'name'; $value = 'maple'; $id = 1; $db = new PDO(DB_DSN, DB_USERNAME, DB_PASSWORD, $pdo_options); $query = $database->prepare('UPDATE users SET :field = :value where id = :id'); $query->bindValue(':field', $field, PDO::PARAM_STR); $query->bindValue(':value', $value, PDO::PARAM_STR); $query->bindValue(':id', $id, PDO::PARAM_STR); $query->execute();
上述代码解析后的SQL语句为
UPDATE users SET 'name' = 'maple' where id = '1'
于是语句执行出错,目前只能用直接拼接SQL字符串的方式解决了下;各位达人看看能否给出完美的解决方案?
标签: PHP
你用法不对
[回复]
感谢分享,解决了问题
[回复]
pdo 预处理sql语句 没必要绑定字段名 只需绑定字段值 就行
[回复]
晴枫 3月 19th, 2012 下午7:50 回复:
@㊣气大侠CV!, 但个别情况下字段名是变动的,所以需要用绑定的形式
[回复]
㊣气大侠CV! 3月 24th, 2012 上午10:29 回复:
预处理参数集我觉得最大的功能是为了减少注入攻击的,也就是绑定外来参数值。
如果字段名需要动态参与sql执行,动态字段名由自己控制不存在安全问题,直接写在sql串里吧,拼接起来,字段名没必要绑定
[回复]
晴枫 3月 25th, 2012 上午10:26 回复:
@㊣气大侠CV!, 谢谢,后来就是这么干的
[回复]