GET ve POST değişkenleri hem de kullanarak bir sıralama ve arama nasıl yapabilirim?

4 Cevap php

Tıklandığında url bir get değişken ekleyerek sütun adına göre sonuçlarını sıralamak olacağını bağlantılar olarak ben şu anda sütun başlığını kullanıyorum bulunuyor. İşte bir örnek:

<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>

Ben aynı zamanda kullanıcıların bir selectbox bir kategori seçin girin ve ardından bir SEARCHTERM girebileceğiniz bir form var. Ben ifadeleri eğer kullanarak ve kontrol ifadeleri geçiş ediyorsam $ _GET ['sortby'] değişkeni ve $ _POST ['search_submit'] değişkeni ayarlanır ve eğer öyleyse, GET değişkenin değerine göre belli bir sql deyimini çalıştırmak için .

4 farklı senaryo vardır.

1. Default: If neither sort nor search is set. Bu bir çalışıyor:

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 the search is set but the sort is not. Bu bir çalışıyor:

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 the sort is set, but the search is not. Bu bir çalışıyor:

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;
  }
}

Yukarıdaki 4. If the search AND sort is set. Hepsi 3 ifadeler çalışır, ama sonuncusu bana sorun veriyor eğer.

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; 
  }
}

Ne olur arayabilir olduğunu, ancak en kısa sürede sütun başlıklarından birine tıklayın ve yeni GET değişkeni ile sayfayı yeniden yükler gibi, böylelikle yine tüm sonuçları gösteren, mevcut POST değişken kurtulacaksınız. Ben $ _POST ['search_submit'] isset sonra oturumuna geçerli POST değişkeni yüklemek ve daha sonra oturum değişkeni ayarlandığında ise beyanı onay görmek için eğer son yapmaya çalıştı, ama sonra ne olur oturumu her zaman ayarlanmış olmasıdır ve ben geri ana sayfasına gitmek için çalışırsanız, arama sonuçlarını tutacak.

Belki bir yerde oturumu yok etmek gerekir? Belki de sıralama ve arama özelliklerini birleştirerek alıyor olabilir genel olarak daha iyi bir yaklaşım var mı?

4 Cevap

Ben sadece tüm istekleri için GET method="GET" bir method="POST" gelen arama formunu değiştirerek tavsiye ve kullanmak istiyorsunuz. Eğer POST isteklerini değiştiremiyorsanız, sıralama bağlantıları bağlı javascript gerektirecek, (sıralama dahil) her isteği POST ihtiyacımız olacak.

GET kullanarak yararı kullanıcıların imi tüm verilerin beri özel arama Sorgu dizesinde bulunan olacağını olmasıdır.

EDIT: sonraki isteklerinin arama dizeleri İstinat:

Ben soyut olur senin böyle bir şey için kod sıralama:

<?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>";
}
?>

Daha sonra bu gibi çağırır:

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

Bu sıralama URL kalıcılık için doğru sorgu string argüman içerdiğinden emin olur.

Içeren, sadece $_GET kullanmaya çalışın $_POST gereksiz görünüyor.

Değil bir Sorunuzun cevabı, ama sadece benim 0.2

Sizin durumunuzda ben genellikle javascript kullanarak web tarayıcısında sıralama istemci tarafı yok. Bu aslında parametreler BY sadece farklı SİPARİŞ tekrar tekrar yürütülüyor aynı sorguyu önler.

Jquery ile oldukça kolay yapmak bazı çok güzel eklentileri bile vardır.

Örnek: http://tablesorter.com/docs/

Bu benim sıralama ile bağlantı rewrite yapmak ve dcneiner tarafından önerildiği gibi değişkenleri almak aramak için kullandığınız sona erdi kodudur. Ben açık, urlencode çıkardı & '&' için deyimi gibi sadece get değişkeni okumak sanki aynı formda bir parçası konum beri search_submit ayarlı ise bu değişkenler ayarlanabilir olsun tek yolu olduğundan, imzalamak ve inline yaptı. Ben de geri else if ve deyimleri içine '{' ve '}' ekledi. Ben PHP yapmanın biraz daha farklı bir şekilde kullanarak tahmin ediyorum? Eğer ben yapılan değişiklikler hakkında yanlış ya da güvensiz bir şey görüyor musunuz? Ben bunu yolunu neden yaptığını çok emin değildi. Ama tekrar teşekkürler.

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
}