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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 06:39:24