我有一个mysql数据库,其中包含以HTML段落和按钮显示的问题和答案。 q& a包含许多特殊字符,例如é,...,',“,ö以及一些html标签,例如sup。
我尝试了mysqli_real_escape_string,htmlentities并添加了反斜杠,但有些字符在页面上显示不正确。有时它在段落中是正确的但在按钮上是不正确的。
用于使所有这些特殊字符正确显示的正确函数是什么?我何时应该使用它(当插入数据库或从数据库中选择/使其成为HTML时?
非常感谢
答案 0 :(得分:3)
字符集和整理
正如其他人所说,你的一个问题可能是字符集和整理。您需要确保正确配置整个链(输入,存储和输出)以处理您正在使用的字符。 UTF-8通常是一个不错的选择,因为它可以处理Unicode字符集中的每个字符。
使用不区分大小写的排序规则使用UTF-8创建MySQL数据库或表:
CREATE DATABASE mydb
DEFAULT CHARACTER SET utf8
DEFAULT COLLATE utf8_general_ci;
CREATE TABLE mytable ( ... )
DEFAULT CHARACTER SET utf8
DEFAULT COLLATE utf8_general_ci;
<强>逃逸强>
mysql_real_escape_string(我假设您使用的是PHP)用于帮助MySQL解析器区分您的参数和SQL关键字。当整个SQL命令作为单个字符串提供时使用它:
INSERT INTO mytable VALUES ("this \" is a double quote");
需要反斜杠来帮助MySQL理解字符串中间的双引号实际上是字符串中间的文字双引号,而不是结束双引号。
通过在将数据插入数据库之前转义数据,您将直接更改数据:您不再存储原始数据,因此当您从数据库中检索数据时必须再次处理它(以取消它)。
准备好的陈述
为了让您和Mysql更容易,您可以使用prepared statements代替。准备好的语句使用占位符来向MySQL显示SQL语句的哪些部分是您的参数:
$stmt = $dbh->prepare("INSERT INTO mytable VALUES (?)");
$stmt->execute(array('this " is a double quote'));
通过使用预准备语句,您可以不加修改地将数据插入数据库 - 不需要杂乱的转义。这具有显着降低SQL注入可能性的附加优点。有关此主题的更多信息,请参阅Bill Karwin's Sql Injection Myths and Fallacies talk和slides。
<强>输出强>
现在您的数据以原始格式存储,您可以根据需要随意输出数据。如果要输出HTML(显示为文字HTML),则需要在输出之前将其转义。有很多方法可以做到这一点,包括htmlspecialchars和HTML Purifier。您选择哪种方法取决于数据来源,以及您希望如何显示数据。
答案 1 :(得分:0)
如果您确保您的数据库编码和页面编码是UTF-8,那么这应该有助于大部分时间。
答案 2 :(得分:0)
我怀疑问题出在正在使用的字符集中。您的mysql排序规则需要支持您尝试使用的字符,并且您的网页需要使用匹配的字符集。
最有可能的是,您的MySQL数据库正在使用诸如latin1_general_ci之类的排序规则,而您的网页应该以UTF-8显示。我建议你设置MySQL以UTF-8存储数据,你的网页应输出一个标题,说明它们是UTF-8。