准备MySQL的语句上,像

问题描述:

我开始了与:准备MySQL的语句上,像

$check = $db->prepare("SELECT `id`, `name` FROM `this_table` WHERE UPPER(`name`) LIKE ?")or die($db->error); 

不工作,并且不会返回任何行。试图深入它,并来到:

$check = $db->prepare("SELECT `id`, `name` FROM `this_table` WHERE UPPER(`name`) LIKE CONCAT('%', ?, '%')")or die($db->error); 

但也没有喜乐。已经在全部大写和常规框中尝试了我的参数。没有不同。如何结合这三个?

+1

向我们展示您尝试匹配的示例数据。 – 2014-09-21 00:48:30

+0

也许并没有真正的结果:p所提供的代码是不够的,你应该多发一些 – Ghost 2014-09-21 01:02:18

+0

你的第一个准备声明已经足够好了。除非在创建时不包含引号'LIKE'%SOMECHARACTERS%'' – andrex 2014-09-21 01:09:23

您需要通过等作为包裹%的变量:

$val = '%some-value%'; 
$q = $db->prepare("SELECT id, name FROM this_table WHERE UPPER(name) LIKE ?"); 
$q->bindValue(1, $val); 

问:如何这三个结合起来?

答:有没有在你的问题知道你在观察什么样的行为(准备与错误消息失败,执行与错误消息失败的足够的信息,执行是成功的,但取不返回任何或者正在返回意想不到的行......我们只是在猜测

你发布的两条SQL语句的语法看起来都是有效的(从提供的信息来看,我们没有办法验证标识符,数据类型,特权等)

我们注意到,如果name列是使用不区分大小写的collat​​i开(即以_ci结尾的字符集和客户端字符集不区分大小写,则可能不需要使用UPPER()函数,但它是有效的。 (我们在这里猜测,name列被定义为VARCHAR列,但同样这只是一个猜测。

为了保持一致,我们希望LIKE比较的两边都会被包裹在UPPER()函数...

SELECT t.id 
    , t.name 
    FROM `this_table` t 
WHERE UPPER(t.name) LIKE UPPER(?) 
     ^^^^^    ^^^^^ 

如果你期待的通配符匹配,其中“ABCD”的name值将匹配“BC”,那么你需要在你的bindParam提供的值将包括通配符字符

如果您提供的值只是'bc',那么您可以包含t他在第二个示例中显示了通配符字符,其中CONCAT函数和文字'%'字符。

SELECT t.id 
    , t.name 
    FROM `this_table` t 
WHERE UPPER(t.name) LIKE CONCAT('%', UPPER(?), '%') 
     ^^^^^       ^^^^^ 

除此之外,我们只是猜测您所观察到的行为与您提供的信息。