我创建的页面,其中用户输入评论,并将评论插入到数据库(Mysql)。这些注释可以包含单引号、双引号或任何特殊字符。为了避免这些问题,我使用了以下代码
$str = mysql_real_escape_string($str,$conn);其中$conn是活动连接资源,$str是文本区域中的字符串内容
这可以很好地工作,并返回完全转义的字符串,我可以将其插入到DB中。但是,如果用户在文本编辑器(如openoffice writer或msword )中键入他/她的注释,并使用其中的文本,则会发生错误,并在插入数据库时显示如下错误
Incorrect string value: '\x93testi...' for column 'commnets' at row 1我认为这是因为来自文本编辑器(openoffice,msword)的文本中的单双引号没有正确转义。那么我如何转义它以将其插入到DB中呢?请帮帮我
提前感谢……
发布于 2012-01-14 11:39:44
您没有提交要保存在数据库中的有效UTF8字符串。相反,它可能是一个特定于windows的字符集。
假设您的用户通过web页面提交文本-您需要确保您在UTF8中提供页面,并且当表单提交时,它也是在UTf8中(如果页面在UTF8中提供,则在默认情况下)。
您需要:
确保在报头中发送UTF-8字符集。
header("Content-Type:text/html;charset=UTF-8");
和/或在页面的部分中设置内容类型
顺便说一句,mysql_real_escape_string与这里的问题没有任何关系。该函数用于防止包含常规引号的字符串被用来进行SQL注入攻击,无论如何,使用预准备语句可以更好地解决这一问题。
发布于 2014-03-12 12:16:11
有一种方法可以避开所有这些supplied并将实际提供的内容注入到real_escape中,那就是使用mysql的能力将任意长度的十六进制数解释为字符串。
例如:
$query=sprintf("update module set code=0x%s where id='%d'", bin2hex($code), $id);即使code是BLOB类型的二进制字段并且$code是全二进制数据(例如,图像文件内容),这也是有效的。
您还可以使用此代码避开任何sql注入。我发现使用sprintf来格式化查询是非常强大和安全的,并且使用php bin2hex()可以使任何内容(包括二进制)都能够不受影响地进入数据库。
把它弄出来是另一回事,请注意..
https://stackoverflow.com/questions/8802170
复制相似问题