Jump to content
Larry Ullman's Book Forums

Recommended Posts

Hi,

 

I am having problems with pagination.  I thought I had script 9.4 working without any problems, so carried on with script 9.5, which I also thought was working OK.

 

I then added another table to my online database which I accessed by a script based on 9.5, but then I found the pagination wasn't working.

 

I then found the pagination in script 9.5 wasn't working.  The s and p appear in the url address line, and it would appear the code:

 

if (isset($_GET['s']) && is_numeric($_GET['s']))
{    $start = $_GET['s'];  }
else
{    $start = 0;  }

 

is ignored, as start always stays at 0 (or whatever value I put as $start = ).

 

I've checked and double checked but can't see where the problem is.

The full code is included here:

-------------------------------------

 

<?php # Script 9.5 - view_users95.php

// This script retrieves all the records from the users table.

// This version allows the results to be sorted in different ways.

// This version paginates the query results.

$page_title = 'View the Current Users';

include ('includes/header8.html');

// Page header:

echo '<h1>Registered Users 5</h1>';

require_once ('../mysqli_connect.php'); // Connect to the db.

// Number of records to show per page:
$display = 5;

// Determine how many pages there are..
if(isset($_GET['p']) && is_numeric($_GET['p']))
{
    //Already been determined
    $pages = $_GET['p'];
}
else
{
    // need to determine
    // count the number of records
    $q = "SELECT COUNT(user_id) FROM users";
    $r = @mysqli_query ($dbc, $q);
    $row = @mysqli_fetch_array ($r, MYSQLI_NUM);
    $records = $row[0];
    // calculate the number of pages...
    if ($records > $display)
    {
        // More than 1 page.
        $pages = ceil ($records/$display);
    }
    else
    {
        $pages = 2;
    }
}// end of p IF

// Determine where in the database to start returning results
if (isset($_GET['s']) && is_numeric($_GET['s']))
{
    $start = $_GET['s'];
}
else
{
    $start = 0;
}    

// Determine the sort...
// Default is by registration date.

$sort = (isset($_GET['sort'])) ? $_GET['sort'] : 'rd';

// Determine the sorting order:

switch ($sort)
{
    case 'ln':
        $order_by = 'last_name ASC';
        break;

    case 'fn':
        $order_by = 'first_name ASC';
        break;

    case 'rd':
        $order_by = 'registration_date ASC';
        break;

    default:
        $order_by = 'registration_date ASC';
        $sort = 'rd';
        break;
}

// Make the query:

$q = "SELECT last_name, first_name, DATE_FORMAT(registration_date, '%d %M, %Y') AS dr, user_id FROM users ORDER BY $order_by LIMIT $start, $display";

$r = @mysqli_query ($dbc, $q); // Run the query.

// Table header.

echo '<table border="5" align="center" cellspacing="0" cellpadding="5" width="50%">

<thead><tr>
    <td align="left"><b>Edit</b></td>
    <td align="left"><b>Delete</b></td>
    <td align="left"><b><a href="view_users95.php?sort=ln">Last Name</a></b></td>
    <td align="left"><b><a href="view_users95.php?sort=fn">First Name</a></b></td>
    <td align="left"><b><a href="view_users95.php?sort=rd">Date Registered</a></b></td>
</tr>
</thead>';

// Fetch and print all the records:

$bg = '#eeeeee'; // Set the initial background colour.

while ($row = mysqli_fetch_array($r, MYSQLI_ASSOC))
{

    //$bg = ($bg=='#bbbbbb' ? '#ffffff' : '#bbbbbb'); // Switch the background colour, using the Ternary operator.
    echo '<tr bgcolor="' . $bg . '">
    <td align="left"><a href="edit_user93pw.php?id=' . $row['user_id'] . '">Edit</a></td>
    <td align="left"><a href="delete_user92pw.php?id=' . $row['user_id'] . '">Delete</a></td>
    <td align="left">' . $row['last_name'] . '</td>
    <td align="left">' . $row['first_name'] . '</td>
    <td align="left">' . $row['dr'] . '</td>
    </tr>

    ';
}

 // end of while  loop

echo '</table>'; // Close the table.

mysqli_free_result ($r); // Free up the resources.

mysqli_close($dbc); // Close the database connection.

//Make the links to other pages, if necessary

if ($pages > 1)
{
    // Add some spacing and start a paragraph
    echo '<br /><p>';
    // Determine what page the script is on:
    $current_page = ($start/$display) + 1;

    // If it's not the first page, make a previous button:
    if ($current_page != 1)
    {
        echo '<a href="view_users95.php?s=' . ($start - $display) . ';p=' . $pages . ';sort=' . $sort .'">Previous</a> ';
    }
    // Make all the numbered pages:
    for ($i = 1; $i <= $pages; $i++)
    {
        if ($i != $current_page)
        {
            echo '<a href="view_users95.php?s=' . (($display * ($i - 1))) . ';p=' . $pages . ';sort=' . $sort . '">' . $i . '</a> ';
        }
        else
        {
            echo $i . ' ';
        }
    } // end of FOR loop
            
    // If it's not the last page, make a next button:
    if ($current_page != $pages)
    {
        echo '<a href="view_users95.php?s=' . ($start + $display) . ';p=' . $pages . ';sort=' . $sort . '">Next</a> ';
    }

    echo '</p>'; // close the paragraph
} // end of the links section

echo "<p>Users = $records.</p>\n"; // with this line in the pagination doesn't work
echo "<p>Pages = $pages.</p>\n";

echo '<br />';

include ('includes/footerx.html');

?>
-----------------------------------

I hope you can shed some light on this problem

 

Thanks

 

Chris

 

 

Link to comment
Share on other sites

Hello,

 

You repeatedly used semi-colons instead of ampersands in the URLs :

 echo '<a href="view_users95.php?s=' . ($start - $display) . ';p=' . $pages . ';sort=' . $sort .'">Previous</a> ';

 

Check all your URLs!

 

I hope this helps,

 

Emilie

  • Upvote 2
Link to comment
Share on other sites

Emilie,

 

Many thanks.

 

Although the only way I could get the code to work now was to remove the

 

'&p=' . $pages . part of the URL lines, as with that included I had '500 - Internal Server Error' when trying to navigate by pages. Although the code seems to work fine without this part.

 

Chris

Link to comment
Share on other sites

Hello,

 

I understand. In order to avoid this kind of problem, just use the 'code' tags: the icon is in the middle on the bottom line and looks like this: < > It will also apply syntax coloring, which helps read the code.

 

I hope this helps,

 

Emilie

Link to comment
Share on other sites

Emilie,

 

Thanks - I've found the 'code' tags icon you mentioned, will try to remember for next time!

 

HartleySan,

 

Thanks. Removing the '&p=' . $pages . section of the URL line stopped the errors with no apparent side effects.  I enabled error reporting (by including script 7.3 in my code), and the script ran fine with '&p=' . $pages . in the URL line - only this time I had the error meassge below the pagination line, and below that I had  Users = .   , instead of Users = 11.

 

I can't figure out what  '&p=' . $pages .  adds to the code, apart from, in my case, an  error which seems to delete that value in $records.

 

Chris

Link to comment
Share on other sites

HartleySan,

 

The URL script:

echo '<a href="view_users.php?s=' . ($start - $display) . '&p=' . $pages . '&sort=' . $sort .'">Previous</a> ';

is the one that gives the error, - generating the url:  /view_users.php?s=0&p=3&sort=ct

where as:

echo '<a href="veiw_users.php?s=' . ($start - $display) . '&sort=' . $sort .'">Previous</a> ';

works fine, the URL generated: view_users.php?s=0&sort=ct

 

- is this what you were wanting to see?

Link to comment
Share on other sites

HartleySan,

 

Thanks, I added the code, when the line without '&p=' . $pages . is used I get:

Array

(

=> 10

[sort] => rd

)

 

and no errors.

 

Whereas when using the line with '&p=' . $pages . I get

Array

(

=> 5

[p] => 3

[sort] => rd

)

 

and the error report 'Undefined variable: records'

 

the script has the line:

$records = $row[0];

 

but I've just realised this line only runs if p has not been defined.  So to overcome this I'e added the following script:

// Determine how many records there are..
if(isset($_GET['r']) && is_numeric($_GET['r']))
{
	//Already been determined
	$records = $_GET['r'];
}
else
{
	// need to determine
	// count the number of records
	$q = "SELECT COUNT(user_id) FROM users";
	$r = @mysqli_query ($dbc, $q);
	$row = @mysqli_fetch_array ($r, MYSQLI_NUM);
	$records = $row[0];
}

and this works OK.

 

Having now seen the coding error it looks like a silly one, but the result was annoying. At least I've got to grips with the error reporting, Which would have taken longer without your prompts.

 

Many thanks for you help, and this great forum.

  • Upvote 1
Link to comment
Share on other sites

 Share

×
×
  • Create New...