PHP表单入库正常 动态下拉框无法获取角色选项值问题排查
动态下拉框无法拉取选项的修复方案
现有代码的错误点
- 查表逻辑错误:角色选项存储在
user_role表,原代码错误查询了user_info用户表,自然拿不到role_name字段 - 变量未定义:原代码写了无效的冗余查询语句,实际执行查询调用的
$sql变量从未被赋值,数据库查询根本没有正常执行;且冗余的mysqli_query("SELECT * FROM user_info")没有传入数据库连接参数,本身就会触发参数错误 - 表单元素缺失属性:
<select>标签没有设置name="role_id"属性,就算选项渲染正常,表单提交时后端也拿不到选中的角色ID - PHP语法错误:
$row = mysqli_fetch_array($user_roles)行尾缺少分号,会直接触发PHP解析错误,代码无法运行 - 重复引入连接文件:顶部已经引入过
db_conn.php,下拉框部分重复引入可能引发连接重复定义的报错
修复后可直接运行的代码
表单处理部分(原入库逻辑保留,补充稳定性优化)
<?php include('db_conn.php'); if(isset($_POST["submitform"])){ $name = mysqli_real_escape_string($con, $_POST['name']); $userid = mysqli_real_escape_string($con, $_POST['userid']); $email = mysqli_real_escape_string($con, $_POST['email']); $phone = mysqli_real_escape_string($con, $_POST['phone']); // 注意:md5哈希强度极低,生产环境请替换为password_hash()函数存储密码 $pass = md5($_POST['pass']); $cpass = md5($_POST['cpass']); $role_id = intval($_POST['role_id']); // 转整数避免SQL注入风险 $select = "SELECT * FROM user_info WHERE email = '$email' && pass = '$pass' "; $result = mysqli_query($con, $select); if(mysqli_num_rows($result) > 0){ $error[] = 'user already exists'; }else{ if($pass != $cpass){ $error[]= 'password does not match'; }else{ $insert = "INSERT INTO user_info (name, userid, email, phone, pass, role_id) VALUES ('$name', '$userid', '$email', '$phone', '$pass', '$role_id')"; mysqli_query($con, $insert); header('location: login.php'); exit; // 跳转后终止后续代码执行,避免逻辑异常 } } }; ?>
下拉选择框部分
<!-- 补充name属性,否则表单提交无法传值 --> <select name="role_id" style="padding:5px; width:200px; border-radius:20px;"> <option value="">select role</option> <?php // 移除重复的db_conn引入,直接查询角色表指定字段,避免拉取无用数据 $sql = "SELECT role_id, role_name FROM user_role"; $user_roles = mysqli_query($con, $sql); // 用while循环逐行读取结果,比固定计数的for循环更稳妥,不会出现结果集指针偏移问题 while($row = mysqli_fetch_assoc($user_roles)){ ?> <option value="<?php echo $row["role_id"]; ?>"> <?php echo $row["role_name"]; ?> </option> <?php } ?> </select>
验证要点
- 确认
db_conn.php里的数据库连接$con创建正常,连接账号有user_role表的读权限 - 页面渲染后右键查看源码,确认option标签内已经正常输出Owner、Customer两个选项
- 提交表单时可以通过浏览器开发者工具的网络面板查看请求参数,确认role_id值正常传递
内容的提问来源于stack exchange,提问作者Bluesy Ace
相关产品推荐
相关产品推荐

