PHP MySQL多选下拉框搜索异常:仅返回最后选中值结果
问题解决方法
1. 修正表单多选参数传递
多选下拉框的name属性必须添加[],这样表单提交时才会将所有选中值以数组形式传递给后端,而非仅保留最后一个选中项。修改后的select代码:
<select name="name[]" id="name" multiple> <option value="0">Select Title</option> <?php include('config.php'); $sql = mysqli_query($conn,"SELECT * FROM student_record"); while($row=mysqli_fetch_array($sql)) { echo '<option value="'.$row['name'].'">'.$row['name'].'</option>'; } ?> </select>
2. 重构后端查询逻辑
现在$_POST['name']是一个数组,需要遍历数组构建查询条件,同时必须使用预处理语句避免SQL注入风险,禁止直接拼接字符串。
精确匹配(IN语句)代码:
if(isset($_POST['name']) && is_array($_POST['name']) && !empty($_POST['name'])) { require_once "config.php"; // 过滤默认的"0"选项 $names = array_filter($_POST['name'], function($val) { return $val !== '0'; }); if(!empty($names)) { // 构建占位符,每个选中值对应一个? $placeholders = implode(', ', array_fill(0, count($names), '?')); $sql = "SELECT id, name, address, marks FROM student_record WHERE name IN ($placeholders)"; // 预处理查询 $stmt = mysqli_prepare($conn, $sql); // 绑定参数,字符串类型对应s,多个值重复s $types = str_repeat('s', count($names)); mysqli_stmt_bind_param($stmt, $types, ...$names); // 执行并获取结果 mysqli_stmt_execute($stmt); $result = mysqli_stmt_get_result($stmt); // 处理查询结果 while($row = mysqli_fetch_assoc($result)) { // 此处可替换为自定义输出逻辑 print_r($row); } // 清理资源 mysqli_stmt_close($stmt); mysqli_close($conn); } else { echo "请选择至少一个选项"; } } else { echo "请选择搜索项"; }
模糊匹配(LIKE语句)代码:
如果需要模糊匹配而非精确匹配,将查询部分替换为:
// 构建LIKE条件 $conditions = implode(' OR ', array_fill(0, count($names), 'name LIKE ?')); $sql = "SELECT id, name, address, marks FROM student_record WHERE $conditions"; // 为每个值添加模糊匹配的% $likeNames = array_map(function($val) { return "%$val%"; }, $names); // 绑定参数时传入处理后的$likeNames mysqli_stmt_bind_param($stmt, $types, ...$likeNames);
内容的提问来源于stack exchange,提问作者Saad Salman
相关产品推荐
相关产品推荐

