mysql_real_escape_string奇怪的撇号行为?

时间:2012-05-15 09:00:26

标签: php str-replace mysql-real-escape-string

我有一个表单,用户输入eg(在字符串末尾注意撇号)

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顺便关闭

如果我不使用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'

好的,进一步编辑:

我试过了:

$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\\

我只是想摆脱撇号,显然其他地方正在发生,但是它让我了!

3 个答案:

答案 0 :(得分:2)

这是怎么回事:

mysql_real_escape_string通过在转义字符前添加斜杠来转义应转义的所有字符。但是只添加一个斜杠会导致将字符存储在DB中未转义,因此在插入之前必须转义斜杠...

这就是你My BDay\\\'的原因。如果此值存储在数据库中,则最终结果为My BDay\'

但是当你做str_replace("'", "", 'My BDay\\\'');时,你最终会得到My BDay\\\,并且在致电stripslashes之后你会得到My BDay\ - 这绝对是正确的!

所以在调用mysql_real_escape_string之后不要理会字符串的样子,只需将该值存储到数据库中并在检索之后再次使用My BDay' ...

编辑如何在致电stripslasshes后从这三个斜线中只看到一个斜杠?该函数从字符串的开头到结尾,并查找任何斜杠转义字符以删除转义斜杠。所以它找到前两个斜杠并删除一个,但仍然有两个遗骸(刚刚处理过的那个和第三个),所以它会处理它找到的下两个slasshes,这将导致只剩下一个斜杠......

如果您在字符串My BDay\\\'上调用stripslashes - 这将导致My BDay' ...

EDIT2 我的不好......接下来的两个斜杠可能是因为您magic_quotes_gpc开启 - 关闭或拨打mysql_real_escape_string(stripslashes($string))

答案 1 :(得分:0)

一条斜线逃脱撇号,另一条逃脱逃避撇号的斜线。

mysql内部解释了''how'

答案 2 :(得分: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问)

if(function_exists(“mysql_real_escape_string”)) - 如果数据库连接可用,此行将转义

否则,如果条件确保它在数据库连接不可用时有效,并且仅添加了php 4支持...