准备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);
但也没有喜乐。已经在全部大写和常规框中尝试了我的参数。没有不同。如何结合这三个?
答
您需要通过等作为包裹%的变量:
$val = '%some-value%';
$q = $db->prepare("SELECT id, name FROM this_table WHERE UPPER(name) LIKE ?");
$q->bindValue(1, $val);
答
问:如何这三个结合起来?
答:有没有在你的问题知道你在观察什么样的行为(准备与错误消息失败,执行与错误消息失败的足够的信息,执行是成功的,但取不返回任何或者正在返回意想不到的行......我们只是在猜测
你发布的两条SQL语句的语法看起来都是有效的(从提供的信息来看,我们没有办法验证标识符,数据类型,特权等)
我们注意到,如果name
列是使用不区分大小写的collati开(即以_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(?), '%')
^^^^^ ^^^^^
除此之外,我们只是猜测您所观察到的行为与您提供的信息。
向我们展示您尝试匹配的示例数据。 – 2014-09-21 00:48:30
也许并没有真正的结果:p所提供的代码是不够的,你应该多发一些 – Ghost 2014-09-21 01:02:18
你的第一个准备声明已经足够好了。除非在创建时不包含引号'LIKE'%SOMECHARACTERS%'' – andrex 2014-09-21 01:09:23