簡體   English   中英

mysql_real_escape_string奇怪的撇號行為?

[英]mysql_real_escape_string strange apostrophe behaviour?

我有一個表單,用戶輸入了例如(在字符串末尾注意撇號)

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\

有什么想法嗎? 我只是想剝去撇號和斜線,但不知何故

magic_quotes_gpc順便說一句

如果我不使用反斜杠,那么將其留給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\\

我只是想擺脫撇號,顯然這里還有其他事情在發生,但它引起了我的注意!

這是怎么回事:

mysql_real_escape_string通過在要轉義的字符前添加斜杠來轉義所有應轉義的字符。 但是僅添加一個斜杠將導致在數據庫中存儲未轉義的字符,因此在插入之前也必須轉義斜杠...

這就是為什么您擁有My BDay\\\\\\' 如果將此值存儲到數據庫中,則最終結果將是My BDay\\'

但是當您執行str_replace("'", "", 'My BDay\\\\\\''); 您將結束My BDay\\\\\\和調用后stripslashes這個你會得到My BDay\\ -這是絕對正確的!

因此,在調用mysql_real_escape_string ,不必理會字符串的樣子,只需將該值存儲到數據庫中,並在檢索到它之后,您將再次以My BDay'結尾...

編輯在調用stripslasshes后,您如何只從三個斜線中stripslasshes 該函數從字符串的開頭到結尾,並查找任何使用斜杠轉義的字符以刪除轉義的斜杠。 因此它找到了前兩個斜杠並刪除了一個,但仍然剩下兩個(一個剛處理過,另一個第三個),因此它處理接下來發現的兩個斜線,結果將只剩下一個斜杠...

如果您在字符串My BDay\\\\\\'My BDay\\\\\\' -這將導致My BDay' ...

EDIT2我不好...下兩個斜杠被添加,可能是因為您具有magic_quotes_gpc ON-將其關閉或調用mysql_real_escape_string(stripslashes($string))

一個斜杠逃脫撇號,另一個逃脫斜杠逃脫撇號。

在內部mysql解釋\\'如何'

在您的php設置中,string_splash設置為ON,這就是為什么從表單傳遞字符串時-它已經被排除了...現在,您使用mysql_real_escape_string-可以排除“ excape字符”以及單引號。 這就是為什么三個斜杠..

嘗試使用此功能-我經常使用

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提出的問題)

if(function_exists(“ mysql_real_escape_string”))-如果數據庫連接可用,則此行轉義,並且

否則,如果條件確保數據庫連接不可用並且php 4支持僅受惠,則確保其工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM