$sql="select * from info_device where name REGEXP '^.*wc.*$' and password REGEXP '^bnp[0-9]*$'";
我想在mysql数据库中查询name字段中包含wc、password字段中以bnp开头以数字结尾,在sql语句中我按上面这么写是能正常查询出结果的。
然后我考虑把wc和bnp换成变量的形式
$a="wc";
$b="bnp";
$sql="select * from info_user where name REGEXP '^.*$a.*$' and password REGEXP '^$b[0-9]*$'";然后我按这么写查询却出现错误,肯定是把变量替换到正则表达式里出现了问题,但我自己试着修改了几次也有问题,所以想问问如何更改才能在数据库中按设想查到正确结果

解决方案 »

  1.   

    $sql="select * from info_user where name REGEXP '^.*$a.*$' and password REGEXP '^".$b."[0-9]*$'";
      

  2.   

    $sql="select * from info_user where name REGEXP '$a' and password REGEXP '^$b"."[0-9]*$'";首先说你的错误原因,在双引号中可以直接使用变量,而你的正则是变量后面跟着数字匹配[0-9],意思是正确的,但是前面跟着变量$b,php误认为$b是个数组,你要引用的是一个数组的值:$b[0-9],而数组的key这里是“0-9”显然不对,所以报错了。
    第二就是第一个正则匹配:name字段中包含wc。既然只要包含wc,那你管他在哪呢,根本不需要前面.*,要知道正则是贪婪的,".*wc.*"首先是匹配.*,由于贪婪会把整个字段吃掉,然后开始回溯匹配wc,最后再.*。非常费时间的。
    举例:
    如果匹配wc3456789,首先.*从头开始匹配所有(9个字段),此时指向9,然后开始匹配w,不成功就回退知道匹配到w(回退匹配9个字段),接下来匹配c成功(1个字段),最后.*全部匹配(8个字段),总共耗时:9+9+1+8.
    而如果直接匹配wc,则耗时仅为2.
      

  3.   

    $sql="select * from info_user where name REGEXP '^.*$a.*$' and password REGEXP '^{$b}[0-9]*$'";