如何修复MySQL报错You have an error in your SQL syntax
问题排查
- 语法错误直接原因:
answer字段属于字符串类型,你直接将$_POST['answer']拼接到SQL语句中时没有加单引号包裹,一旦用户提交的内容包含非数字字符、特殊符号(比如你报错里的!)就会破坏SQL的语法结构,触发语法报错。另外你不需要给now()套SELECT子查询,直接写now()即可。 - 严重安全风险:直接把
$_SESSION['id']、$_POST['answer']这类外部可控变量拼接进SQL语句,存在高危SQL注入漏洞,攻击者可以通过构造特殊提交内容篡改数据库、窃取数据,甚至拿到服务器权限,绝对不能使用这种写法。
修复代码(使用预编译语句规避注入+解决语法问题)
$connection = mysqli_connect("XXX", "XXX", "XXX", "XXX"); if (isset($_POST['answer'])) { // 预编译SQL语句,用?作为参数占位符 $stmt = mysqli_prepare($connection, "INSERT INTO `answers`(`questionId`, `dateAndTime`, `answer`) VALUES (?, NOW(), ?)"); // 绑定参数,i对应int类型,s对应string类型,按占位符顺序对应变量 mysqli_stmt_bind_param($stmt, "is", $_SESSION['id'], $_POST['answer']); // 执行语句 if (!mysqli_stmt_execute($stmt)) { echo "Error description: " . mysqli_stmt_error($stmt); } // 关闭语句对象 mysqli_stmt_close($stmt); }
内容的提问来源于stack exchange,提问作者Huberti
相关产品推荐
相关产品推荐

