2012-05-15 27 views
0

我有一個表格和用戶(在字符串的結尾註單引號)mysql_real_escape_string奇怪的撇號行爲?

My Bday' 

進入如現在,我想要去除撇號,就這麼簡單......無法逃避他們,而不是添加斜線剛剛擺脫他們的

首先,我有以下幾點:

$event_title = mysql_real_escape_string($_POST['event_title']); 

echo "<br /><br /><br />event title is $event_title"; 

這會導致返回以下:

event title is My Bday\\\' 

爲什麼3斜槓?

所以,後來我繼續前進,處理這種通過以下:

$event_title = str_replace("'", "", $event_title); 

$event_title = stripslashes($event_title); 

然後我再回到它來檢查結果

echo "<br /><br /><br />event title is $event_title"; 

我得到如下:

event title is My Bday\ 

任何想法發生了什麼?我只是想要去除apostophes和斜槓,但不知何故,沒有發生

magic_quotes_gpc被關閉的方式

如果我沒有用stripslashes因此讓他們在爲MySQL對付我得到以下錯誤:

You have an error in your SQL syntax; check the manual that corresponds to your 
MySQL server version for the right syntax to use near 'Private', 
event_notes = '' where user_event_id = '35'' at line 3 

update user_events set event_date = '2012-11-17', event_title = 'My Bday\\\', 
event_vis = 'Private', event_notes = '' where user_event_id = '35' 

OK,再編輯:

我嘗試這樣做:

$event_title = $_POST['event_title']; 

$event_title = str_replace("'", "", $event_title); 

$event_title = trim($event_title); 

$event_title = mysql_real_escape_string($event_title); 

echo "<br /><br /><br />event title is $event_title"; 

,我得到這個:

event title is My Bday\\ 

我只是想擺脫單引號的,明確別的東西是怎麼回事,但它讓我!

+2

雖然不是一個答案:你應該真的閱讀[this](http://chat.stackoverflow.com/transcript/message/3656047#3656047) 。 – PeeHaa

+1

你給了用戶輸入的內容,但是在它被轉義之前,它恰好等於'$ _POST ['event_title']'? – Jon

+0

mysql_real_escape_string用於data-> sanitize-> storage而不是data-> sanitize-> output,如果遵循此模式,數據將正確顯示。 data-> sanitize-> storage-> output –

回答

1

發生了什麼事「怎麼樣」是這樣的:

mysql_real_escape_string逃脫將會由一個字符前面添加一個斜線被轉義轉義的所有字符。但只添加斜線會導致字符在數據庫中未轉義存儲,因此斜線必須在插入之前轉義...

這就是爲什麼您有My BDay\\\'。如果該值存儲在數據庫中,最終結果將爲My BDay\'

但是當你做str_replace("'", "", 'My BDay\\\'');你將以My BDay\\\結束,並在此之後調用stripslashes你會得到My BDay\ - 這是絕對正確的!

所以不要以字符串的樣子懶得打電話mysql_real_escape_string後,只是值存儲到數據庫和檢索它後,您將結束與My BDay'再次...

編輯你怎麼來了在撥打stripslasshes之後只需要三個斜線?該函數從字符串的開始到結束,並查找任何斜線轉義字符以除去轉義斜線。因此,它找到前兩個斜槓並刪除一個,但仍然有兩個遺蹟(剛剛處理的和第三個),因此它會處理接下來的兩個slasshes,它會導致只剩下一個斜槓...

如果您在串My BDay\\\'「d通話的stripslashes - 這將導致My BDay' ...

EDIT2我的壞...接下來的兩個斜線可能增加,因爲你有magic_quotes_gpc ON - 把它們關掉或致電mysql_real_escape_string(stripslashes($string))

+0

剛剛更新的問題,你說的應該發生的不是 - 你說:如果你會在字符串My BDay上調用stripslashes \\'' - 這將導致我的BDay' - 它不在我的情況下,我很害怕 - 見op - 它的順序,我處理的東西 –

+1

-1:簡直是錯的。 'mres'只爲每個角色添加*一個*反斜槓,這就是它被記錄下來的工作方式;額外的反斜槓來自其他地方。 – Jon

+0

最初的文章說我沒有magic_quotes_gpc ON,但是,mysql_real_escape_string(stripslashes($ string))已修復它 - 什麼b * ll疼!非常感謝堅持不懈的伴侶 –

0

一個斜線逃離撇號,另一個逃脫斜線逃離撇號。

內部MySQL的解釋\

0

在你的php設置中,string_splash設置爲ON,這就是爲什麼當字符串從表單傳遞時 - 它已經被刪除了......現在你使用了mysql_real_escape_string - 它可以「excape character」以及單引號。這就是爲什麼有三條斜槓..

嘗試使用此功能 - 我用了很多

function sanitize($value) 
{ 
    if(get_magic_quotes_gpc()) 
    { 
      $value = stripslashes($value); 
    } 
    //check if this function exists 
    if(function_exists("mysql_real_escape_string")) 
    { 
      $value = mysql_real_escape_string($value); 
    } 
    //for PHP version < 4.3.0 use addslashes 
    else 
    { 
      $value = addslashes($value); 
    } 
    return $value; 
} 

它不是專門爲PHP 4或以上的年...該功能的工作原理逃避串並確保它不會加倍逃脫它(這是個問題beign問)

如果(function_exists(「mysql_real_escape_string」)) - 這條線如果數據庫連接是逃逸可用,

的是其他部分,如果條件品牌確定它的工作,如果dat基地連接不可用和PHP 4的支持是隻加了好處...

+0

你爲什麼會認爲他需要php4支持? –