2011-08-15 6 views
2

私は以下のクエリを持っています。ページングのカウントとして1番目、結果のテーブルにデータを書き込む2番目のクエリです。彼らはどちらも非常にうまく機能しましたが、Ordering機能をテーブルに追加したいと思っており、その方向でいくつかの努力を重ねてきました。PHP/MySQL - さまざまなORDER BY句のページ番号

本質的に、MySQLクエリを変数に格納された部分に分割しました。これは、フォームの提出とGETによって表現されるユーザーの希望に基づいて割り当てられる場合と割り当てられない場合があります。私は初心者レベルに過ぎず、これが私には論理的な意味を持っています。それはおそらく正しい方法ではありません!

データは、データベースに入力されると、デフォルトで順序付けられます。テーブルは一度に15行ずつ塗りつぶされます。理想的には、例えば、年齢や色など、別の方法で動物のデータを注文することを選択することができます。選択は、ページ自体にフォームを送信することによって行われ、照会は再提出され、結果は15行ページに再度出力されます。

はこれまでのところ、ここに私のコードです:

PAGINATION:

$genderid = $_GET['groupid']; 
$sortby = $_GET['sortby']; 

################## 

if (isset($_GET['pageno'])) { $pageno = $_GET['pageno']; } 
    else { $pageno = 1; } 

    $initialcount = "SELECT count(*) 
       FROM profiles 
       WHERE ProfileName != 'Unknown'"; 

     if ($genderid > 0) { 
      $genderquery = " AND ProfileGenderID = $genderid"; 
      }     
     if ($sortby == 'age') { 
      $orderby = " ORDER BY ProfileYearOfBirth ASC"; 
      } 
     elseif ($sortby == 'colour') { 
      $orderby = " ORDER BY ProfileAdultColourID ASC"; 
      } 

    $finalcount = ($initialcount . ' ' . $genderquery . ' ' . $orderby); 

    $result = mysql_query($finalcount) or trigger_error(); 
    $query_data = mysql_fetch_row($result); 
    $numrows = $query_data[0]; 

    $rows_per_page = 15; 
    $lastpage = ceil($numrows/$rows_per_page); 

    $pageno = (int)$pageno; 
    if ($pageno > $lastpage) { 
     $pageno = $lastpage; 
    } 
    if ($pageno < 1) { 
     $pageno = 1; 
    } 

    $limit = 'LIMIT ' .($pageno - 1) * $rows_per_page .',' .$rows_per_page; 


    if ($pageno == 1) 
     { 
      echo '<p class="pagination">'; 
      echo '<span class="first"><< First</span><span class="previous">< Previous</span>'; 
     } 
    else  
     { 
      echo '<p class="pagination">'; 
      echo "<span class='first'><a href='{$_SERVER['PHP_SELF']}?pageno=1'><< First</a></span>"; 
      $prevpage = $pageno-1; 
      echo "<span id='class'><a href='{$_SERVER['PHP_SELF']}?pageno=$prevpage'>< Previous</a></span>"; 
     } 

    echo '<span class="pagination-nav">' . "Page $pageno of $lastpage" . '</span>'; 

    if ($pageno == $lastpage) 
     { 
      echo '<span class="next">Next ></span><span class="last">Last >></span>'; 
      echo '</p>'; 
     } 
    else 
     { 
      $nextpage = $pageno+1; 
      echo "<span class='next'><a href='{$_SERVER['PHP_SELF']}?pageno=$nextpage'>Next ></a></span>"; 
      echo "<span class='last'><a href='{$_SERVER['PHP_SELF']}?pageno=$lastpage'>Last >></a></span>"; 
      echo '</p>'; 
     } 

OUTPUT:

 <table class="admin-display"> 
    <thead> 
     <tr> 
      <th>Name:</th> 
      <th>Age: 
       <form class="sorting-form" method="GET" action=""> 
       <input type="hidden" name="sortby" value="age" /> 
       <input type="hidden" name="groupid" value="<?php echo $genderid; ?>" /> 
       <input type="submit" value="&#8657;" class="sort-submit" /> 
       </form> 
      </th> 
      <th>Colour: 
       <form class="sorting-form" method="GET" action=""> 
       <input type="hidden" name="sortby" value="colour" /> 
       <input type="hidden" name="groupid" value="<?php echo $genderid; ?>" /> 
       <input type="submit" value="&#8657;" class="sort-submit" /> 
       </form> 
      </th> 
      <th>Gender:</th> 
      <th>Owner:</th> 
      <th>Breeder:</th> 
     </tr> 
    </thead>  

<?php 

    $initialquery = "SELECT ProfileID, ProfileOwnerID, ProfileBreederID, 
      ProfileGenderID, ProfileAdultColourID, ProfileColourModifierID, ProfileYearOfBirth, 
      ProfileYearOfDeath, ProfileLocalRegNumber, ProfileName, 
      owner.ContactFirstName AS owner_fname, owner.ContactLastName AS owner_lname, 
      breeder.ContactFirstName AS breeder_fname, breeder.ContactLastName AS breeder_lname, 
      BreedGender, BreedColour, BreedColourModifier 
      FROM profiles 
         LEFT JOIN contacts AS owner 
          ON ProfileOwnerID = owner.ContactID 
         LEFT JOIN contacts AS breeder 
          ON ProfileBreederID = breeder.ContactID 
       LEFT JOIN prm_breedgender 
          ON ProfileGenderID = prm_breedgender.BreedGenderID 
         LEFT JOIN prm_breedcolour 
          ON ProfileAdultColourID = prm_breedcolour.BreedColourID 
         LEFT JOIN prm_breedcolourmodifier 
          ON ProfileColourModifierID = prm_breedcolourmodifier.BreedColourModifierID 
         WHERE ProfileName != 'Unknown'"; 

$finalquery = ($initialquery . ' ' . $genderquery . ' ' . $orderby . ' ' . $limit); 

$result = mysql_query($finalquery) or trigger_error("SQL", E_USER_ERROR); 
//process results 

データが正常に(最初に)出力し、ユーザーが再提出することができますクエリも正常に終了しました。問題は、デフォルト以外のもので注文した後でクリックしてページを送るときに発生します。ページが変更されると、注文はデフォルトに戻ります。 ORDER BY句を最初の再提出を超えて維持する方法はわかりません。

これまでのところ、私がコードを壊すようになってから、物事が毛むくじゃらするようになりました。私は目障りなエラーを指摘する人が必要です!前もって感謝します:)

答えて

0

わかりました。私は数時間前から作業していましたが、解決策が出てきました。それはAJAX、またはセッションを使用せず、間違いなく恐ろしいですが、それは私のスキルレベルに合っています。

まずオフ、Iはオフセットパラメータに異なる値を与えるためにページネーションスクリプトを変更:

$title = intval($_GET['groupid']); 
$genderid = intval($_GET['groupid']); 
$sortby = $_GET['sortby']; 

################################## 

    $initialcount = "SELECT count(*) FROM profiles WHERE ProfileName != 'Unknown'"; 

    if($genderid > 0) { 
     $where = "AND ProfileGenderID = $genderid"; 
     $finalcount = ($initialcount . ' ' . $where); 
     } 
    else { $finalcount = $initialcount; } 

    $result = mysql_query($finalcount) or trigger_error("SQL", E_USER_ERROR); 
    $r = mysql_fetch_row($result); 
    $numrows = $r[0]; 

$rowsperpage = 15; 
$totalpages = ceil($numrows/$rowsperpage); 

if (isset($_GET['currentpage']) && is_numeric($_GET['currentpage'])) { 
    $currentpage = (int) $_GET['currentpage']; 
} 
    else { $currentpage = 1; } 

if ($currentpage > $totalpages) { 
    $currentpage = $totalpages; 
} 

    if ($currentpage < 1) 
     { $currentpage = 1; } 

$offset = ($currentpage - 1) * $rowsperpage; 

私も改ページリンクを変更)現在の性別(全体的な)ソート、の値を保持しますそれに続くソート(年齢、色)。そしてb)番のページへのリンクア・ラ・グーグルを表示するには:

// range of num links to show 
$range = 3; 

############## 

     $range = 3; 

     echo '<p class="pagination">'; 
     if ($currentpage == 1) 
     { 
      echo '<span class="first"><< First</span><span class="previous">< Previous</span>'; 
     } 
     if ($currentpage > 1) { 
      echo "<span class='first'><a href='{$_SERVER['PHP_SELF']}?sortby=$sortby&groupid=$genderid&currentpage=1'><< First</a></span>"; 
      $prevpage = $currentpage - 1; 
      echo "<span class='previous'><a href='{$_SERVER['PHP_SELF']}?sortby=$sortby&groupid=$genderid&currentpage=$prevpage'>< Previous</a></span>"; 
     } 

     echo '<span class="pagination-nav">'; 

     for ($x = ($currentpage - $range); $x < (($currentpage + $range) + 1); $x++) { 
      if (($x > 0) && ($x <= $totalpages)) { 
        if ($x == $currentpage) { 
         echo " [<b>$x</b>] "; 
        } 
        else { 
         echo " <a href='{$_SERVER['PHP_SELF']}?sortby=$sortby&groupid=$genderid&currentpage=$x'>$x</a> "; 
        } 
      } 
     } 

     echo '</span>'; 

     if ($currentpage != $totalpages) { 
       $nextpage = $currentpage + 1; 
       echo "<span class='next'><a href='{$_SERVER['PHP_SELF']}?sortby=$sortby&groupid=$genderid&currentpage=$nextpage'>Next ></a></span>"; 
       echo "<span class='last'><a href='{$_SERVER['PHP_SELF']}?sortby=$sortby&groupid=$genderid&currentpage=$totalpages'>Last >></a></span>"; 
     } 
     if ($currentpage == $totalpages) 
      { 
       echo '<span class="next">Next ></span><span class="last">Last >></span>'; 
      } 

     echo '</p>'; 

そして最後には、クエリ構築:チーズケーキを打つハンマーなど

$baseQuery = "SELECT ProfileID, ProfileOwnerID, ProfileBreederID, 
       ProfileGenderID, ProfileAdultColourID, ProfileColourModifierID, ProfileYearOfBirth, 
       ProfileYearOfDeath, ProfileLocalRegNumber, ProfileName, 
       owner.ContactFirstName AS owner_fname, owner.ContactLastName AS owner_lname, 
       breeder.ContactFirstName AS breeder_fname, breeder.ContactLastName AS breeder_lname, 
       BreedGender, BreedColour, BreedColourModifier 
       FROM profiles 
          LEFT JOIN contacts AS owner 
           ON ProfileOwnerID = owner.ContactID 
          LEFT JOIN contacts AS breeder 
           ON ProfileBreederID = breeder.ContactID 
        LEFT JOIN prm_breedgender 
           ON ProfileGenderID = prm_breedgender.BreedGenderID 
          LEFT JOIN prm_breedcolour 
           ON ProfileAdultColourID = prm_breedcolour.BreedColourID 
          LEFT JOIN prm_breedcolourmodifier 
           ON ProfileColourModifierID = prm_breedcolourmodifier.BreedColourModifierID 
          WHERE ProfileName != 'Unknown'"; 


    if($sortby == 'age') { 
     $orderby = "ORDER BY ProfileYearOfBirth ASC"; 
     } 
    elseif ($sortby == 'colour') { 
     $orderby = "ORDER BY ProfileAdultColourID ASC"; 
     } 

    $limitClause = "LIMIT $offset, $rowsperpage"; 

    $finalQuery = ($baseQuery . ' ' . $where . ' ' . $orderby . ' ' . $limitClause); 

$result = mysql_query($finalQuery) or trigger_error("SQL", E_USER_ERROR); 

有効に:)上記の貢献者に 多くのおかげで、特に私をINTVALに紹介するために(そして、進行によって)、CASTING。

+0

ちょうど注意:あなたのテーブルの前と後の両方にあなたのページネーションリンクを(私がしているように)したいのであれば、コードの始めに$ sortbyを定義しておかなければなりません。さもなければ、トップページリンクはソートをドロップし、下のものは(baseQeryの実行後に)それを保持します。明らかだが... – Eamonn

0

多分http://www.datatables.net/を使用してこの問題を回避できますか?それはあなたのために結果を注文するクライアントサイドのajaxソリューションです。また、毎回ページ全体をリロードするのを避けます。

+0

これは素晴らしいリソースに見えますが、私は最初にこのレベルのコードを手に入れたいと思っています。ありがとう、tho! – Eamonn

1

これはAJAX呼び出しで処理する必要があるようです。理論的には、(セッション変数、隠しフォームフィールド、またはクッキーを使用して)セッション全体を通して初期状態とインクリメント状態を維持できますが、一度に非同期的にXレコードを取得し、あなたは次のページを取得するまでクライアント側。あなたのアイデアを与える

session_start(); 

$startat = intval($_REQUEST["startat"]); 
$numrows= intval($_REQUEST["numrows"]); 

if (isset($_SESSION['base_query'])){ 
    $query = $_SESSION['base_query']; 
} else { 
    $query = <query construction minus limit clause>; 
    $_SESSION['base_query'] = $query; 
} 


$query .= " LIMIT $startat, $numrows"; 

<query db/ send results> 

ん:次のようになりますセッションで必要な値を格納し、ポスターの問合せ毎

、?

+0

私は現在使用している方法でうまくいきますか?あなたが私が落ちている場所を私に見せることができれば素晴らしいことでしょう。私はAJAXが理想的な解決策であると考えていますが、今私はこれまでこれを得ています...また、AJAXへの転換は私のために横向きになります。私はJavascriptでも熟達していません。私がこれをするために必要な範囲ではありません。 – Eamonn

+0

はい、初期データとクエリをセッション変数に保持できます。それは管理するのに苦労するでしょうが、それはあなたのためにそれを維持します。 –

+0

それは私が考える助けが必要な場所です - 私はどのようにしてクエリを持続させるのか分かりません。私はセッションがない、私はフォームフィールドを使用しています... – Eamonn

関連する問題