我从:
$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);
但也没有快乐。在所有大写和常规大小写中都尝试了我的参数。没有区别。如何将这三者结合起来?
您需要将 LIKE 作为包装在 % 中的变量传递:
$val = '%some-value%';
$q = $db->prepare("SELECT id, name FROM this_table WHERE UPPER(name) LIKE ?" );
$q->bindValue( 1, $val );
问:如何将这三者结合起来?
答:您的问题中没有足够的信息来了解您观察到的行为(准备失败并显示错误消息,执行失败并显示错误消息,执行成功,但 fetch 未返回任何行,或返回意外行...我们只是猜测。
您发布的两个 SQL 语句的语法似乎都是有效的。(根据提供的信息,我们无法验证标识符、数据类型、权限等。
我们注意到,如果name
列是使用不区分大小写的排序规则定义的(即以 _ci
结尾的字符集,并且客户端字符集不区分大小写,则可能不需要使用 UPPER()
函数,但它是有效的。 (我们在这里猜测name
列被定义为 VARCHAR 列,但同样,这实际上只是一个猜测。
为了保持一致性,我们有点希望 LIKE 比较的两边都包含在 UPPER(( 函数中......
SELECT t.id
, t.name
FROM `this_table` t
WHERE UPPER(t.name) LIKE UPPER( ? )
^^^^^ ^^^^^
如果您期望通配符匹配,其中"abcd"的值将与"bc"匹配name
则您需要在bindParam中提供的值将包含通配符。
如果您提供的值只是 'bc'
,则可以包含通配符,如第二个示例中所示,CONCAT
函数和文字'%'
字符。
SELECT t.id
, t.name
FROM `this_table` t
WHERE UPPER(t.name) LIKE CONCAT('%', UPPER( ? ), '%')
^^^^^ ^^^^^
除此之外,我们只是根据您提供的信息猜测您观察到的行为。