PHP如何给函数传多值并实现全菜品类型混合排序查询
解决方案:统一查询所有类型并排序
核心问题在于你当前是分多次查询不同菜品类型,每个查询各自排序后拼接结果,导致最终输出是分块排序的。正确的做法是一次查询所有菜品类型的数据,统一完成排序后再展示,具体修改步骤如下:
1. 修改display_content函数,支持"所有类型"查询
让函数可以识别特殊标记(比如"all_types"),生成对应的SQL条件,同时修复原代码中的SQL注入风险:
function display_content($dish_type){ $con = mysqli_connect("localhost", "root", "", "cookbook"); $sort = isset($_POST["sort"]) ? $_POST["sort"] : "alphabet"; // 构建基础查询框架 $base_query = "SELECT * FROM recipes WHERE 1=1 "; // 拼接搜索过滤条件(注意转义防注入) if (!empty($data[0])) { $safe_search = mysqli_real_escape_string($con, $data[0]); $base_query .= "AND concat(name, description, tags) LIKE '%{$safe_search}%' "; } // 拼接其他过滤条件(比如sqlloop、tag_filter) if (!empty($sqlloop)) { $base_query .= $sqlloop." "; } if (!empty($tag_filter)) { $base_query .= $tag_filter." "; } // 处理菜品类型条件:如果是all_types则跳过类型过滤,否则指定类型 if ($dish_type !== "all_types") { $safe_type = mysqli_real_escape_string($con, $dish_type); $base_query .= "AND type = '{$safe_type}' "; } // 拼接排序规则 switch ($sort) { case "alphabet": $base_query .= "ORDER BY name"; break; case "alphabet_rev": $base_query .= "ORDER BY name DESC"; break; // 其他排序逻辑可在此扩展 default: $base_query .= "ORDER BY name"; } $res = mysqli_query($con, $base_query); while($row = mysqli_fetch_assoc($res)) { // 原有的菜品展示代码保持不变 } mysqli_close($con); }
2. 简化recipe_list_all函数
直接调用修改后的display_content,传入"all_types"即可:
function recipe_list_all(){ ob_start(); display_content("all_types"); $content = ob_get_contents(); ob_end_clean(); if(!empty($content)){ display_content("all_types"); } }
3. 修正其他recipe_list_*函数的错误
比如recipe_list_dishes中错误传入数组的问题,改为传入字符串类型:
function recipe_list_dishes(){ ob_start(); display_content("dishes"); $content = ob_get_contents(); ob_end_clean(); if(!empty($content)){ display_content("dishes"); } }
原理说明
修改后,当查询"所有类型"时,SQL会一次性取出所有符合过滤条件的菜品数据,再统一按照指定规则(字母正序/倒序)排序,最终输出的就是混合所有类型且整体排序的结果。
额外提醒:原代码存在SQL注入风险,建议后续改用mysqli预处理语句进一步提升安全性。
内容的提问来源于stack exchange,提问作者Astw41
相关产品推荐
相关产品推荐

