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