php - 使用 $_GET 中的多个变量来更改页面布局和 MySQL 结果

标签 php mysql

我试图构建一个过滤系统来从 MySQL 数据库检索信息,

我在互联网上搜索了几个小时,几乎一整天,但现在我要在这里碰碰运气。

我的解决方案从 PHP 中的 $_GET 函数开始,但在接近我想要的功能时,它产生了一个新问题。
现在发生的情况是,当应用新的过滤器时,另一个过滤器会神奇地切换回默认值。 我做了一些测试,似乎它认为 $_GET 是空的,但由于情况显然不是这样,我无法弄清楚。

if (isset($_GET['select'])) {
    if ($_GET['select'] == "allitems") {
        $select = "SELECT * FROM items";
    } else if ($_GET['select'] == "available") {
        $select = "SELECT * FROM items WHERE available='1'";
    }
} else if (empty($_GET['select'])) {
    $select = "SELECT * FROM items";
}
if (isset($_GET['order'])) {
    if ($_GET['order'] == "id_asc") {
        $order = "`items`.`item_id` ASC";
    } else if ($_GET['order'] == "id_desc") {
        $order = "`items`.`item_id` DESC";
    }
} else if (empty($_GET['order'])) {
    $order = "`items`.`item_id` ASC";
}
if (isset($_GET['layout'])) {
    if ($_GET['layout'] == "row") {
        $layout = "row";
    } else if ($_GET['layout'] == "grid") {
        $layout = "grid";
    }
} else if (empty($_GET['layout'])) {
    $layout = "row";
}

$s = $_GET['select'] ?? 'allitems';
$o = $_GET['object'] ?? 'id_asc';
$l = $_GET['layout'] ?? 'row';

上面的代码是从 URL 检索信息的地方, 看起来像这样:store?select=allitems&order=id_desc 它看起来到处都是,但是在我开始的地方进行良好的编码并没有真正帮助,并且在尝试一些东西时它最终出现在这里。

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    //what to show
    if (isset($_POST['allitems'])) {
        $s = "allitems";
    }
    if (isset($_POST['available'])) {
        $s = "available";
    }
    //order to show it in
    if (isset($_POST['id_asc'])) {
        $o = "id_asc";
    }
    if (isset($_POST['id_desc'])) {
        $o = "id_desc";
    }

    if (isset($_POST['allitems']) || isset($_POST['available']) || isset($_POST['id_asc']) || isset($_POST['id_desc'])) {
        $data = ['select' => $s, 'order' => $o];
        $query_string = http_build_query($data);
        header('Location: store' . (FALSE === empty($query_string) ? '?'.$query_string:''));
        exit;
    }

上面的代码是我设置变量值的地方,现在我几乎肯定这不是问题所在,因为它仍然有效。 由于它能够设置一个值,例如,当您按 id_descent 时,它会获取该值并且仅当您需要两个过滤器 id_ascent 且仅当 available = true 时才会发生更改。它将第一个切换回默认状态。 (当$_GET为空时设置)

我希望这是有道理的,否则我很乐意重新表述我的问题。

最后但并非最不重要的一点是,如果有人知道一种完全不同的方法来做到这一点,那就很好,然后以下内容可能会有所帮助:

                $getItems = ("$select ORDER BY $order");
                $result = $connection->query($getItems);
                if ($result->num_rows > 0) { //do stuff

谢谢!

ps:我尝试了几种其他方法来做到这一点,但我遇到了更多问题和错误。大多数都是使用 $_SESSIONs 或 JavaScript,我的主要问题是在刷新页面两次之前更改不会应用...

编辑:

我不知道这是否有帮助,但这是同一页面上我的 html 表单的精简版本,

页面也会重定向到自身。

                        <form action="store" method="post"> 
                            <button class="a" name="allitems">
                            </button>

                            <button class="a" name="available">
                            </button>

                            <button class="a" name="id_<?php if ($o === "id_asc") {echo'desc';} else {echo'asc';}?>">
                            </button>

                            <button class="a" name="row">
                            </button>

                            <button class="a" name="grid">
                            </button>
                        </form>

**编辑2:**

*示例1:*
[因此,当我选择一个过滤器时,一切正常,所有其他选项的默认状态都会被设置][1]

*示例2:*
[但是一旦我选择了第二个,之前选择的过滤器就会设置回默认状态][2]

最佳答案

也许有点偏离主题,但你可以大大简化你的代码:

                if (isset($_GET['select']) && $_GET['select'] == "available") {
                    $select = "SELECT * FROM items WHERE available='1'";
                } else {
                    $select = "SELECT * FROM items";
                }
                if (isset($_GET['order']) && $_GET['order'] == "id_desc") {
                    $order = "`items`.`item_id` DESC";
                } else {
                    $order = "`items`.`item_id` ASC";
                }
                if (isset($_GET['layout']) && $_GET['layout'] == "grid") {
                    $layout = "grid";
                } else {
                    $layout = "row";
                }

另一个改进:

                    if (isset($s) || isset($o)) {
                        $data = ['select' => $s, 'order' => $o];
                        $query_string = http_build_query($data);
                        header('Location: store' . (FALSE === empty($query_string) ? '?'.$query_string:''));
                        exit;
                    }

您想重定向到 management?select=allitems&order=id_desc 还是 store?select=allitems&order=id_desc(您编写了 management在您的问题中,但正在重定向到代码中的 store)

关于php - 使用 $_GET 中的多个变量来更改页面布局和 MySQL 结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50319071/

相关文章:

php - 为什么我在尝试使用自定义用户提供程序登录时收到此 "Class App\Listeners\LogAuthenticationAttempt does not exist"错误?

php - 如何在 PHP Excel 中找到特定列的最高行?

javascript - 如何通过javascript在iframe上自动填充数据

php - PHP Mysql-使用分组依据的交易

mysql - 如何在 SQL 中使用 COUNT() 函数显示几列?

php - ElasticSearch,如何按其他字段排序聚合?

mysql - 如何存储整个网页供以后解析?

php - 为什么 phpmyadmin 中没有创建表

php - 干净的 URL

php - HTML 到 WordPress 转换页面