페이지 매김 만들기LOGIN

페이지 매김 만들기

실제 프로젝트에서는 구성 파일에 호스트, 사용자 이름, 비밀번호 및 라이브러리를 작성합니다.
코드에 하드하게 썼다면, 데이터베이스 서버의 관련 정보가 바뀌었다면, 코드를 전부 수정한다는 것은 프로그래머의 생각과 분명히 맞지 않습니다.

또한 모든 페이지에서 데이터베이스에 연결해야 합니다. 우리 모두는 연결을 작성하고, 오류를 판단하고, 문자 세트를 설정해야 하는데 이는 너무 번거롭습니다. 그리고 이러한 코드를 재사용하는 것은 도움이 되지 않습니다.

앞서 언급한 일련의 포함 기능을 사용하여 목표를 달성할 수 있습니다. 예시 그림은 다음과 같습니다.

QQ截图20161010101506.png

따라서 구성 파일 config.php를 만들 수 있습니다. 상수로 사용해야 하는 모든 구성을 설정합니다. 코드는 다음과 같습니다.

<?php
//数据库服务器
define('DB_HOST', 'localhost');
//数据库用户名
define('DB_USER', 'root');
//数据库密码
define('DB_PWD', 123456789);
//库名
define('DB_NAME', 'book');
//字符集
define('DB_CHARSET', 'utf8');
?>

나중에 데이터베이스에 연결해야 할 경우에만 연결하면 됩니다. Connection.php 파일. 코드는 다음과 같습니다.

<?php
include 'config.php';
$conn = mysqli_connect(DB_HOST, DB_USER, DB_PWD, DB_NAME);
if (mysqli_errno($conn)) {
    mysqli_error($conn);
    exit;
}
mysqli_set_charset($conn, DB_CHARSET);

향후 각 파일에 Connection.php 파일을 직접 포함시켜 데이터베이스 연결을 구현할 수 있습니다.

include 'connection.php';

위의 준비사항을 모두 마친 후 페이징을 완료해 주세요. 페이지 매김 효과는 다음과 같습니다.

QQ截图20161010101814.png

페이지에는 다음과 같은 기본 요소가 포함되어야 합니다.

QQ截图20161010101852.png

QQ截图20161010101858.png

페이지 번호 제어 시 URL 주소창을 통해 페이지 번호 값을 전달하여 페이지 번호 제어를 구현합니다. page.php에 페이지 번호 관련 정보를 추가하면 보다 효과적인 정보를 산출할 수 있습니다. URL 제어 페이징의 효과는 다음과 같습니다.

QQ截图20161010101933.png

코드 구현에서 이 두 값은 실제로 오프셋(offset)과 수량( num) 페이징 제한 이후.

limit offset , num

QQ截图20161010101943.png

각 페이지에 5개의 항목이 표시된다고 가정합니다. 페이징 제한을 제어하는 ​​최종 공식은 다음과 같습니다.

오프셋 값은 (n-1)*5
num은 지정된 5

를 통해 비즈니스를 구현합니다. code:

1. 페이징에 필요한 매개변수 계산

총 개수

사용자 테이블의 count(id)를 쿼리하여 총 개수 $count를 구합니다.

$count_sql = 'select count(id) as c from user';
$result = mysqli_query($conn, $count_sql);
$data = mysqli_fetch_assoc($result);
//得到总的用户数
$count = $data['c'];

현재 페이지

page.php 페이지에 처음 접속하면 URL은 http://www.phpxy.com/page.php이고, 존재하지 않는 ?page가 이어집니다. =1 페이지 식별 번호.

따라서 페이지 식별 번호를 수동으로 생성하고 이를 현재 페이지 번호 변수 $page에 전달해야 합니다.

사용자가 전달한 페이지에 소수점 등이 있을까봐 강제 형식 변환((int) $_GET['page'])을 수행합니다.

첫 번째 작성 방법:

$page = isset($_GET['page']) ? (int) $_GET['page'] : 1;

두 번째 작성 방법

if (isset($_GET['page'])) {
    $page = (int) $_GET['page'];
} else {
    $page = 1;
}

마지막 페이지

각 페이지는 정수여야 합니다. 마치 초등학교 수학과 같습니다. 평균적으로 5.6명이 사과 몇개를 준비해야 합니다. 답은 6이어야 합니다.

페이지가 20.3페이지로 나오면 반올림 기능 최대치를 사용해야 합니다. 페이지 매기기 수를 21로 설정합니다.

총 페이지 수를 각 페이지에 표시되는 데이터 항목 수로 나누어 총 페이지 수를 구합니다.

//페이지당 디스플레이 수

$num = 5;
$total = ceil($count / $num);

이전, 다음 페이지 제어 이상

첫 페이지에서 이전 페이지를 클릭하면 마지막 페이지에서 다음 페이지를 클릭하면 어떻게 해야 하나요?

이 경우 데이터가 범위를 초과하여 페이지를 매길 때 데이터가 표시되지 않습니다.

분명히 이러한 특이한 상황을 고려해야 합니다. 따라서 페이징 중에 첫 번째 페이지에서 1을 빼면 이를 첫 번째 페이지로 만듭니다.
마지막 페이지에 하나를 추가하면 마지막 페이지로 만들어 예외처리를 완료합니다.

if ($page <= 1) {
    $page = 1;
} 
if ($page >= $total) {
    $page = $total;
}

2. SQL문

앞서 페이징의 핵심은 SQL문의 오프셋과 num을 통해 각 페이지의 표시 개수를 조절하는 것이라고 말했습니다.

위의 특정 공식도 나열했습니다.

$num = 5;
$offset = ($page - 1) * $num;

SQL 문에 $num 및 $offset을 적용했습니다.

$sql = "select id,username,createtime,createip from user order by id desc limit $offset , $num";

Control URI의 페이징 값

echo '<tr>
    <td colspan="5">
    <a href="page.php?page=1">首页</a>
    <a href="page.php?page=' . ($page - 1) . '">上一页</a>
    <a href="page.php?page=' . ($page + 1) . '">下一页</a>
    <a href="page.php?page=' . $total . '">尾页</a>
    当前是第 ' . $page . '页  共' . $total . '页
    </td>
    </tr>';

마침내 전체 비즈니스를 연결하여 최종 효과를 얻습니다. 코드는 다음과 같습니다.

<?php
include 'connection.php';
$count_sql = 'select count(id) as c from user';
$result = mysqli_query($conn, $count_sql); 
$data = mysqli_fetch_assoc($result);
//得到总的用户数
$count = $data['c'];
$page = isset($_GET['page']) ? (int) $_GET['page'] : 1;
/*
if (isset($_GET['page'])) {
    $page = (int) $_GET['page'];
} else {
    $page = 1;
}
 */
//每页显示数
$num = 5;
//得到总页数
$total = ceil($count / $num);
if ($page <= 1) {
    $page = 1;
}
if ($page >= $total) {
    $page = $total;
}
$offset = ($page - 1) * $num;
$sql = "select id,username,createtime,createip from user order by id desc limit $offset , $num";
$result = mysqli_query($conn, $sql);
if ($result && mysqli_num_rows($result)) {
    //存在数据则循环将数据显示出来
    echo '<table width="800" border="1">';
    while ($row = mysqli_fetch_assoc($result)) {
        echo '<tr>';
        echo '<td>' . $row['username'] . '</td>';
        echo '<td>' . date('Y-m-d H:i:s', $row['createtime']) . '</td>';
        echo '<td>' . long2ip($row['createip']) . '</td>';
        echo '<td><a href="edit.php?id=' . $row['id'] . '">编辑用户</a></td>';
        echo '<td><a href="delete.php?id=' . $row['id'] . '">删除用户</a></td>';
        echo '</tr>';
    }
    echo '<tr><td colspan="5"><a href="page.php?page=1">首页</a>  <a href="page.php?page=' . ($page - 1) . '">上一页</a>   <a href="page.php?page=' . ($page + 1) . '">下一页</a>  <a href="page.php?page=' . $total . '">尾页</a>  当前是第 ' . $page . '页  共' . $total . '页 </td></tr>';
    echo '</table>';
} else {
    echo '没有数据';
}
mysqli_close($conn);
?>

페이징 원리

1. 먼저 SQL 문에서 Limit의 사용법을 이해하세요.

SELECT * FROM table...limit 시작 위치, 숫자 작업 시작(시작 위치는 0부터 시작)

예:

처음 20개 레코드 가져오기: SELECT * FROM table...limit 0, 20
20개 레코드 가져오기 11번째부터 시작: SELECT * FROM table …… Limit 10 , 20

LIMIT n은 LIMIT 0,n과 동일합니다.

예를 들어, select * from table LIMIT 5; //select * from table LIMIT 0, 5와 동일하게 처음 5개 행을 반환합니다.

2. 원리

소위 페이징 표시란 데이터베이스에 설정된 결과를 세그먼트별로 표시하는 것을 의미합니다.

세그먼트 방법, 현재 어느 세그먼트에 있는지( 페이지당 항목 수, 현재 포함된 항목 수) 페이지)

처음 10개 레코드: 테이블 제한 0,10에서 * 선택
11~20번째 레코드: 테이블 제한 10에서 * 선택 ,10
21번째부터 30번째 레코드 :테이블 제한 20,10에서 * 선택

페이징 공식:

(현재 페이지 번호 - 1) >

3. $_SERVER["REQUEST_URI"] 함수

는 미리 정의된 서버 변수의 일종으로 $_SERVER로 시작하는 모든 것을 미리 정해진 서버 변수라고 합니다.

REQUEST_URI의 기능은 도메인 이름을 제외한 전체 주소 경로인 현재 URI를 가져오는 것입니다.

예:

현재 페이지는 http://www.test.com/home.php?id=23&cid=22

echo $_SERVER["REQUEST_URI"]

결과는 다음과 같습니다. : / home.php?id=23&cid=22

4.parse_url() URL 파싱 함수

parse_url()을 파싱하는 기능입니다. 고정 키 값 배열에 대한 함수의 URL


Select * from table limit ($Page- 1) * $PageSize, $PageSize

결과:

배열
(
[구성표] => ; http ;프로토콜
                                                                                                               [path] => ; /path                 ; >

5. 코드 예시




이 메시지 페이징은 세 부분으로 나뉘며, 하나는 데이터베이스 디자인입니다. , 하나는 연결 페이지이고 다른 하나는 표시 페이지입니다.


(1) 디자인 데이터베이스

디자인 데이터베이스는 bbs라고 하며, 제목, 최종 날짜, 사용자, 사용자 등의 필드를 포함하는 메시지라는 데이터 테이블이 있습니다. 메시지 제목, 메시지 날짜, 메시지 사람, 메시지 내용 (2) 연결 페이지

$ua=parse_url("http://username:password@hostname/path?arg=value#anchor");
 print_r($ua);

(3) 표시 페이지 으르르르르르르

다음 섹션
<?php include 'connection.php'; $count_sql = 'select count(id) as c from user'; $result = mysqli_query($conn, $count_sql); $data = mysqli_fetch_assoc($result); //得到总的用户数 $count = $data['c']; $page = isset($_GET['page']) ? (int) $_GET['page'] : 1; /* if (isset($_GET['page'])) { $page = (int) $_GET['page']; } else { $page = 1; } */ //每页显示数 $num = 5; //得到总页数 $total = ceil($count / $num); if ($page <= 1) { $page = 1; } if ($page >= $total) { $page = $total; } $offset = ($page - 1) * $num; $sql = "select id,username,createtime,createip from user order by id desc limit $offset , $num"; $result = mysqli_query($conn, $sql); if ($result && mysqli_num_rows($result)) { //存在数据则循环将数据显示出来 echo '<table width="800" border="1">'; while ($row = mysqli_fetch_assoc($result)) { echo '<tr>'; echo '<td>' . $row['username'] . '</td>'; echo '<td>' . date('Y-m-d H:i:s', $row['createtime']) . '</td>'; echo '<td>' . long2ip($row['createip']) . '</td>'; echo '<td><a href="edit.php?id=' . $row['id'] . '">编辑用户</a></td>'; echo '<td><a href="delete.php?id=' . $row['id'] . '">删除用户</a></td>'; echo '</tr>'; } echo '<tr><td colspan="5"><a href="page.php?page=1">首页</a> <a href="page.php?page=' . ($page - 1) . '">上一页</a> <a href="page.php?page=' . ($page + 1) . '">下一页</a> <a href="page.php?page=' . $total . '">尾页</a> 当前是第 ' . $page . '页 共' . $total . '页 </td></tr>'; echo '</table>'; } else { echo '没有数据'; } mysqli_close($conn); ?>
코스웨어