繁体   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