“和”的MySQL / PHP问题

时间:2009-05-14 18:58:02

标签: php mysql collation

我创建了一个简单的新闻系统,其中包含使用PHP和MySQL的评论,它在我的Fedora 10计算机和我的Windows 7计算机上的本地Apache服务器上运行良好。现在我遇到了一个问题,我把它上传到了一个网络主机,它不断地将所有'和'作为\'和\“返回。”

我相信这可能是出于安全原因自动添加它们的Web主机,或者MySQL是错误的排序规则,但是我还没有解决它,测试多个MySQL排序规则。

以下是查询示例:

mysql_query("INSERT INTO news (title, poster, text, time) VALUES ('$newstitle', '1', '$newstext', '$time')") or die(mysql_error());

$timetime(); $newstitle$newstext是从$_POST解析的,并且在我运行查询之前都运行mysql_real_escape_string()(我想这可能是问题所在,但因为它是安全我只是不想删除它,因为它不会导致本地服务器出现问题)

最后一点:在我的本地apache服务器上,我latin1_swedish_ci无法在网络主机服务器上运行。

修改

它们在数据库中看起来像这样:

\'\'\'\"\"\"

虽然在我的本地,他们没有额外的反斜杠,所以它必须是PHP添加它。有没有办法解决这个问题,除了添加一个删除额外反斜杠的函数?

7 个答案:

答案 0 :(得分:7)

这些额外的反斜杠可能是Magic Quotes。在处理数据之前尝试disable them or remove them

答案 1 :(得分:4)

编辑:如下所述,在评论中,正确的方法是禁用魔术引号。如果我在回复之前完全阅读并理解了这个问题,那么这可能会更好;)


mysql_real_escape_string()将执行它所说的内容,并转义字符串中的相关字符。转义引号是通过在它们前面加上转义字符(PHP中的反斜杠和许多其他语言)来完成的。 当您从数据库中提取数据时,请执行类似内容的stripslashes()(请参阅PHP doc),以删除引号之类的斜杠。

编辑:正如Gumbo所提到的,也可能是因为服务器上启用了Magic Quotes。您应该停用这些as per his answer

答案 2 :(得分:4)

不,你不想运行stripslashes()。而是正确设置服务器。

首先,关闭magic_quotes。这意味着进入脚本的任何数据都不会被转义。

然后对数据运行mysql_real_escape_string(),它将仅为查询添加斜杠,并将数据存储在数据库中而不会使用斜杠。

当你再次加载数据时,你会很高兴,并且引号周围不会出现任何反斜杠。

答案 3 :(得分:3)

查看您的magic_quotes设置,并在服务器上进行比较。您的家庭服务器可能已禁用magic_quotes(因为它们应该是,因为当前版本的PHP中为Magic Quotes is deprecated),并且您的Web主机可能已启用它们(这很常见)。您可以使用:

<?php echo phpinfo(); ?>

进行快速比较。

如果magic_quotes对您而言是新手,您可能需要在部署任何您关心的内容之前更多地研究PHP安全性。

Questions containing "magic_quotes"

答案 4 :(得分:2)

您的主机可能已启用Magic Quotes

答案 5 :(得分:2)

看看magic_quotes_gpc。你可以通过.htaccess关闭它并使用mysql_real_escape_string()。

答案 6 :(得分:-1)

真正的解决方案是在插入查询中使用预准备语句。

这是一个顶部插入示例的网站。

Prepared Statements in PHP

好处是它是一种最佳实践,副作用是你不再需要担心清除SQL注入攻击的输入。