2017-03-03 82 views
0

执行包含()的PDO LIKE查询时发生了一些问题。查询中的PDO/MYSQL括号()

<?php 

...  

$text_with_parentheses = '%'.$text_with_parentheses.'%' 

$sth = $dbh->prepare('SELECT * FROM '.$table.' WHERE alarm LIKE :alarm'); 
$sth->bindParam(':alarm' , $text_with_parentheses); 
$sth->execute(); 
$response = $sth->fetch(); 

... 

?> 

我查询的字符串值是一个报警文本,存储在varchar utf8_uncode_ci列中。它看起来像这样:

'ABCD。状态ABCD(6):(失败)'

看来我不知道如何逃避括号。通过PHP/PDO并直接在MYSQL控制台上进行测试。对于我测试的测试,直接在MYSQL控制台中回滚

SELECT * FROM `table` WHERE `column`='ABCD. Status ABCD (6): (fail)' 

它返回0个结果。

只有这样,才能得到任何结果 - 无论是在PDO和MYSQL控制台 - 做:

SELECT * FROM `table` WHERE `column` LIKE 'ABCD. status ABCD%' 

但返回几个值这是不可行的。当搜索不包含圆括号的值时,它可以正常工作。

任何人有任何想法?这似乎是一个MYSQL问题。

回答

0

括号绝对没有意义既不在mysql字符串也不在PDO中。

您的问题是由别的东西引起的。

选择从数据库中现有的值,并对其进行编码,看到所有非打印字符:

echo rawurlencode($value); 

,然后进行比较。

的真正ABCD. Status ABCD (6): (fail)串将使

ABCD.%20Status%20ABCD%20%286%29%3A%20%28fail%29 

而一个从数据库中不同的东西。比较并检查差异。

+0

使用rawurlencode($ value);在测试页面中检查输入和输出。得到它的工作。 看来你是对的(ofcourse;))。我最好再睡一会儿,明天再看一遍代码。 –

+0

发现问题实际上是一些发送的警报包含双引号("),并且存储的副本以%22(URL编码)形式出现。 –