2012-12-07 30 views
0

我有我通过以下几种运行后变量:PHP mysqli_real_escape_string问题

$input_name = mysqli_real_escape_string($dbc, trim($_POST['input_name'])); 

我已经运行几个测试,我回声$ input_name和其他类似变量插入查询执行之前。回声表明他们确实正在逃脱,因为他们应该。

但是,当我登录到phpmyadmin查看我在DB中的条目时,发现应该转义的字符不是。我在这里遇到问题吗?在我的变量声明和我不知道的查询之间发生了什么?

是否有PHP或服务器设置可能会影响到这?

注意:我知道PDO是要走的路,我只是不在这个特定时刻。

+0

该函数会将诸如“hel'lo”之类的内容更改为“hel \ lo”,使其可以安全地插入到数据库中,一旦它进入数据库,它将再次看起来像“hel'lo”,但会有已插入并且不会导致SQL错误。 – Dale

+0

你逃脱了一些东西,并将它连接到你的'INSERT'查询字符串,插入的东西将*看起来不像转义。想想'insert into blah(field)VALUES(“This is \”stupid \“”)',它会插入'This is“stupid”'but * not *'这是\“stupid \”'。 –

+0

我建议如果你正在与mysqli让你跳过的箍环战斗,并且它非常糟糕,你必须发布到SO来解决它,这是开始查看PDO的一个理想时间。 –

回答

1

回声表明他们确实正在逃脱,因为他们应该。

这表示您的角色已被转义。

当我登录到phpMyAdmin来看看我在DB的条目

,我看这应该是转义字符不

现在,当你在逃避,你要这些字符手段,因为它是相当比PHP或你的数据库将它们内部作为分隔符。

就像你想在你的输入中输入'那样,所以你正在逃避它。 因此,现在当数据库(mysql)发现它已被转义,因此它不会将其视为用于MySQL中字符串文字的single quote

如果你不逃避它,那么MySQL将把两个'之间的所有部分视为字符串文字。

所以一切都很好,不用担心。

1

的*在PHP _real_escape_string功能只有在那里,以防止SQL注入为此它只会改变“到\”和“到\”,使下面的查询:

SELECT * FROM users WHERE pass = '' OR '1'='1 -- 

将变为:

SELECT * FROM users WHERE pass = '\' OR \'1\'=\'1 -- 

因此注入的值不起作用。