You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 06:10:51