我正在创建用户输入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中。请帮帮我
提前致谢.....
答案 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()可以渲染任何包含二进制文件的内容,无法进入无数据库。
把它拿出来是另一回事你......