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

PHP操作MySQL插入数据时name、type字段写入失败排查

问题修复方案

name、type字段无法写入数据库是后端逻辑缺失、参数绑定顺序错误、前端表单单选框写法错误三个问题共同导致的,按以下步骤修改即可:

一、修复PHP后端逻辑

1. 补全变量初始化

原代码没有初始化$type和对应的错误提示变量,把开头的变量初始化部分替换为:

// 定义变量并初始化为空值
$name = $phone = $password = $confirm_password = $type = "";
$name_err = $phone_err = $password_err = $confirm_password_err = $type_err = "";

2. 新增name字段校验逻辑

原代码完全没有接收、校验name输入框的传值,在手机号校验逻辑之后、密码校验逻辑之前,加入以下代码:

// 校验姓名
if(empty(trim($_POST["name"]))){
    $name_err = "请输入姓名";
} elseif(mb_strlen(trim($_POST["name"])) > 50){
    $name_err = "姓名长度不能超过50个字符";
} else{
    $name = trim($_POST["name"]);
}

3. 新增type字段校验逻辑

原代码完全没有接收单选框的type传值,在确认密码校验逻辑之后、入库判断之前,加入以下代码:

// 校验身份类型
if(empty($_POST["type"])){
    $type_err = "请选择身份类型";
} else{
    $post_type = trim($_POST["type"]);
    // 白名单校验,仅允许固定两个值,防止非法输入
    if($post_type != 'patient' && $post_type != 'doctor'){
        $type_err = "身份类型选择非法";
    } else{
        $type = $post_type;
    }
}

4. 修复数据库插入的参数绑定逻辑

原代码存在两个致命问题:先绑定参数再给参数赋值、绑定的$name和$type变量为空值,把原有的入库判断代码替换为:

// 所有字段校验无错误才执行插入
if(empty($name_err) && empty($phone_err) && empty($password_err) && empty($confirm_password_err) && empty($type_err)){
    
    $sql = "INSERT INTO users (name, phone, password, type) VALUES (?, ?, ?, ?)";
     
    if($stmt = mysqli_prepare($link, $sql)){
        // 先给所有预处理参数赋值
        $param_name = $name;
        $param_phone = $phone;
        $param_password = password_hash($password, PASSWORD_DEFAULT);
        $param_type = $type;

        // 按INSERT语句的字段顺序绑定参数,类型和顺序必须一一对应
        mysqli_stmt_bind_param($stmt, "ssss", $param_name, $param_phone, $param_password, $param_type);
        
        if(mysqli_stmt_execute($stmt)){
            header("location: login.php");
            exit(); // 跳转后必须终止后续代码执行
        } else{
            echo "系统繁忙,请稍后再试";
        }

        mysqli_stmt_close($stmt);
    }
}

额外修复原代码小bug:原手机号校验正则/^[a-zA-Z0-9_]+$/和提示“手机号只能包含数字”不符,如果需要校验国内手机号格式,可以替换为/^1[3-9]\d{9}$/

二、修复HTML表单单选框逻辑

原单选框存在三个问题:value值绑定了空的$type变量导致传值为空、label和input未关联、默认选中写死无法回显。把type单选部分的代码替换为:

<div class="form-group">
    <h4 style="color:grey;">请选择你的身份</h4><br>
    <input class="input3" type="radio" name="type" id="control_01"
           value="patient" <?php echo ($type == 'patient') ? 'checked' : ''; ?> />
    <label class="label" for="control_01">
        <h6>我是患者</h6>
    </label>
    <br>
    <input class="input3" type="radio" name="type" id="control_02"
           value="doctor" <?php echo ($type == 'doctor') ? 'checked' : ''; ?>>
    <label class="label" for="control_02">
        <h6>我是医生</h6>
    </label>
    <span class="invalid-feedback"><?php echo $type_err; ?></span>
</div>

前置检查

修改代码前先确认数据库的users表已经提前创建了name和type两个varchar类型字段,字段长度足够存储内容,没有设置非空且无默认值的约束,否则插入会失败。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 17:15:43