2010-06-21 46 views
1

另一個腦筋急轉彎。一個非常奇怪的撇號MySQL PHP錯誤

這不是通常的「但撇號打破了我的查詢」,因爲我知道所有關於逃避和消毒,所以我會得到它的權利。

很多很多東西都存儲在一個名爲「刺客」和「寶貝」的數據庫中,結果是「刺客」和「寶貝\」,恢復很好,但通過文本搜索是......痛苦。

LIKE「%Babe \'s%」沒有結果,「%Babe \'s」沒有結果,「%Babe \'s」沒有結果。

但如果我直接去服務器,那麼他們都會產生結果。

換句話說,完全未編輯的SAME查詢將直接在MySQL引擎中工作,但通過php的mysql api發送,它不會產生匹配結果。

任何想法可能導致這種情況? (我已經提前調查的斜線等100倍的量,是有一個字符集問題「

很多很多很多很多的感謝

編輯:?

我想我最好讓自己更明確:

"SELECT title FROM games WHERE title LIKE "%assassin\\\'s%";(由於SQL應該逃脫撇號和斜槓會變成被存儲的斜線之一,因爲我們在這個例子中尋找「刺客\信條」)

EDIT2 :播種我們有figu紅色出現這是由於由於消毒不良導致實際數據庫中逃脫逃生。目前我正在嘗試清理數據庫和輸入法。

edit3:它似乎像魔術引號在某種程度上...我發誓,被關閉!然而,並非如此。適用於本網站的數據庫包裝器具有清潔事件並且也是導致問題的預清理。那現在已修正,現在我運行一個腳本,(希望)淨化分貝......

+0

? – Rwky 2010-06-21 16:59:26

+0

mysql_query()php的標準。 – Dorjan 2010-06-21 17:02:14

回答

5

我會認真考慮修復數據庫中的數據。

現在,話說回來,MySQL將\'''都識別爲一個轉義撇號。也就是說,除非服務器模式設置爲使用嚴格SQL,否則只能識別''

這些數據最有可能在進入時被雙重轉義,最有可能一次當用戶輸入時(通過magic_quotes_gpc,它使用addslashes),當您調用它時再次調用mysql_real_escape_string

這將變爲Assassin's CreedAssassin\\\'s Creed,最終將存儲爲Assassin\'s Creed

我強烈建議禁用magic_quotes_gpc如果可以的話,因爲它會導致更多的問題比它修復。

+0

我認爲修復數據庫和輸入函數將是最佳的行動方案。乾杯所有,我會等到我解決,然後把它交給誰再幫最好的:) 謝謝大家 – Dorjan 2010-06-21 23:25:08

+0

我已經解決了數據庫和它的工作答案離開這個開放。很大的工作,但從現在開始,所有事情都應該如此。我也清理了輸入,所以我們不應該有任何損壞的數據。 再次感謝大家 – Dorjan 2010-06-23 10:14:30

1

你有沒有嘗試使用mysql_real_escape_string,還檢查magic_quotes的啓用,並與你的字符串搞亂

+0

是的,mysql_real_escape_string是我用過的,但是在發送到服務器之前,我還生成了原始語句。正如我知道magic_quotes,他們只有當數據進入PHP?我可能會被誤認爲是c,但如果是這樣的話,那麼單次轉義就會奏效,因爲magic_quotes的唯一問題就是額外的轉義。 – Dorjan 2010-06-21 17:22:45

1

當你逃脫一個撇號,這樣你就可以將它存儲在MySQL中,反斜槓不會被存儲。

那麼試試這個:

SELECT title FROM games WHERE title LIKE "%assassin\'s%"; 

相反的:

SELECT title FROM games WHERE title LIKE "%assassin\\\'s%"; 
+0

不幸的是,在這種情況下,我之前的人使用了一個手動轉義,其中escape是存儲在db中的。 – Dorjan 2010-06-21 18:04:33

+1

即使是手動轉義,MySQL也不會存儲反斜槓。你是否在說'當你從標題中選擇'時,你會看到諸如'刺客信條'之類的東西?如果你是,那麼它被錯誤地逃脫了,你的數據被破壞了。 – 2010-06-21 18:08:41

+0

這就是我要說的。它在那裏db;它一定是三重逃脫的。 – Dorjan 2010-06-21 19:28:28

0

SELECT歌名FROM遊戲中稱號REGEXP 「刺客\的」;

認爲REGEXP是一個更強大,更挑剔的「喜歡」在MySql ....不是所有的,最終的,但另一個很酷的工具在店裏。

+0

我從來不知道這件事,明天我會明白的。謝謝。 – Dorjan 2010-06-21 19:28:54

-1

由於文檔says,斜線在LIKE和REGEXP條款必須加倍

編輯:錯誤的鏈接你如何使用PHP來查詢數據庫,它的功能修正

+0

是的,我們知道這一點可惜,因爲日期實際上存儲,這是造成「LIKE」經歷時,不帶回結果的斜線。 hecne爲什麼這是一個奇怪的問題,因爲它沒有像你期望的那樣行事。正如其他人所說,數據集本身似乎被破壞到導致失敗的MySQL標準。 – Dorjan 2010-06-22 10:29:21

+0

@Dorjan反正你仍然需要這個您修復數據 – 2010-06-22 10:33:35

+0

後,如果你還看這個問題你會很快意識到,我們已經試過「只是加倍的斜槓」 – Dorjan 2010-06-22 10:34:33