ユーザーをページ分割するための...LOGIN

ユーザーをページ分割するための PHP データベース操作

実際のプロジェクトでは、ホスト、ユーザー名、パスワード、ライブラリを構成ファイルに記述します。

コード内にハードに記述されている場合、データベースサーバーの関連情報が変更された場合、すべてのコードを変更するというプログラマーの考え方と明らかに一致しません。

さらに、データベースに接続する必要があるすべてのページで。接続を書いたり、エラーを判定したり、文字セットを設定したりする必要があり、とても面倒です。また、これらのコードを再利用することは有益ではありません。

目標を達成するには、前述した一連の関数を使用できます。サンプル画像は次のとおりです:

2015-10-13_561c9c5350f16.png

したがって、設定ファイル config.php を作成できます。定数として使用する必要があるすべての設定を設定します。コードは次のとおりです。

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

将来データベースに接続する必要がある場合は、connection.php を含める必要があるだけです。ファイル。コードは次のとおりです:

<?phpinclude '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';

上記の準備を完了してから、ページング。ページネーション効果は次のとおりです:

2015-10-13_561c9c536b206.png

ページには、ページングで次の基本要素が含まれている必要があります:


現在のページから 1 を引いたもの。 現在のページに1を追加します最後のページ 現在のページ番号ページ数
要素 説明 備考
のページにアクセスしてくださいthe begin 最初のページ get を使用してパラメータを渡す場合、デフォルトは 1 です。 前のページ
ページ番号が最初のページの場合は、1 を引いたものが最初のページになります次のページ
最後の場合最後のページ
アイテムの合計数をページあたりの表示数で割って、アイテムの合計数を取得しますページ現在のページ
は現在のページ番号です総ページ数
項目の合計数を1件あたりの表示数で割ったものページ

ページ番号を制御するときは、URL アドレス バーを介してページ番号の値を渡すことによってページ番号制御を実装します。ページ番号に関する情報をpage.phpに追記することで、より有効な情報を算出することができます。ページングを制御する URL の効果は次のとおりです。

QQ截图20161114161938.png

コード実装では、ページングは​​オフセット (offset) と制限後の数値 (num) によって実際に実現されます。

制限オフセット、番号

ページ110、 2 3n
ページ番号URLの値を取得制限オフセット、数量
ページ 2
5,5ページ 3
10,5ページ n
(n-1)*5,5


各ページに 5 つの項目が表示されると仮定します。ページングの制限を制御するための最終的な式は次のとおりです:

offset的值为 (n-1)*5
num 为规定的5

コードを通じてビジネスを実装します:

1. ページングに必要なパラメータを計算します

総数

通过查询user表的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.php.com/page.php で、その後に ?page=1 ページ識別番号はありません。

そのため、ページ識別番号を手動で作成し、それを現在のページ番号変数 $page に渡す必要があります。

ユーザーから渡されたページに小数点等が含まれている可能性があるため、強制的に型変換を行います: (int) $_GET['page']。

最初の書き方:

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

2 番目の書き方

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

最後のページ

各ページは整数でなければなりません。小学校の算数と同じです。平均して、5.6 人が何個のリンゴを準備する必要があります。答えは 6 でなければなりません。

ページに 20.3 ページが表示される場合は、丸め関数 ceil を使用する必要があります。ページネーション数を21とします。

合計数を各ページに表示されるデータ項目の数で割って、合計ページ数を取得します。

//每页显示数
$num = 5;
$total = ceil($count / $num);

前ページと次ページの例外制御

ユーザーが最初のページで前のページをクリックし、最後のページで次のページをクリックした場合はどうなりますか?

この場合、データが範囲を超えるため、ページネーション時にデータが表示されなくなります。

この異常な状況を考慮する必要があるのは明らかです。したがって、ページング中に最初のページが 1 減算される場合は、それを最初のページとします。
最終ページに追加した場合は、最終ページ、つまり例外制御が完了します。

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

2. SQL ステートメント

ページングの核心は SQL ステートメントの offset と num によって各ページの表示数を制御することであると前に述べました。

また、上記の特定の式を次のようにコードに変換しました:

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

$num と $offset を SQL ステートメントに適用しました:

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

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 $num = 5; $offset = ($page - 1) * $num; //我们将$num和$offset应用于SQL语句中: $sql = "select id,username,createtime,createip from user order by id desc limit $offset , $num"; //控制好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>'; //我们最后将整体业务串联起来实现最终效果,代码如下: 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); ?>
コースウェア
    なし