当前位置:编程学习 > 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字符串的方式解决了下;各位达人看看能否给出完美的解决方案?
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,