Сложный запрос + скрипт разбивки на страницы

Проблема 1: разбиение на страницы моего сценария не работает. После 20 записей он отображает только последние 20 записей и не разбивает их на разные страницы. Код ниже:

Проблема 2: Я использую тот же сценарий разбивки на страницы для чего-то еще, и там он расщепляется правильно, но на следующей странице он показывает те же результаты со страницы 1. Я использую тот же скрипт, за исключением второго скрипта:

$query = "SELECT COUNT(*) as num FROM table where id = '$uid' ORDER BY id DESC"; 

и SQL для этого:

  $sql="SELECT table_one.field_id, table_constant.field_name, table_one.field_2, table_one.field_3 FROM table_one LEFT JOIN table_constant ON table_one.common_field = table_constant.common_field WHERE table_constant.u_id = '$uid'"; 

Код:

  <?php $tbl_name=""; //not using this since i am doing a union $adjacents = 3; $query = "SELECT COUNT(*) as num from table_one LEFT JOIN table_constant on table_one.c_id = table_constant.c_id where table_constant.user_id = '$uid' UNION SELECT COUNT(*) as num from table_two LEFT JOIN table_constant on table_two.c_id = table_constant.c_id where table_two.added_by = '$uid' UNION SELECT COUNT(*) as num from table_three LEFT JOIN table_constant ON table_three.c_id = table_constant.c_id where table_constant.user_id = '$uid' UNION SELECT COUNT(*) as num from table_four LEFT JOIN table_constant ON table_four.c_id = table_constant.c_id where table_constant.user_id = '$uid' ORDER BY date_time_added DESC"; $total_pages = mysql_fetch_array(mysql_query($query)); $total_pages = $total_pages[num]; $targetpage = "page.php"; $limit = 20; $page = $_GET['page']; if($page) $start = ($page - 1) * $limit; //first item to display on this page else $start = 0; //if no page var is given, set start to 0 $sql = "select table_one.field1, table_constant.field1, table_one.field2, table_one.field3, table_one.field4, table_one.field5, table_constant.c_id from table_one LEFT JOIN table_constant on table_one.field1 = table_constant.c_id where table_constant.user_id = '$uid' UNION select table_two.field1, table_constant.field1, table_two.field2, table_two.field3, table_two.field4, table_two.field5, table_constant.c_id from table_two LEFT JOIN table_constant on table_two.c_id = table_constant.c_id where table_two.added_by = '$uid' UNION select table_three.field1, table_constant.field1, table_three.field2, table_three.field3, table_three.field4, table_three.field5, table_constant.c_id from table_three LEFT JOIN table_constant ON table_three.c_id = table_constant.c_id where table_constant.user_id = '$uid' UNION select table_four.field1, table_constant.field1, table_four.field2, table_four.field3, table_four.field4, table_four.field5, table_constant.c_id from table_four LEFT JOIN table_constant ON table_four.c_id = table_constant.c_id where table_constant.user_id = '$uid' ORDER BY date DESC LIMIT $start, $limit"; $result = mysql_query($sql); $query = mysql_query($sql) or die ("Error: ".mysql_error()); $result = mysql_query($sql); if ($result == "") { echo ""; } echo ""; $rows = mysql_num_rows($result); if($rows == 0) { print(""); } elseif($rows > 0) { while($row = mysql_fetch_array($query)) { $fields = $row['field']; //Table one Field 1 $fields2 = $row['field']; //Table Constant Field 1 $fields3 = $row['field'];// Table One field 4 $fields4 = $row['field'];//Table Constant Field 2 print("$fields<br>$fields2<br>$fields3<br>$fields4"); } } if(mysql_num_rows($result) < 1) { echo ""; } /* Setup page vars for display. */ if ($page == 0) $page = 1; //if no page var is given, default to 1. //next page is page + 1 $lastpage = ceil($total_pages/$limit); //lastpage is = total pages / items per page, rounded up. $lpm1 = $lastpage - 1; //last page minus 1 /* Now we apply our rules and draw the pagination object. We're actually saving the code to a variable in case we want to draw it more than once. */ $pagination = ""; if($lastpage > 1) { $pagination .= "<div class=\"pagination\"></div>"; //previous button if ($page > 1) $pagination.= ""; else $pagination.= ""; //pages if ($lastpage < 7 + ($adjacents * 2)) //not enough pages to bother breaking it up { for ($counter = 1; $counter <= $lastpage; $counter++) { if ($counter == $page) $pagination.= "<span class=\"current\">$counter &nbsp</span>"; else $pagination.= "<a id=\"numberhighlighter\" href=\"$targetpage?page=$counter\">$counter &nbsp</a>"; } } elseif($lastpage > 5 + ($adjacents * 2)) //enough pages to hide some { //close to beginning; only hide later pages if($page < 1 + ($adjacents * 2)) { for ($counter = 1; $counter < 4 + ($adjacents * 2); $counter++) { if ($counter == $page) $pagination.= "<span class=\"current\">$counter &nbsp</span>"; else $pagination.= "<a href=\"$targetpage?page=$counter\">$counter &nbsp </a>"; } $pagination.= "..."; $pagination.= "<a href=\"$targetpage?page=$lpm1\">$lpm1</a>"; $pagination.= "<a href=\"$targetpage?page=$lastpage\">$lastpage</a>"; } //in middle; hide some front and some back elseif($lastpage - ($adjacents * 2) > $page && $page > ($adjacents * 2)) { $pagination.= "<a href=\"$targetpage?page=1\">1</a>"; $pagination.= "<a href=\"$targetpage?page=2\">2</a>"; $pagination.= "..."; for ($counter = $page - $adjacents; $counter <= $page + $adjacents; $counter++) { if ($counter == $page) $pagination.= "<span class=\"current\">$counter</span>"; else $pagination.= "<a href=\"$targetpage?page=$counter\">$counter</a>"; } $pagination.= "..."; $pagination.= "<a href=\"$targetpage?page=$lpm1\">$lpm1</a>"; $pagination.= "<a href=\"$targetpage?page=$lastpage\">$lastpage</a>"; } //close to end; only hide early pages else { $pagination.= "<a href=\"$targetpage?page=1\">1</a>"; $pagination.= "&nbsp &nbsp &nbsp<a href=\"$targetpage?page=2\">2&</a>"; $pagination.= "..."; for ($counter = $lastpage - (2 + ($adjacents * 2)); $counter <= $lastpage; $counter++) { if ($counter == $page) $pagination.= "<span class=\"current\">$counter</span>"; else $pagination.= "<a href=\"$targetpage?page=$counter\">$counter</a>"; } } } //next button if ($page < $counter - 1) $pagination.= ""; else $pagination.= ""; } ?> <div id="page"> <?php print("$pagination"); ?> 

Благодаря!

Solutions Collecting From Web of "Сложный запрос + скрипт разбивки на страницы"

Я не уверен, насколько это вам поможет, но

1.) Где определяется ваш $ uid? Возможно, он был там, и я пропустил его, потому что у вас был код кода. Если он был определен в контроллере или в другом типе файла посредника, то, возможно, когда вы сменили страницы, uid не был отменен?

2.) Если вы используете одну и ту же разбивку на страницы более одного раза, создайте ее в функцию.

Я предполагаю, что результаты, которые вы получили, были правильными, используя запрос, который вы использовали, единственная проблема с ним заключалась в том, что он не отображал правильные результаты на других страницах. Если это так, то используйте эту функцию, которую я настраивал. (Возможно, вам придется настроить его самостоятельно, например, ваша страница может не читать domain.com/pg=3, как у меня)

 function Pagination($list, $limit){ global $pagination; global $total_pages; global $pg; global $offset; global $page_limit; $page_limit = $limit; global $total_results; $total_results = $list; global $offset; // number of rows to show per page // find out total pages $total_pages = ceil($list / $limit); // get the current page or set a default if ($pagination) { // cast var as int $pg = $pagination; } else { // default page num $pg = 1; } // end if // if current page is greater than total pages... if ($pg > $total_pages || $pg == "last") { // set current page to last page $pg = $total_pages; } // end if // if current page is less than first page... if ($pg <= 1 || $pg == "first") { // set current page to first page $pg = 1; } // end if // the offset of the list, based on current page $offset = ($pg - 1) * $limit; // get the info from the db } function PaginationLinks($url, $tab){ global $pg; global $total_pages; global $total_results; global $page_limit; global $offset; $displayed_results = ($total_results - $offset); if($displayed_results >= $page_limit && $total_results > $page_limit){ $displayed_results = $page_limit; } /****** build the pagination links ******/ // range of num links to show $range = 5; if($tab){ $tab = "?$tab"; } // if not on page 1, don't show back links if ($pg > 1) { // show << link to go back to page 1 echo "<li class='pagination'><a href='$url/pg=first$tab'><<</a></li>"; // get previous page num $prevpage = $pg - 1; // show < link to go back to 1 page echo "<li class='pagination'><a href='$url/pg=$prevpage$tab'><</a></li>"; } // end if // loop to show links to range of pages around current page for ($x = ($pg - $range); $x < (($pg + $range) + 1); $x++) { // if it's a valid page number... if (($x > 0) && ($x <= $total_pages)) { // if we're on current page... if ($x == $pg) { // 'highlight' it but don't make a link echo "<li class='current_page'>$x</li>"; // if not current page... } else { // make it a link echo "<li class='pagination'><a href='$url/pg=$x$tab'>$x</a></li>"; } // end else } // end if } // end for // if not on last page, show forward and last page links if ($pg != $total_pages) { // get next page $nextpage = $pg + 1; // echo forward link for next page echo "<li class='pagination'><a href='$url/pg=$nextpage$tab'>></a></li>"; // echo forward link for lastpage echo "<li class='pagination'><a href='$url/pg=last$tab'>>></a></li>"; } // end if /****** end build pagination links ******/ echo "<div style='float:right; align: right; margin-top: 10px'>Displaying <font class='f2'>$displayed_results</font> of <font class='f2'>$total_results</font> results</div>"; } // end pagination links function 

Чтобы использовать: (Я использую базовую таблицу «users», потому что это просто)

Напишите один запрос, чтобы получить общее количество строк для всего, что вы ищете. Пример:

 $getusers = mysql_query("SELECT * FROM users", $conn); $total_users = mysql_num_rows($getusers) $display_limit = "20" // display 20 users per page 

затем используйте первую функцию.

 Pagination($total_users, $display_limit); 

затем запустите запрос еще раз, но установите ограничения на этот раз, чтобы на странице отображалось только 20 пользователей.

 $getusers = mysql_query("SELECT * FROM users ORDER BY id DESC LIMIT $offset, $display_limit", $conn); if($total_users == 0){ echo "There are no users at this time."; } else { // for each user while ($rowuserss = mysql_fetch_assoc($getusers)) { // echo data $user_id = $rowusers['id']; $username = $rowusers['username']; // etc etc } 

Затем, чтобы отобразить ссылки, используйте второй запрос

 PaginationLinks($url_to_go_to, $optional_tab_if_you_need_to_select_a_default_tab); 

Это должно работать для ЛЮБОГО запроса независимо от того, насколько сложно, если ваш запрос будет правильным для начала. Мне показалось, что ваш запрос был прав, только результаты отображались на второй странице. Любые способы, если эта функция не работает для вас, вы все равно должны создать свою разбивку на страницы в свою собственную функцию, это слишком много кода, чтобы выписать его в нескольких местах.