表单输入单/双引号致程序异常,寻求转义/实体编码解决方案
解决表单输入引号导致程序异常的问题
我来帮你搞定这个表单输入引号就炸的问题~首先咱们先理清根源:你遇到的异常大概率不是数据库存储环节的问题(毕竟你已经用了mysql_real_escape_string()做SQL注入防护),而是把数据输出到HTML页面时,引号和HTML语法冲突导致的——比如把带引号的内容放到<input>的value属性里,会直接破坏HTML结构,引发页面渲染或JS异常。
下面给你针对性的解决方案:
一、核心解决思路:输出时转义为HTML实体
当你从数据库取出数据并展示到页面上时,必须用HTML转义函数把特殊字符(包括单双引号)转换成对应的实体,推荐用htmlspecialchars(),它能直接把'转成'、"转成",完美解决HTML语法冲突问题。
代码修改示例
假设你查询后要输出某个字段(比如title)到页面的输入框里,原来的写法可能是:
<input type="text" value="<?php echo $row_ver['title']; ?>">
改成下面这样,加上htmlspecialchars()并指定ENT_QUOTES参数(这个参数会同时转义单引号和双引号):
<input type="text" value="<?php echo htmlspecialchars($row_ver['title'], ENT_QUOTES); ?>">
如果是直接输出文本内容到页面,同样可以用这个方法,既能解决引号问题还能避免XSS攻击:
echo htmlspecialchars($row_ver['content'], ENT_QUOTES);
二、关于你提到的其他方法的说明
addslashes():这个函数主要是给引号加反斜杠(比如把'变成\'),但它是为PHP字符串解析服务的,不适合用来处理HTML输出,反斜杠在HTML里会变成多余的显示内容,所以不推荐用它解决你的问题。htmlentities():和htmlspecialchars()类似,但它会转义更多的特殊字符(比如重音符号),如果你的内容没有特殊语言需求,htmlspecialchars()足够用且性能更好。
三、额外建议:升级数据库扩展
注意你现在用的mysql_*系列函数已经在PHP 5.5之后被废弃,并且在PHP 7里被移除了,为了代码的安全性和兼容性,建议尽快迁移到mysqli或者PDO,并且使用预处理语句来处理SQL查询,这比手动转义更安全可靠。比如用mysqli的预处理写法:
if (isset($_POST['key'])) { mysqli_select_db($dbprotect, $database_dbprotect); $stmt = mysqli_prepare($dbprotect, "SELECT * FROM $bloc_news_entreprise WHERE `key` = ?"); mysqli_stmt_bind_param($stmt, "s", $_POST['key']); mysqli_stmt_execute($stmt); $result = mysqli_stmt_get_result($stmt); $row_ver = mysqli_fetch_assoc($result); // ...后续处理 }
内容的提问来源于stack exchange,提问作者ZeroCool
相关产品推荐
相关产品推荐

