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

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

  1. 沙发
    樵夫 2017年12月28日 下午11:03

    你用法不对

  2. 板凳
    旭日升 2015年3月25日 下午3:57

    感谢分享,解决了问题

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

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