2013-02-01 74 views
6

所以我有一個有趣的問題,我從來沒有遇到過,似乎無法找到有關糾正問題的更多信息。我有大量的數據庫,其中有大量的數據(價值10年),並試圖通過它進行搜索。Mysql使用LIKE和撇號查詢問題

現在搜索工作正常,但最近有人提請我注意一個'錯誤',如果你願意。我試圖通過拍攝來獲得預期的效果,但無濟於事。

這是我的問題:

當有人使用搜索撇號,它不是搜索出故障,但它不返回任何結果。因此,例如,當搜索Pete's查詢執行但不返回任何內容。是的,我確定查詢具有mysql_real_escape_string(),以便Pete's變成Pete\'s

即使我嘗試使用phpmysql的搜索功能來查詢它,我也會得到奇怪的結果。查詢的目的是這樣的:

SELECT * FROM `smd_article` WHERE `copy` LIKE '%Pete\'s%' 

但是,當我使用搜索功能在phpMyAdmin,它給了我:

SELECT * FROM `smd_article` WHERE `copy` LIKE '%Pete''s%' 

而當我真正在SQL選項卡中輸入了查詢,它仍然沒有返回結果。但是當我只用Pete和一些3k記錄的時候,我有一些17K記錄被返回,當我做Petes的時候。

所以我很好奇我做錯了什麼,或者錯過了,以便它可以允許使用LIKE語句的查詢中的撇號。思考?

+5

偏離主題,但它是值得知道像這樣的通配符查詢是查詢的最慢的方式一個數據庫。我可能對一張小桌子很好,但如果你的桌子很大,那真的會讓事情變慢。被警告。 – SDC

回答

5

嘗試通過mysql_real_escape_string

LIKE '%" . mysql_real_escape_string($find) . "%' 

LIKE '%Pete%27s%' 

,或者如果您使用的PDO,你可以像

$search ='Pete\'s' 
$stmt = $db->prepare("SELECT * FROM `smd_article` WHERE `copy` LIKE ?"); 
$stmt->bindValue(1, "%$search%", PDO::PARAM_STR); 
$stmt->execute(); 
+0

既沒有工作,仍然沒有結果 – MrTechie

+1

那麼存儲在數據庫中的是什麼?不是'皮特\'還是皮特的?如果它的'Pete's'這意味着你允許'''換句話說你的代碼是可以SQL注入的 –

+1

我從來沒有想過只是看看原始數據。現在我已經看到了這個問題。標題有:皮特' s和它的內容皮特’ s - 呃。我討厭這個網站的編輯只是複製和粘貼內容 – MrTechie

1

的問題是不是'單引號的原因。你正確地逃脫了。 (如在phpMyAdmin搜索功能):

字符串:皮特的

MySQL的: '皮特' 的

所以下面的查詢會工作。 (我測試過它)

SELECT * 
FROM `smd_article` 
WHERE copy 
LIKE '%Pete''s%' 

您還可以看看IN聲明:

SELECT * 
FROM `smd_article` 
WHERE copy 
IN (
'Pete', 'Pete''s' 
) 
+0

使用在聲明中不起作用 – MrTechie

+0

@MrTechie我已經用示例數據測試了查詢,它工作。報價的轉義不是問題。必須是一個不同的問題 – hek2mgl