分页仅显示前10个结果,而不是x个页面,每个

时间:2016-04-16 19:06:48

标签: php loops pagination

我有一段PHP代码,它应该遍历所有结果,并为每10个结果创建一个新页面,但它只显示前10个结果,没有下一页或页码的选项。

是否有这样的理由,或者我错过了我编写的代码中的某些内容?

提前致谢。

我的代码如下;

$search_course = "
    SELECT title, summary, id
    FROM course
    WHERE title LIKE '%".$_POST['searchBar']."%'";
    $result = $mysqli->query($search_course) or die($mysqli->error);
    $search_result = $result->fetch_assoc();
    $row = mysqli_fetch_row($result);
    //total rows for search
    $rows = $row[0];
    //number of results per page
    $rows_per_page = 10;
    //shows last page
    $last_page = ceil($rows/$rows_per_page);
    if($last_page < 1){
        $last_page = 1;
    }
    $page_number = 1;
    if(isset($_GET['pn'])){
        $page_number = preg_replace('#[^0-9]#', '', $_GET['pn']);
    }
    //makes sure page number is between limits of $page_number
    if($page_number < 1){
        $page_number = 1;
    } else if($page_number > $last_page){
        $page_number = $last_page;
    }

    // sets the value of items to view
    $limit = 'LIMIT ' .($page_number -1) * $rows_per_page .',' .$rows_per_page;

    // query again only grabbing the set number of rows depending on page number
    $search_course = "
    SELECT title, summary, id
    FROM course
    WHERE title LIKE '%".$_POST['searchBar']."%'
    ORDER BY title DESC $limit";
    $result = $mysqli->query($search_course) or die($mysqli->error);
    $search_result = $result->fetch_assoc();
    //displays to the user the total number of results and the page numbers
    $total_number_of_results = "Search Results (<b>$rows</b>)";
    $page_user_is_on = "Page <b>$page_number</b> of <b>$last_page</b>";
    //set up pagination
    $pagination_controls = '';
    if($last_page != 1){
        if($page_number > 1){
            $previous = $page_number - 1;
            $pagination_controls .='<a href="'.$_SERVER['PHP_SELF'].'?pn='.$previous.'">previous</a> &nbsp; &nbsp; ';
            for($i = $page_number - 4; $i < $page_number; $i++)
            {
                if($i > 0){
                    $pagination_controls .= '<a href="'.$_SERVER['PHP_SELF'].'?pn='.$i.'">'.$i.'</a> &nbsp; ';
                }
            }
        }
        $pagination_controls.=''.$page_number.' &nbsm; ';
        //clickable links to the left
        for($i = $page_number+1; $i <= $last_page; $i++)
            {
                $pagination_controls .= '<a href="'.$_SERVER['PHP_SELF'].'?pn='.$i.'">'.$i.'</a> &nbsp; ';
                if($i >= $page_number+4){
                    break;
                }
            }
            if($page_number != $last){
                $next = $page_number + 1;
                $pagination_controls.='&nbsp; &nbsp; <a href="'.$_SERVER['PHP_SELF'].'?pn='.$next.'">Next</a>';
            }
    }
    $list = '';
    while($row = mysqli_fetch_array($result)){
        $title = $row['title'];
        $id = $row['id'];
        $list.='<p><a href="Selectedcourse.php">'.$title.' </p>';
    }
    mysqli_close($mysqli);

和html元素;

<!doctype html>
<html>
<head>
    <meta charset="utf-8">
    <link rel='stylesheet' href='courses.css'>
</head>
<body>
    <div class="header">
        <h1>Search Results for - <?= $_POST['searchBar'] ?></h1>
    </div>
    <div>
    <h3> <?php echo $page_user_is_on ?> </h3>
    <p><?php echo $list; ?></p>
    <p><?php echo $search_result['summary']; ?> </p>
</div>
    <div id="pagination_controls"><?php echo $pagination_controls; ?></div>

</body>
</html>

1 个答案:

答案 0 :(得分:1)

这是一个很好的努力来推动自己的分页。它主要是工作。问题出在你的第一个查询中:

$search_result = $result->fetch_assoc();
//This fetches only the first row of results
$row = mysqli_fetch_row($result);
//So this is not the total rows for search
$rows = $row[0];

这是使用prepared statements的更新脚本,您确实需要使用它。除非你喜欢被黑客攻击。

//turn errors on to develop, back off when you go live
error_reporting(E_ALL);
ini_set('display_errors', 1);

//here are my main changes
$search_param = "%" . $_POST['searchBar'] . "%";
$stmt = $mysqli->prepare("SELECT title, summary, id FROM course WHERE title LIKE ?");   
$stmt->bind_param("s", $search_param); //learn this
$stmt->execute();
$result = $stmt->get_result();

//This gets the number of rows in a query result
$rows = $result->num_rows;

//number of results per page
$rows_per_page = 10;

//shows last page
$last_page = ceil($rows/$rows_per_page);
if($last_page < 1){
    $last_page = 1;
}

if(isset($_GET['pn'])){
    $page_number = preg_replace('#[^0-9]#', '', $_GET['pn']);
} else {
    $page_number = 1;
}

//makes sure page number is between limits of $page_number
if($page_number < 1){
    $page_number = 1;
} else if($page_number > $last_page){
    $page_number = $last_page;
}

// sets the value of items to view
$limit = 'LIMIT ' .($page_number -1) * $rows_per_page .',' .$rows_per_page;

//displays to the user the total number of results and the page numbers
$total_number_of_results = "Search Results (<b>$rows</b>)";
$page_user_is_on = "Page <b>$page_number</b> of <b>$last_page</b>";

//query again only grabbing the set number of rows depending on page number
$stmt = $mysqli->prepare("SELECT title, summary, id FROM course WHERE title LIKE ? ".$limit);   
$stmt->bind_param("s", $search_param);
$stmt->execute();
$result = $stmt->get_result();


$list = '';
while($row = $result->fetch_assoc()){
    $title = $row['title'];
    $id = $row['id'];
    //I'm assuming you want each link to be different here...
    $list.='<p><a href="Selectedcourse.php?id='.$id.'">' . $title . '</a></p>';
}
mysqli_close($mysqli);

//set up pagination
$pagination_controls = '';
if($last_page != 1){
    if($page_number > 1){
        $previous = $page_number - 1;
        $pagination_controls .='<a href="'.$_SERVER['PHP_SELF'].'?pn='.$previous.'">previous</a> &nbsp; &nbsp; ';
        for($i = $page_number - 4; $i < $page_number; $i++)
        {
            if($i > 0){
                $pagination_controls .= '<a href="'.$_SERVER['PHP_SELF'].'?pn='.$i.'">'.$i.'</a> &nbsp; ';
            }
        }
    }
    $pagination_controls.=''.$page_number.' &nbsp; ';

    //clickable links to the left
    for($i = $page_number+1; $i <= $last_page; $i++)
        {
            $pagination_controls .= '<a href="'.$_SERVER['PHP_SELF'].'?pn='.$i.'">'.$i.'</a> &nbsp; ';
            if($i >= $page_number+4){
                break;
            }
        }
        if($page_number != $last_page){
            $next = $page_number + 1;
            $pagination_controls.='&nbsp; &nbsp; <a href="'.$_SERVER['PHP_SELF'].'?pn='.$next.'">Next</a>';
        }
}

最后是HTML部分,只有一处变化:

<div class="header">
    <h1>Search Results for - <?= $_POST['searchBar'] ?></h1>
</div>
<div>
<h3> <?php echo $page_user_is_on ?> </h3>
<p><?php echo $list; ?></p>
<p><?php /* echo $search_result['summary']; //Where was this coming from? */?> </p>
</div>
<div id="pagination_controls"><?php echo $pagination_controls; ?></div>