插入含单引号/撇号数据时MySQL转义异常问题排查
解决MySQL预处理插入时出现多余转义符的问题
看起来你的问题核心是双重转义或者服务器开启了旧的魔术引号特性,结合你使用的mysqli预处理语句,我们一步步来解决:
1. 立即停止手动转义操作
你尝试的mysqli_real_escape_string和str_replace都是多余的——因为mysqli预处理语句(bind_param)会自动安全处理引号/撇号的转义,不需要手动再做转义操作。手动转义反而会让数据库把转义符\也存储进去,导致你看到的\"teste\"这类异常结果。
所以先删掉这两行无效且添乱的代码:
// 请删除这两行! // $Descricao= mysqli_real_escape_string($conn, $Descricao); // $Descricao= str_replace("'","\'", $Descricao);
2. 检查并关闭魔术引号(magic_quotes_gpc)
这是PHP的旧特性(PHP 5.4及以上版本已移除,但部分老服务器环境可能仍开启),它会自动对POST/GET/COOKIE的参数添加转义符。如果开启了这个特性,预处理语句会再做一次转义,就造成了双重转义的问题。
检查是否开启
在你的PHP脚本开头加入这段代码,查看输出结果:
var_dump(get_magic_quotes_gpc());
如果输出bool(true),说明魔术引号是开启状态。
解决方法
- 优先修改php.ini:找到配置项
magic_quotes_gpc = On,改成magic_quotes_gpc = Off,然后重启服务器。 - 无法修改配置时的临时方案:在接收POST参数时先去除自动添加的转义:
// 处理Descricao参数 if (get_magic_quotes_gpc()) { $Descricao = stripslashes($_POST["Descricao"]); } else { $Descricao = $_POST["Descricao"]; } // 其他POST参数如果有同样问题,也按此方式处理 $DataConsulta = get_magic_quotes_gpc() ? stripslashes($_POST["DataConsulta"]) : $_POST["DataConsulta"]; $CodigoUtente1 = get_magic_quotes_gpc() ? stripslashes($_POST["CodigoUtente1"]) : $_POST["CodigoUtente1"];
3. 确保数据库连接字符集正确
字符集不匹配也可能引发奇怪的转义问题,建立数据库连接后,添加一行设置字符集的代码:
// 连接数据库后执行 $conn->set_charset("utf8"); // 或者使用 mysqli_set_charset($conn, "utf8");
验证结果
完成以上步骤后,再测试插入带引号的文本(比如Este é outro "teste". Outro 'teste'),数据库里应该就能存储正确的内容,不会出现多余的\了。
内容的提问来源于stack exchange,提问作者Bruno
相关产品推荐
相关产品推荐

