문제

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