PHP向MariaDB提交请求时SQL语法错误求助
排查SQL语法错误及解决方案
Hey Nico,别担心,我帮你找出问题所在了!你遇到的SQL语法错误是因为INSERT语句里有两处明显的语法问题,另外还有个严重的安全隐患需要一起修复:
1. 直接触发错误的语法问题
看你代码里的INSERT语句:
if(!mysqli_query($mysqli,"INSERT INTO membres SET pseudo='".$_POST['pseudo']."',mail='".$_POST['mail'].", mdp='".md5($_POST['mdp'])."'," )){
这里有两个致命错误:
mail='".$_POST['mail']."这部分少了一个闭合的单引号,正确写法应该是mail='".$_POST['mail']."'- 语句末尾多了一个多余的逗号,
mdp='".md5($_POST['mdp'])."',里的逗号必须去掉,因为后面没有其他字段需要赋值了
修正后的基础语句应该是:
"INSERT INTO membres SET pseudo='".$_POST['pseudo']."', mail='".$_POST['mail']."', mdp='".md5($_POST['mdp'])."'"
2. 必须修复的安全隐患:SQL注入
你现在直接把用户输入的$_POST参数拼接到SQL语句里,这会导致严重的SQL注入漏洞——恶意用户可以通过构造特殊输入篡改甚至删除你的数据库数据。强烈建议使用预处理语句(Prepared Statements),这是防止SQL注入的标准做法。
用预处理语句重构后的代码示例:
else { // 使用预处理语句插入数据 $stmt = $mysqli->prepare("INSERT INTO membres (pseudo, mail, mdp) VALUES (?, ?, ?)"); // 绑定参数:s代表字符串类型,三个参数对应SQL里的三个? $stmt->bind_param("sss", $_POST['pseudo'], $_POST['mail'], md5($_POST['mdp'])); if($stmt->execute()){ echo '<a id="annotation">注册成功!</a>'; // 注意:echo输出内容后再调用header可能失效,建议调整顺序或直接跳转 header('Location: postedecontrole.php'); exit; // 跳转后必须终止脚本执行,避免后续代码运行 } else { echo '发生错误: '. $stmt->error; } $stmt->close(); }
额外小建议
- 不要用
md5加密密码,md5已经被证明不安全,推荐使用PHP内置的password_hash()和password_verify()来处理密码存储与验证 - 可以给表单输入框加上
required属性,在前端先做必填项验证,减轻后端压力 - 你当前代码里的
echo和header顺序有问题,HTTP跳转头必须在任何输出内容之前发送,否则可能导致跳转失效
内容的提问来源于stack exchange,提问作者Nico
相关产品推荐
相关产品推荐

