1

Twitterで有名人を一覧表示するページを作成しています。ページには、最初のループの場合と同様に 10 個の異なる結果が表示されますが、データベースから次の 10 個の値を取得するために $result を更新していないようです (次のページ セットなど)。

<?php

    // connect to the database
    $con = mysql_connect("localhost","someuid","somepwd");
      if (!$con)
        {
        die('Could not connect: ' . mysql_error());
        }

    mysql_select_db("celebrity_twitter", $con);

    $result = mysql_query("SELECT * FROM celebrities");

    // number of results to show per page
    $per_page = 10;

    $total_results = mysql_num_rows($result);
    $total_pages = ceil($total_results / $per_page);

    // check if the 'page' variable is set in the URL (ex: view-paginated.php?page=1)
    if (isset($_GET['page']) && is_numeric($_GET['page']))
    {
            $show_page = $_GET['page'];

            // make sure the $show_page value is valid
            if ($show_page > 0 && $show_page <= $total_pages)
            {
                    $start = ($show_page -1) * $per_page;
                    $end = $start + $per_page; 
            }
            else
            {
                    // error - show first set of results
                    $start = 0;
                    $end = $per_page; 
            }               
    }
    else
    {
            // if page isn't set, show first set of results
            $start = 0;
            $end = $per_page; 
    }

    // display data in table
    echo "<table class='table table-striped'>";
    echo "<tr> <th>Avatar</th> <th>Celebrity Name</th> </tr>";

    // loop through results of database query, displaying them in the table
    for($i = $start; $i < $end; $i++ && $row = mysql_fetch_array($result) )
    {
            // make sure that PHP doesn't try to show results that don't exist
            if ($i == $total_results) { break; }

            // echo out the contents of each row into a table
            echo "<tr>";
            echo "<td><img height='73' width='73' src=" . "http://api.twitter.com/1/users/profile_image?screen_name=" . $row['avatar'] . "&size=bigger></td>";
            echo "<td><a href=" . $row['url'] . " target='_blank'>" . $row['uid'] . "</td></a>";
            echo "</tr>"; 
    }
    // close table>
    echo "</table>";

     // display pagination
    echo "<strong>Page: </strong>";
    for ($i = 1; $i <= $total_pages; $i++)
    {
            echo "<a href='index.php?page=$i'>$i</a> ";
    }
?>
4

2 に答える 2

1

私は現在これを使用していますが、私にとっては完全にうまく機能しています。あなたにもうまくいくことを願っています: PHP Pagination

于 2012-10-21T15:10:29.550 に答える
0

データベースに自分自身を配置するのではなく、常に最初の要素を読み取ります。

// loop through results of database query, displaying them in the table
for($i = $start; $i < $end; $i++ && $row = mysql_fetch_array($result) )
{
        // make sure that PHP doesn't try to show results that don't exist
        if ($i == $total_results) { break; }

これを行う適切な方法はLIMIT、MySQL の句を使用して、実際のレコード数を回復するための特別な句を使用することです。

SELECT SQL_CALC_FOUND_ROWS * FROM celebrities LIMIT $start, $resultsperpage;

SELECT FOUND_ROWS(); // This is number of celebrities

つまり、クエリを実行する「前」に $start を計算する必要があるということです。したがって、行が返されない場合に備える必要があります。

かなり無駄な簡単代替手段は、すべてを取得して必要な行のみを表示することです。

// loop through results of database query, displaying them in the table
for ($i = 0; $i < $total_results; $i++)
{
    $row = mysql_fetch_array($result);
    if ($i < $start) continue;
    if ($i == $end) break;

LIMIT の実装

mysql_select_db("celebrity_twitter", $con);

// number of results to show per page
$per_page = 10;

// We REALLY ought to move on to PDO: mysql_* will be deprecated sooner or later
$query    = mysql_query('SELECT SQL_CALC_FOUND_ROWS * FROM celebrities');

// check if the 'page' variable is set in the URL (ex: view-paginated.php?page=1)
if (isset($_GET['page']) && is_numeric($_GET['page']))
{
        $show_page = (int)$_GET['page'];
        // make sure the $show_page value is valid
        if ($show_page > 0)
                $start = ($show_page -1) * $per_page;
        else
                $start = 0;
        $query .= " LIMIT $start, $per_page;";
    $paged = True;
}
else
{
    $paged = False;
    // The query having no LIMIT, it will retrieve everything
    // if (!$paged), later we will display a link "Show Paged".
}

// Now run the query
$result = mysql_query($query);

// Also fetch REAL number of rows in table {{{
$exec   = mysql_query("SELECT FOUND_ROWS() AS results;");
$tuple  = mysql_fetch_assoc($exec);
$results= $tuple['results'];
mysql_free_result($exec);
unset($exec, $tuple);
// }}}

// If paging, calculate page number. Later, if ($paged), we'll display the pager.
if ($paged)
{
    $maxpages = ceil($results / $per_page);
    if ($page > $maxpages)
        $page = $maxpages+1; // We fetch nothing.
    else
        $page = floor($start / $per_page)+1;
}

// display data in table. It is best to calculate $html first
// and then output it all together at end if no error.

$html = "<table class='table table-striped'>";
$html .= "<tr> <th>Avatar</th> <th>Celebrity Name</th> </tr>";

// loop through results of database query, displaying them in the table
// Here, we get all and only good results, so we need not check anything
while($row = mysql_fetch_array($result))
{
        // echo out the contents of each row into a table
        $html .= "<tr>";
}
于 2012-10-21T15:27:52.507 に答える