【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中使用Like进行参数模糊查找
    标签:
    分享:

已经有5 条评论抢在你前面了~

  1. 沙发
    旭日升 2015年3月25日 下午3:57

    感谢分享,解决了问题

    [回复]

  2. 板凳
    ㊣气大侠CV! 2012年3月17日 下午2:12

    pdo 预处理sql语句 没必要绑定字段名 只需绑定字段值 就行

    [回复]

    晴枫

    晴枫 回复:

    @㊣气大侠CV!, 但个别情况下字段名是变动的,所以需要用绑定的形式

    [回复]

    ㊣气大侠CV! 回复:

    预处理参数集我觉得最大的功能是为了减少注入攻击的,也就是绑定外来参数值。
    如果字段名需要动态参与sql执行,动态字段名由自己控制不存在安全问题,直接写在sql串里吧,拼接起来,字段名没必要绑定

    [回复]

    晴枫

    晴枫 回复:

    @㊣气大侠CV!, 谢谢,后来就是这么干的

    [回复]

无觅相关文章插件,快速提升流量