Fonctionnement de la base de données PHP : paginer les utilisateurs
Dans un projet réel, nous écrivons l'hôte, le nom d'utilisateur, le mot de passe et la bibliothèque dans le fichier de configuration.
Si c'est écrit en dur dans le code, si les informations pertinentes du serveur de base de données changent, cela n'est évidemment pas conforme à la pensée du programmeur de modifier tout le code.
De plus, dans chaque page qui doit se connecter à la base de données. Nous devons tous écrire des connexions, juger les erreurs et définir des jeux de caractères, ce qui est trop gênant. Et ce n’est pas propice à la réutilisation de ces codes.
Nous pouvons utiliser la série de fonctions include mentionnées précédemment pour atteindre notre objectif. L'image d'exemple est la suivante :
Par conséquent, nous pouvons créer un fichier de configuration config.php. Définissez toutes les configurations qui doivent être utilisées comme constantes. Le code est le suivant :
<?php //数据库服务器 define('DB_HOST', 'localhost'); //数据库用户名 define('DB_USER', 'root'); //数据库密码 define('DB_PWD', 'secret'); //库名 define('DB_NAME', 'book'); //字符集 define('DB_CHARSET', 'utf8'); ?>
Nous extrayons la page connection.php Lorsque nous aurons besoin de nous connecter à la base de données à l'avenir, il nous suffit de l'inclure. le fichier connexion.php. Le code est le suivant :
<?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); ?>
Nous pouvons implémenter la connexion à la base de données en incluant directement le fichier connection.php dans chaque fichier à l'avenir :
include 'connection.php';
Terminez les préparatifs ci-dessus, puis terminez la pagination. L'effet de pagination est le suivant :
La page doit contenir les éléments de base suivants :
元素 | 说明 | 备注 |
---|---|---|
首页 | 最开始进入到页面的第一页 | 用get传参才进去时默认为1 |
上一页 | 当前页减1 | 如果页码为第一页时减1,为应该为第一页 |
下一页 | 当前页加1 | 如果为最后一 |
尾页 | 最后一页 | 总条数除以每页显示数得到总页数 |
当前页 | 当前所在的页码 | 就是当前的页码 |
总页数 | 一共有多少个页面 | 总条数除以每页显示数 |
Lorsque nous contrôlons les numéros de page, nous implémentons le contrôle du numéro de page en transmettant la valeur du numéro de page dans la barre d'adresse URL. En ajoutant les informations relatives au numéro de page à page.php, nous pouvons calculer des informations plus efficaces. L'effet de la pagination contrôlant l'url est le suivant :
Dans l'implémentation du code, ces deux valeurssont en fait réalisées à travers le décalage (offset) et la quantité ( num) après la limite de pagination.
limite offset, num
页码 | url中get值 | limit偏移量,数量 |
---|---|---|
第1页 | 1 | 0,5 |
第2页 | 2 | 5,5 |
第3页 | 3 | 10,5 |
第n页 | n | (n-1)*5,5 |
Supposons que 5 éléments soient affichés par page. La formule finale pour contrôler la limite de pagination est la suivante :
offset的值为 (n-1)*5 num 为规定的5
Nous implémentons l'entreprise via le code :
1 Calculez les paramètres requis pour la pagination .
Nombre total
通过查询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 actuelle
Lorsque vous entrez pour la première fois dans la page page.php, l'url est http://www.php.com/page .php, suivi de non Il y a ?page=1 numéro d'identification de la page.
Nous devons donc créer manuellement un numéro d'identification de page et le transmettre à la variable de numéro de page actuelle $page.
Nous avons peur qu'il y ait des décimales dans la page passée par l'utilisateur, nous faisons donc une conversion de type forcée : (int) $_GET['page'].
La première façon d'écrire :
$page = isset($_GET['page']) ? (int) $_GET['page'] : 1;
La deuxième façon d'écrire
if (isset($_GET['page'])) { $page = (int) $_GET['page']; } else { $page = 1; }
Dernière page
Chaque page doit être un entier. Tout comme les mathématiques à l'école primaire. En moyenne, 5,6 personnes devraient préparer combien de pommes. La réponse doit être 6.
Si la page sort avec 20,3 pages, il faut utiliser la fonction d'arrondi plafond. Que le nombre de pagination devienne 21.
Nous divisons le nombre total par le nombre d'éléments de données affichés sur chaque page pour obtenir le nombre total de pages.
//每页显示数 $num = 5; $total = ceil($count / $num);
Contrôle des exceptions de la page précédente et de la page suivante
Et si l'utilisateur clique sur la page précédente sur la première page et clique sur la page suivante sur la dernière page ?
Dans ce cas, les données dépasseront la plage, ce qui entraînera l'affichage d'aucune donnée lors de la pagination.
Cette situation inhabituelle doit évidemment être prise en considération. Par conséquent, si la première page est soustraite de un lors de la pagination, nous en faisons la première page.
Lorsque nous en ajoutons un à la dernière page, nous en faisons la dernière page, ce qui complète le contrôle des exceptions.
if ($page <= 1) { $page = 1; } if ($page >= $total) { $page = $total; }
2. Instruction SQL
Nous avons dit précédemment que le cœur de la pagination est de contrôler l'affichage de chaque page via le décalage et le nombre. dans le numéro de l'instruction SQL.
Nous avons également répertorié la formule spécifique ci-dessus. Nous avons converti l'entreprise en code comme suit :
$num = 5; $offset = ($page - 1) * $num;
Nous avons appliqué $num et $offset à l'instruction SQL :
$sql = "select id,username,createtime,createip from user order by id desc limit $offset , $num";
Control. la valeur de pagination dans l'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>';
Nous connectons enfin l'ensemble de l'entreprise pour obtenir l'effet final. Le code est le suivant :
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);