2017-03-03 55 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編碼)形式出現。 –