5

我正在使用 PHP 向我的 MySQL 数据库提交一个表单。

我正在通过该mysql_real_escape_string($content)函数发送表单数据。

当条目出现在我的数据库中时(检查 phpMyAdmin),我所有的双引号和单引号都被转义了。

我相当确定这是一个 PHP 配置问题?

所以:

$content = 'Hi, my name is Jascha and my "favorite" thing to do is sleep';
mysql_real_escape_string($content);
$query = 'INSERT INTO DB...'

在我的数据库中显示为:

嗨,我的名字是 Jascha,我“最喜欢”的事情就是睡觉

我告诉谁该做什么?(我无法访问 php.ini)。

4

3 回答 3

6

如果您从表单中获取 $content 数据(而不是 PHP 代码中的“原样”),那么您可能会因为魔术引号而遇到问题(请参阅参考资料magic_quotes_gpc

基本上 :

当 magic_quotes 打开时,所有' (单引号)、"(双引号)、\ (反斜杠)和 NUL 都会自动用反斜杠转义

如果启用了魔术引号(例如,您可以在 的输出中检查这一点phpinfo(),您将获得那种“双重转义”:

  • 这些字符将被魔术引号转义一次,
  • 然后,他们将再次逃脱mysql_real_escape_string


在这种情况下,好的解决方案不是停止使用mysql_real_escape_string,而是在您的配置中禁用 magic_quotes_gpc ...

...但是,由于您无权访问它,您实际上必须“恢复”魔术引号的效果,在开始使用它之前调用stripslashes您获得的输入作为$_GETand 。$_POST

注意:这是(引用)手册页上给出的建议:mysql_real_escape_string

注意:如果magic_quotes_gpc启用,首先应用 stripslashes()到数据。对已经转义的数据使用此函数将两次转义数据。

于 2010-02-17T20:30:55.047 回答
5

在检索请求数据时,您需要考虑魔术引号。如果get_magic_quotes_gpc()true,那么您需要stripslashes()在输入上运行。最好的方法是为此编写一个函数。就像是:

function get_string($array, $index, $default = null) {
    if (isset($array[$index]) && strlen($value = trim($array[$index])) > 0) {
        return get_magic_quotes_gpc() ? stripslashes($value) : $value;
    } else {
        return $default;
    }
}

..您可以用作

$input = get_string($_POST, 'input');

..代替

$input = $_POST['input'];

get_number()对诸如,get_boolean()等琐碎的东西做同样的事情get_array()

于 2010-02-17T20:35:30.813 回答
-1

我知道这有点晚了,但作为 php 的菜鸟,我需要一些非常简单的东西。所以我使用下面的代码来解决 OP 用 magic_quotes_gpc 描述的问题 我有一台运行 php 5.2.8 的服务器和一台运行 5.3 的服务器

我的网络应用程序正在使用 datatables.net 来显示信息。当使用在数据库中转义的特殊字符保存数据时,我开始收到 JSON 错误。

我的开发机器使用 5.3,这不是必需的,但是对于 php 5.2.8,我需要使用 stripslashes 函数才能将值保存到我的数据库中。

$description = mysql_real_escape_string($description);
// hack for php 5.2.8 //
if (get_magic_quotes_gpc()) {
     $description = stripslashes($description); 
     //echo "description: $description";
    }

我意识到这与上面的答案基本相同,但对我来说,这似乎更像是我的风格。希望这将帮助与我在同一条船上的其他人......

于 2010-07-16T05:43:42.787 回答