0

我有一个表格,用户输入例如(注意字符串末尾的撇号)

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

我只是想摆脱撇号,显然这里发生了其他事情,但它让我!

4

3 回答 3

3

发生的事情是这样的:

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

这就是为什么你有My BDay\\\'。如果将此值存储到数据库中,则最终结果将为My BDay\'.

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

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

编辑你是如何在打电话后从三个中得到一个斜线的stripslasshes?该函数从字符串的开头到结尾,查找任何斜线转义字符以删除转义斜线。所以它找到前两个斜线并删除一个,但仍然有两个(刚刚处理的一个和第三个),所以它处理它发现的接下来的两个斜线,这将导致只剩下一个斜线......

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

EDIT2我的错...添加了接下来的两个斜杠可能是因为您已magic_quotes_gpc打开 - 将其关闭或调用mysql_real_escape_string(stripslashes($string))

于 2012-05-15T09:13:19.867 回答
0

在您的 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 或更早的年份...该函数用于转义字符串并确保它不会双重转义它(这是被问到的问题)

if( function_exists( "mysql_real_escape_string" ) ) - 如果数据库连接可用,则此行转义并且

否则,如果条件确保它在数据库连接不可用并且添加 php 4 支持仅受益时可以工作...

于 2012-05-15T09:32:39.993 回答
0

一个斜线用来逃避撇号,另一个用来逃避逃避撇号的斜线。

mysql在内部解释\'how'

于 2012-05-15T09:12:50.360 回答