【问题标题】:How can I do a sort and search using both GET and POST variables?如何使用 GET 和 POST 变量进行排序和搜索?
【发布时间】: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


【解决方案1】:

我建议将搜索表单从 method="POST" 更改为 method="GET",并仅对所有请求使用 GET。如果您无法更改您的 POST 请求,您将需要发布每个请求(包括排序),这需要将 javascript 附加到您的排序链接。

使用 GET 的好处是您的用户可以为特定搜索添加书签,因为所有数据都将包含在查询字符串中。

编辑:在后续请求中保留搜索字符串:

我会将您的排序代码抽象为如下内容:

<?php
function write_sortable_header_link( $column_id, $column_name ){
   if( ( isset($_GET['sortby']) && $_GET['sortby'] != $column_id ) || !isset($_GET['sortby']) )
     $query = "?sortby=$column_id";
   else
     $query = '?sortby='.$column_id.'_desc';

   if( isset($_GET['searchsubmit']) ){
     $query .= '&amp;searchsubmit=1';
     $query .= '&amp;searchby=' . urlencode( isset($_GET['searchby']) ? $_GET['searchby'] : '' );
     $query .= '&amp;search_input=' . urlencode( isset($_GET['search_input']) ? $_GET['search_input'] : '' );
   }

   $href = $_SERVER['SCRIPT_NAME'] . $query;
   echo "<a href='$href'>$column_name</a>";
}
?>

然后你可以这样称呼它:

<?php write_sortable_header_link( 'order_id', 'Order Id' ); ?>

它将确保您的排序 URL 包含正确的查询字符串参数以实现持久性。

【讨论】:

  • 我刚刚尝试这样做,它在一定程度上起作用。当我单击其中一个列标题时,它会使用排序获取变量重新加载页面,但搜索获取变量已消失,因此它会恢复为对所有结果进行排序
  • 我个人会跳过所有的 'isset' 测试,并关闭错误报告以获取关于它无效的通知,但由于您正在使用它们,所以我将它们留在了。
  • 哇!非常感谢!我非常感谢你不遗余力地帮助我!这一切看起来都很简单,但我对 urlencode 函数有点不确定。我在 php.net 上查找了它,但对我来说没有意义。我尝试查看链接的 url,但它不包含您在 urlencode 中使用的某些字符,例如问号和冒号。
  • 嘿,克里斯,这些基本上都是内联的“if”语句:true == false ? return_this_if_true : return_this_if_false。因此,如果设置了 $_GET['searchby'] 项,则返回其值,否则返回空字符串。你可以在这里阅读更多:php.net/manual/en/…
  • 再次感谢您的帮助!我重写了你的代码,让它对我来说更简单一些。我把它贴在了底部。如果您认为它仍然可以,我会很感兴趣。它仍然有效。
【解决方案2】:

尝试只使用$_GET,涉及$_POST似乎没有必要。

【讨论】:

    【解决方案3】:

    不是你问题的答案,只是我的 0.2

    在您的情况下,我通常使用 javascript 在 Web 浏览器中进行排序客户端。它基本上可以防止仅使用不同的 ORDER BY 参数一遍又一遍地运行相同的查询。

    使用 jquery 甚至还有一些非常不错的插件可以让它变得非常简单。

    示例:http://tablesorter.com/docs/

    【讨论】:

    • 带有 jQ​​uery 的 DataTables (datatables.net) 对于客户端排序也非常好。确实,在某些情况下,在不回击服务器的情况下进行排序很有用。这取决于所涉及的行数以及您的目标用户组所支持的浏览器类型。
    【解决方案4】:

    这是我最终使用的代码,用于使用 dcneiner 建议的排序和搜索获取变量重写链接。我取出了urlencode,将&切换到'&'符号,并将内联if语句读取为get变量,因为可以设置这些get变量的唯一方法是设置search_submit,因为它们是相同的形式。我还在 if 和 else 语句中添加了“{”和“}”。我猜你正在使用一种稍微不同的 PHP 方式?您是否发现我所做的更改有任何错误或不安全之处?我不太确定你为什么要按你的方式做。不过再次感谢。

    function write_sortable_header_link( $column_id, $column_name ){ //Function that creates a link with the search query if needed
      if( ($_GET['sortby'] != $column_id) || !isset($_GET['sortby']) ) { //If the GET variable is not the column id of this button or if the GET sortby variable has not been set
        $query = "?sortby=$column_id"; //then add this to the end of the url
      } else {
          $query = '?sortby='.$column_id.'_desc'; //otherwise if the GET variable is the column id of this button, then add the descending code to the end of the variable
      }
    
      if(isset($_GET['search_submit']) ){ //If the GET variable search_submit is in the url
        $query .= '&search_submit=1'; //then add this to the end of the url string
        $query .= '&searchby=' . $_GET['searchby']; //add whatever is currently in the GET searchby to the end of the url string
        $query .= '&search_input=' . $_GET['search_input']; //add whatever is currently in the GET search_input to the end of the url string
      }
    
      $href = $_SERVER['SCRIPT_NAME'] . $query; //this is the href part of the link
      echo "<a href='$href'>$column_name</a>"; //this creates the actual link
    }
    

    【讨论】:

    • urlencode 对于安全性很重要。用户可以将精心制作的 HTML 插入您的页面。如果空格未编码等,旧浏览器也会中断。其他一切都很好!
    猜你喜欢
    • 1970-01-01
    • 2013-10-29
    • 1970-01-01
    • 1970-01-01
    • 2022-01-24
    • 2015-04-17
    • 2015-11-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多