Lorsque vous utilisez PHP pour manipuler les bases de données MySQL, nous utilisons généralement l'extension MySQLI pour exécuter plusieurs instructions SQL. Dans ce scénario de requête multi-statement, next_result () est une fonction très critique qui permet aux développeurs d'accéder progressivement à l'ensemble de résultats de chaque requête. En plus de cette fonction de base, next_result () peut également nous aider à implémenter des fonctions avancées telles que la pagination et le tri dans certains scénarios complexes.
Cet article combinera des exemples de code réels pour montrer comment utiliser Next_Result () dans la pagination et le tri, en particulier lorsque nous voulons terminer plusieurs fragments de données via une seule demande.
Next_result () est une méthode dans l'objet MySQLI qui est utilisé pour traiter les résultats de requête contenant plusieurs instructions. Lors de l'exécution de plusieurs SQL, le premier ensemble de résultats est obtenu via Store_Result () ou USE_RESULT () , et next_result () est utilisé pour passer au jeu de résultats suivant.
Syntaxe de base:
$mysqli->next_result();
Dans la plupart des applications, la pagination et le tri sont généralement effectués en envoyant une requête SQL avec limite et commande à la base de données. Mais parfois, afin d'améliorer les performances ou de réduire le nombre d'interactions entre les clients et les bases de données, nous pouvons vouloir envoyer plusieurs requêtes à la fois et obtenir plusieurs blocs de données paginés ou différents résultats triés à la fois. C'est exactement là que Next_result () peut être utile.
Prenons une liste d'utilisateurs à titre d'exemple, supposons que nous voulons obtenir:
Données pour la page actuelle (avec tri);
Total des enregistrements (pour la navigation de pagination).
<?php
$mysqli = new mysqli("localhost", "username", "password", "database");
if ($mysqli->connect_error) {
die("Échec de la connexion: " . $mysqli->connect_error);
}
$page = isset($_GET['page']) ? (int)$_GET['page'] : 1;
$pageSize = 10;
$offset = ($page - 1) * $pageSize;
$sortColumn = isset($_GET['sort']) ? $_GET['sort'] : 'created_at';
$sortOrder = (isset($_GET['order']) && strtolower($_GET['order']) === 'asc') ? 'ASC' : 'DESC';
// AvisSQLinjection,Simplifiez le traitement ici
$sql = "
SELECT id, username, email, created_at
FROM users
ORDER BY $sortColumn $sortOrder
LIMIT $offset, $pageSize;
SELECT COUNT(*) as total FROM users;
";
if ($mysqli->multi_query($sql)) {
// Le premier ensemble de résultats:Données paginées
if ($result = $mysqli->store_result()) {
echo "<h3>Liste d'utilisateurs de la page actuelle</h3><ul>";
while ($row = $result->fetch_assoc()) {
echo "<li>{$row['username']} ({$row['email']})</li>";
}
echo "</ul>";
$result->free();
}
// Passez à l'ensemble de résultats suivant:Records totaux
if ($mysqli->next_result()) {
if ($countResult = $mysqli->store_result()) {
$countRow = $countResult->fetch_assoc();
$total = $countRow['total'];
$countResult->free();
$totalPages = ceil($total / $pageSize);
echo "<p>commun {$totalPages} Page,Records totaux:{$total}</p>";
}
}
} else {
echo "La requête a échoué: " . $mysqli->error;
}
$mysqli->close();
?>
Multi_Query () est utilisé pour exécuter plusieurs SQL;
Utilisez Store_Result () pour obtenir chaque ensemble de résultats;
Utilisez Next_Result () pour passer au jeu de résultats suivant;
Soutenez dynamiquement les champs de tri et les méthodes de tri.
Supposons que nous voulons obtenir à la fois un enregistrement "trié par création" et un enregistrement "trié par nom d'utilisateur", nous pouvons écrire ceci:
$sql = "
SELECT id, username, email FROM users ORDER BY created_at DESC LIMIT 0,10;
SELECT id, username, email FROM users ORDER BY username ASC LIMIT 0,10;
";
Ensuite, utilisez next_result () pour changer chaque élément de données.
Évitez l'injection SQL: les paramètres de pagination et de tri doivent être strictement filtrés;
Avant de l'utiliser, déterminez s'il y a plus d'ensembles de résultats;
Si votre couche de base de données est encapsulée (comme l'utilisation d'ORM), vous devrez peut-être exécuter manuellement le SQL sous-jacent pour utiliser next_result () .
Bien que Next_Result () soit généralement utilisé pour traiter les résultats de la requête multi-statement, l'utiliser dans les demandes composées de pagination et de tri peut considérablement améliorer l'efficacité de l'acquisition de données et réduire le nombre de connexions de base de données. Dans certains scénarios, il peut rendre votre système plus flexible et efficace.
Grâce aux exemples de cet article, avez-vous également pensé à certains scénarios commerciaux qui peuvent être optimisés? Bienvenue pour utiliser next_result () d'une manière plus intelligente!