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
相关产品推荐
相关产品推荐

