Вопрос

I am building a product catalog, that I want to be determined depending on users device. ie., if windows device show particular products. I have my products listing absolutely fine, however when implementing pagination, I am stuck.

I want only 6 items to be listed per page, I have more results. However more results are showing on the first page. When I select to go next, the ID number changes, to show it is showing me the next result, but it continues to show the same page, so obviously I am missing/got confused somewhere with my code. I'd appreciate any advice:

$current_url = $_SERVER['REQUEST_URI'];
$current_url = substr($current_url, 1);
$results = mysqli_query($conn, "SELECT * FROM apps A INNER JOIN device D ON D.DeviceID = A.DeviceID WHERE D.DeviceName = '$os'");    
$foundnum = mysqli_num_rows($results);
            if ($foundnum==0){
        echo "Sorry, there are currently no applications that are compatible with your device. Please try another option.";
    } else {
        echo "$foundnum applications are avaliable for '$os' devices:<p>";
        $per_page = 6;
            $start = $_GET['start'];
        $max_pages = ceil($foundnum / $per_page);

if(!$start)
            $start=0; 
        while($obj = $results->fetch_object()){
        $applicationid=$obj->ApplicationID;
        $start=0; 
        echo "<div class=\"col-4 col-sm-4 col-lg-4\">";
        echo '<form method="post" action="cart_update.php">';
        echo "<div id='product'><a href='appproduct.php?id=$applicationid'><img src='images/app_images/$applicationid.jpg' alt='Product picture'/></div>";
        echo '<h2>'.$obj->ApplicationName.'</h2>';
        echo '<p>'.$obj->ApplicationDescription.'</p>';
        if($obj->App_cost=="0.00"){ 
                echo '<p>Free</p>';
            }else{
               echo '<p>£'.$obj->App_cost.'</p>';
            }
        echo '<button class="add_to_cart">Add To Cart</button>';
        echo '<input type="hidden" name="product_code" value="'.$obj->ApplicationID.'" />';
        echo '<input type="hidden" name="type" value="add" />';
        echo '<input type="hidden" name="return_url" value="'.$current_url.'" />';
        echo '</form><br /><br /></div>';
     }   


//Pagination Starts
    echo "<center>";
    $prev = $start - $per_page;
    $next = $start + $per_page;                     
    $last = $max_pages - 1;
    if($max_pages > 1){   
    //previous button
        if (!($start<=0)) 
            echo "<a href='index.php?os=$os=Search+source+code&start=$prev'>Prev |</a> ";             
            //pages 
        $i = 0;   
        for ($counter = 1; $counter <= $max_pages; $counter++){
            if($i == $start){
            echo " <a href='index.php?os=$os=Search+source+code&start=$i'><b> $counter |</b></a> ";
            }
            else {
                echo " <a href='index.php?os=$os=Search+source+code&start=$i'> $counter |</a> ";
            }  
        $i = $i + $per_page;                 
        }
    }      
//next button
if (!($start >=$foundnum-$per_page))
    echo " <a href='index.php?os=$os=Search+source+code&start=$next'> Next</a> ";    
}   
echo "</center>"
?>
Это было полезно?

Решение

You should try to do the pagination via database, instead of loading all the results eagerly. If you had 100000 records and wanted to show only first 6 of them, you'd need to fetch 99994 records you might not use. Try to use limit of sql.

As for your problem with "bolding" current page number, you have logic error here:

    $i = 0;   
    for ($counter = 1; $counter <= $max_pages; $counter++) {
        if($i == $start){
            echo " <a href='index.php?os=$os=Search+source+code&start=$i'><b> $counter |</b></a> ";
        } else {
            echo " <a href='index.php?os=$os=Search+source+code&start=$i'> $counter |</a> ";
        }  
    $i = $i + $per_page;  

According to this snippet you are comparing $i to $start, where $i is always equal to 0, so it will bold anything only on first page.

Другие советы

You need to use LIMIT in your MySQL query to only get a page of results at a time. It will look something like LIMIT 0, 6.

change this line it will work

$results = mysqli_query($conn, "SELECT * FROM apps A INNER JOIN device D ON D.DeviceID = A.DeviceID WHERE D.DeviceName = '$os' LIMIT $_GET['start'], 6;");   

but it's not the best way to do pagination or putting a variable straight from global variables. I would advise you to use at leat mysql escape string function in php

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top