PHP+MySQL如何同时查询3张语言表生成三个表单下拉选择框
学生信息录入表单多语言表查询实现方案
问题背景
- 开发学生信息录入表单,单条学生信息需配置3个不同类别的语言选择项,每类语言选项对应独立数据表,这类语言表会同时和其他业务表关联复用
- 单表查询某一类语言列表功能正常,但无法同时查询
Lengua_V、Lengua_P、Lengua_M三张表的数据,用于渲染三个对应的下拉选择框 - 现有代码仅实现了单张语言表查询、部分学生基础信息提交逻辑,剩余两类语言的查询、提交逻辑未完成
现有代码
<?php $db = conectarDB(); $consulta = "SELECT * FROM Lengua_V ..."; $resultado = mysqli_query($db, $consulta); $id = ''; $nombre = ''; $apellido1 = ''; $apellido2 = ''; //$posgrado = ''; $lenguaVid = ''; //$lenguaPid = ''; //$lenguaMid = ''; if($_SERVER['REQUEST_METHOD'] === 'POST'){ $nombre = mysqli_real_escape_string($db, $_POST['nombre']); $apellido1 = mysqli_real_escape_string($db, $_POST['apellido1']); $apellido2 = mysqli_real_escape_string($db, $_POST['apellido2']); //$posgrado = mysqli_real_escape_string($db, $_POST['$posgrado']); $lenguaVid = mysqli_real_escape_string($db, $_POST['lengua_v']); // $lenguaPid = mysqli_real_escape_string($db, $_POST['lengua_p']); // $lenguaMid = mysqli_real_escape_string($db, $_POST['lengua_m']); $query = " INSERT INTO Alumno ". "(nombre, apellido1, apellido2, lenguaVid, lenguaPid, lenguaMid) ". "VALUES ('$nombre', '$apellido1', '$apellido2', '$lenguaVid', '$lenguaPid', '$lenguaMid' ) "; $resultado = mysqli_query($db, $query); if($resultado) { header('Location: /admin/alumnos/alumnos.php'); } }
实现方案
三张语言表结构独立、数据互不关联,不需要做JOIN联查,两种方式都可以实现需求:
方式1:单次查询拉取所有语言数据(推荐)
利用UNION ALL拼接三张表的查询结果,额外加分类标记字段区分数据归属,一次数据库请求就能拿到所有下拉选项,性能更好:
<?php $db = conectarDB(); // 一次查询三张表,新增type字段标记语言类别 $consulta = "SELECT id, nombre, 'V' as type FROM Lengua_V UNION ALL SELECT id, nombre, 'P' as type FROM Lengua_P UNION ALL SELECT id, nombre, 'M' as type FROM Lengua_M"; $resultado = mysqli_query($db, $consulta); // 初始化三个下拉选项的存储数组 $lenguaVOptions = []; $lenguaPOptions = []; $lenguaMOptions = []; // 遍历查询结果,按分类存入对应数组 while($row = mysqli_fetch_assoc($resultado)){ switch($row['type']){ case 'V': $lenguaVOptions[] = $row; break; case 'P': $lenguaPOptions[] = $row; break; case 'M': $lenguaMOptions[] = $row; break; } } // 初始化表单字段 $id = ''; $nombre = ''; $apellido1 = ''; $apellido2 = ''; $lenguaVid = ''; $lenguaPid = ''; $lenguaMid = ''; if($_SERVER['REQUEST_METHOD'] === 'POST'){ // 接收所有表单参数 $nombre = mysqli_real_escape_string($db, $_POST['nombre']); $apellido1 = mysqli_real_escape_string($db, $_POST['apellido1']); $apellido2 = mysqli_real_escape_string($db, $_POST['apellido2']); $lenguaVid = mysqli_real_escape_string($db, $_POST['lengua_v']); $lenguaPid = mysqli_real_escape_string($db, $_POST['lengua_p']); $lenguaMid = mysqli_real_escape_string($db, $_POST['lengua_m']); // 插入学生数据 $query = "INSERT INTO Alumno (nombre, apellido1, apellido2, lenguaVid, lenguaPid, lenguaMid) VALUES ('$nombre', '$apellido1', '$apellido2', '$lenguaVid', '$lenguaPid', '$lenguaMid')"; $insertRes = mysqli_query($db, $query); if($insertRes) { header('Location: /admin/alumnos/alumnos.php'); exit; // 跳转后必须终止后续代码执行,避免逻辑异常 } } ?>
页面渲染下拉框时,直接遍历对应分类的数组即可,示例:
<!-- V类语言下拉框 --> <select name="lengua_v" required> <?php foreach($lenguaVOptions as $item): ?> <option value="<?php echo $item['id']; ?>"><?php echo $item['nombre']; ?></option> <?php endforeach; ?> </select> <!-- P类、M类下拉框写法一致,分别遍历$lenguaPOptions、$lenguaMOptions,name属性对应设为lengua_p、lengua_m即可 -->
方式2:分三次单独查询
如果不想用UNION语法,直接分三次查询三张表,逻辑更直白,适合新手理解:
// 查询V类语言 $resV = mysqli_query($db, "SELECT id, nombre FROM Lengua_V"); $lenguaVOptions = mysqli_fetch_all($resV, MYSQLI_ASSOC); // 查询P类语言 $resP = mysqli_query($db, "SELECT id, nombre FROM Lengua_P"); $lenguaPOptions = mysqli_fetch_all($resP, MYSQLI_ASSOC); // 查询M类语言 $resM = mysqli_query($db, "SELECT id, nombre FROM Lengua_M"); $lenguaMOptions = mysqli_fetch_all($resM, MYSQLI_ASSOC);
优化提示:手动转义参数存在SQL注入风险,生产环境建议优先使用mysqli预处理语句绑定参数。
内容的提问来源于stack exchange,提问作者robertuno
相关产品推荐
相关产品推荐

