mysql_real_escape_string无法转义特殊字符,因为文本来自文本编辑器

时间:2012-01-10 10:58:51

标签: php mysql string

我正在创建用户输入commnets的页面,并将注释插入到DB(mysql)中。这些注释可以包含单引号,双引号或任何特殊字符。为了逃避这些,我使用了以下代码

 $str = mysql_real_escape_string($str,$conn);

这里$ conn是活动连接资源,$ str是来自textarea的字符串内容

这很好用并返回完全转义的字符串,我可以插入到DB中。但是,如果用户在openoffice writer或msword等文本编辑器中输入他/她的注释并使用此文本,则会在插入DB时发生错误并给出错误

Incorrect string value: '\x93testi...' for column 'commnets' at row 1

我认为这种情况正在发生,因为来自文本编辑器(openoffice,msword)的文本中的单双引号未正确转义。那么如何将其转义以将其插入到DB中。请帮帮我

提前致谢.....

2 个答案:

答案 0 :(得分:0)

您没有提交要保存在数据库中的有效UTF8字符串。相反,它可能是一个特定于Windows的字符集。

大概您的用户通过网页提交文本 - 您需要确保以UTF8提供页面,并且在提交表单时,它也是UTf8(如果页面是提供的,默认情况下将是在UTF8)。

你需要:

确保您在标题中发送UTF-8字符集。

header(“Content-Type:text / html; charset = UTF-8”);

和/或在您网页的部分设置内容类型

btw mysql_real_escape_string与这里的问题无关。该函数用于防止包含正常引号的字符串被用于执行SQL注入攻击,无论如何通过使用预准备语句可以更好地解决这个问题。

答案 1 :(得分:0)

有一种方法可以回避所有这个real_escape malarkey并注入实际提供的INTO sql,这就是使用mysql的能力将任意长度的十六进制数解释为字符串。

e.g。

$query=sprintf("update module set code=0x%s where id='%d'", bin2hex($code), $id);

即使code是BLOB类型的二进制字段而$ code是完整的二进制数据(例如,图像文件内容),这也有效。

你也将回避任何sql注入。 我发现使用sprintf来格式化查询是非常强大和安全的,并且使用php bin2hex()可以渲染任何包含二进制文件的内容,无法进入无数据库。

把它拿出来是另一回事你......