Сложный запрос + сценарий разбиения на страницы - PullRequest
1 голос
/ 26 июня 2011

Проблема 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");

              ?>

Спасибо!

1 Ответ

1 голос
/ 24 января 2012

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

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

Для использования: (я использую базовую таблицу «пользователи», потому что она проста)

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

$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);

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...