You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

mysqli_real_escape_string使用异常:插入普通字符串正常但Cookie值失败

问题分析与解决方案

你遇到的问题核心是SQL语句的语法错误——字符串类型的字段值在插入时需要用单引号包裹,但你的代码里没有给$firstname加上单引号,导致数据库无法正确解析这条插入语句。

为什么直接插'hello'能成功?

当你直接写VALUES ('hello')时,字符串被单引号包裹,符合SQL的语法规范,所以数据库能正确执行。但用变量$firstname时,你的代码生成的SQL语句会变成类似INSERT INTO table (firstname) VALUES (张三),这里的张三没有引号,数据库会把它当成一个字段名或者关键字,自然执行失败。

修正后的基础版代码

你可以给变量加上单引号来快速修复这个问题:

$con = mysqli_connect("", "root", "", "db"); 
$firstname = mysqli_real_escape_string($con, $_COOKIE['firstname']); 
$sql = "INSERT INTO table (firstname) VALUES ('$firstname')"; // 给$firstname添加单引号
mysqli_query($con, $sql);

更安全的进阶方案:使用预处理语句

虽然mysqli_real_escape_string能一定程度防止SQL注入,但使用预处理语句是更可靠的做法,还能彻底避免这类语法问题:

$con = mysqli_connect("", "root", "", "db"); 
// 准备预处理语句
$stmt = mysqli_prepare($con, "INSERT INTO table (firstname) VALUES (?)");
// 绑定参数(s表示字符串类型)
mysqli_stmt_bind_param($stmt, "s", $_COOKIE['firstname']);
// 执行语句
mysqli_stmt_execute($stmt);
// 关闭资源
mysqli_stmt_close($stmt);
mysqli_close($con);

另外,调试时建议加上错误检查,用mysqli_error($con)查看具体的SQL错误信息,能帮你更快定位问题:

$result = mysqli_query($con, $sql);
if (!$result) {
    echo "SQL错误详情: " . mysqli_error($con);
}

内容的提问来源于stack exchange,提问作者Code Zilla

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:51:14