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

