2012-04-12 17 views
1

該表的公司名稱爲不是已轉義。
我QRY看起來像查詢MySQL中的未轉義字符串

$sql = "SELECT id FROM contact_supplier WHERE name = '$addy' LIMIT 1"; 

這個問題是在表中的公司名稱值有時會像「阿克米國際S/L」。
(FYI:在$阿迪的值相匹配的DB)
顯然,存儲當值沒有逃脫。

如何找到我的比賽嗎?


[編輯]
AHAH!
我覺得我我們到的東西。 的$阿迪價值的來源是一個文件

$addresses = file('files/addresses.csv'); 

然後我做了

foreach ($addresses as $addy) {} 

好吧,當我逃離$阿迪字符串,它逃避新行字符和包括「\ r \ n「到比較字符串的末尾。
除非有人提出了一種更優雅的方式,我想我會概率剝奪那些有str_replace()函數。

:)
[\編輯]

+0

你嘗試查詢它是現在的方式是什麼? – 2012-04-12 21:29:52

+0

是的,嘗試過,但沒有運氣。 – mOrloff 2012-04-12 22:13:33

+0

因爲直到第二天我還沒有回答我自己的問題,所以我編輯了一些內容。謝謝,一堆:) – mOrloff 2012-04-12 22:23:36

回答

0

使用mysql_real_escape_string

$addy = mysql_real_escape_string($addy); 

,或者嘗試使用參數化查詢(PDO)。


對本聲明:

顯然,存儲當值沒有逃脫。

這是不正確的邏輯。如果這些值在原始INSERT語句中未被轉義,則該語句將失敗。如果沒有逃脫,你會得到syntax error near "l S/L' LIMIT 1"的錯誤。數據正確存儲在數據庫中的事實證明,插入它的人能夠正確地做到這一點(通過轉義或使用參數化查詢)。

如果你正在做的事情正確,那麼數據應該而不是存儲在數據庫中的轉義形式。

+0

這是第一件事我試過一個;),但很可惜......沒有行再搭配因爲DB具有非轉義值... IE瀏覽器:它試圖逃出我的字符串「Acme的詮釋\'L」相匹配「Acme Int'l」的DB值。其他想法????? – mOrloff 2012-04-12 22:01:37

+1

@mOrloff:對不起,你明顯錯了。如果字符串在你的SQL查詢中被轉義,它將*匹配「非轉義」值。事實上,這是*整點*!很明顯,你的字符串不匹配的原因是不同的。而且你問另一個想法......但你甚至*嘗試*使用參數化查詢,這是我的另一個建議?還是你完全忽略了我的答案? – 2012-04-12 22:06:29

+0

:D ..謝謝BUNCH ..請參閱我的更新到我的OP – mOrloff 2012-04-12 22:26:22

0

爲什麼你認爲已經存儲在表中的數據應該逃脫?

只有在數據直接寫入基於文本的語言之前,您才應該轉義數據。作爲SQL查詢的一部分,或HTML頁面或JavaScript代碼塊中。

+0

對我來說最令人矚目的是現在可以爲字符串調整B4存儲在數據庫中,這是我遇到的非常類似的問題...除了那......只是一個很好的形式。然後,B4在任何類型的代碼塊中使用,U簡單地剝去斜槓。 .......除非我已經有這些年的低音贊助:) :) – mOrloff 2012-04-12 22:07:59

+1

沒有通用的逃避。 SQL有一組特殊字符('''',''''等),HTML還有其他的設置('<', '>','&'等)。在你使用之前 – 2012-04-12 22:11:18

+0

這是有道理的......我會更多地研究它,謝謝 – mOrloff 2012-04-12 22:25:15

0

當執行查詢時,沒有什麼espaced的。 MySQL轉換它並插入,否則它不會插入並因爲語法而給出錯誤,或者我們爲了像sql注入這樣的安全性而轉義它們。

因此,與轉義的值查詢將是工作的罰款與數據庫中的數據。

+0

如果我理解正確,那麼我的最初預感是正確的......我逃脫了絃樂......並得到了零匹配:( – mOrloff 2012-04-12 22:12:46

+0

你能提供你逃過的字符串的值,並且表中的行應該匹配嗎?也許你是逃避2次或更多次,這將導致\\'字符。同時讓我舉個例子,你的數據庫中有「Ata's Home」,它看起來沒有逃脫,你用WHERE column ='Ata \'Home'來查詢它,並且應該匹配,如果不匹配,找出問題 – 2012-04-12 22:16:34

0

如果當你試圖進入其中存儲那麼就會造成SQL錯誤時,並沒有逃過值。

的問題是,當你查詢的數據不被轉義。

快速劈:使用mysql_real_escape_string

妥善解決:不要被串在一起,混搭構建SQL。 Use prepared statements and parameterized queries

+0

感謝您的鏈接...這是一個快速和骯髒的任務,所以我正在恢復whatev呃方法出來的存儲(我的塵土飛揚的腦)首先...大聲笑...顯然我應該重新思考這種方法:D – mOrloff 2012-04-12 22:37:52

0

另一種辦法是改變你的查詢,這...

$sql = "SELECT id FROM contact_supplier WHERE name = \"$addy\" LIMIT 1"; 
+0

試過... MySQL只需要單引號中的值(甚至直接在PMA中測試): ( ... 其他想法 ?? – mOrloff 2012-04-12 22:04:46

0

問題竟然是換行字符 的$阿迪價值的源泉開始了這樣的

$addresses = file('files/addresses.csv'); 

我再通過

foreach ($addresses as $addy) {} 

去當我上課抓住$ addy字符串,它將轉義新的字符串,並在比較字符串的末尾插入「\ r \ n」。
只要我逃出來,與下降string_replace()的字符,一切都順順當當

感謝-一個束團的幫助