【发布时间】:2009-11-29 14:06:07
【问题描述】:
我目前正在使用列标题作为链接,单击该链接将通过向 url 添加一个 get 变量按列名称对结果进行排序。这是一个例子:
<a href="
<?php
// Sorts by order id. If already sorted by order id, then it will change the link to sort descending
if(!isset($_GET['sortby']) || $_GET['sortby'] != 'order_id'){
echo $_SERVER['SCRIPT_NAME'] . '?sortby=order_id'; //example: tracker.php?sortby=order_id
} elseif(isset($_GET['sortby']) || $_GET['sortby'] == 'order_id'){
echo $_SERVER['SCRIPT_NAME'] . '?sortby=order_id_desc'; //example: tracker.php?sortby=order_id_desc
}?>
">Order ID</a>
我还有一个表单,用户可以在其中输入从选择框中选择一个类别,然后输入搜索词。我正在使用 if 语句和 switch 语句来检查 $_GET['sortby'] 变量和 $_POST['search_submit'] 变量是否已设置,如果是,则根据 GET 变量的值运行某个 sql 语句.
有 4 种不同的场景。
1.默认值:如果既未设置排序也未设置搜索。这个工作正常:
if(!isset($_GET['sortby']) && !isset($_POST['search_submit'])){ //Default, If no sort or search is set
$sql = 'SELECT *
FROM orders
ORDER BY order_id DESC';
}
2。如果设置了搜索但未设置排序。这个工作正常:
if(isset($_POST['search_submit'])) {
$search_string = ' WHERE ' . $_POST['searchby'] . '= "' . $_POST['search_input'] . '" ';
}
if(!isset($_GET['sortby']) && isset($_POST['search_submit']) ){ //If the search is set but no sort
$sql = "SELECT *
FROM orders"
. $search_string .
"ORDER BY order_id DESC";
}
3。如果设置了排序,但没有设置搜索。这个工作正常:
if(isset($_GET['sortby']) && !isset($_POST['search_submit'])) { //If the sort is set but no search
switch ($_GET['sortby']) {
case "order_id":
$sql = "SELECT *
FROM orders
ORDER BY order_id ASC";
break;
case "order_id_desc":
$sql = "SELECT *
FROM orders
ORDER BY order_id DESC";
break;
}
}
4.如果设置了搜索和排序。以上所有 3 个 if 语句都有效,但最后一个给我带来了问题。
if(isset($_GET['sortby']) && isset($_POST['search_submit'])) { //If the sort AND search is set
switch ($_GET['sortby']) {
case "order_id":
$sql = "SELECT *
FROM orders"
. $search_string .
"ORDER BY order_id ASC";
break;
case "order_id_desc":
$sql = "SELECT *
FROM orders"
. $search_string .
"ORDER BY order_id DESC";
break;
}
}
发生的情况是您可以搜索,但是一旦您单击其中一个列标题并使用新的 GET 变量重新加载页面,它将摆脱当前的 POST 变量,从而再次显示所有结果。我试图在 $_POST['search_submit'] isset 之后将当前 POST 变量加载到会话中,然后让最后一个 if 语句检查会话变量是否已设置,但随后会发生会话始终设置并且如果我尝试返回主页,它会保留这些搜索结果。
也许我需要在某个地方销毁会话?也许我可以采取一种整体更好的方法来结合排序和搜索功能?
【问题讨论】:
-
克里斯,包括我在内的大多数答案都建议切换到
GET。你不能有什么具体原因吗?如果您无法选择从POST更改为GET,不希望您在没有相关答案的情况下被冷落 -
不,我可以做任何工作。更改为 GET 完全没有问题。我实际上看到了您的答案并将我所有的 POST 变量都切换为 GET 变量。它可以工作,但唯一的问题是,一旦用户单击其中一个列标题以对搜索结果进行排序,搜索 GET 变量就会消失,它会排序所有结果,而不是搜索结果。你知道我的意思吗?
-
啊……啊!我更新了我的答案以显示我将如何处理它。您也可以使用 javascript 来实现,但这种方式也可以在没有 javascript 的情况下使用。
-
@outis 我同意,但他必须打开magic_quotes,因为在他的测试链接中,所有项目都被转义并且不可能进行SQL注入。已经试过了;)
标签: php search sorting post get