Position actuelle: Accueil> Derniers articles> Next_result () Scénarios avancés combinant la pagination et le tri

Next_result () Scénarios avancés combinant la pagination et le tri

gitbox 2025-05-06

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.

Qu'est-ce que Next_Result () ?

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();

Pourquoi utiliser next_result () pour implémenter la pagination et le tri?

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.

Exemple: obtenez des données de pagination et des enregistrements totaux en une seule demande

Prenons une liste d'utilisateurs à titre d'exemple, supposons que nous voulons obtenir:

  1. Données pour la page actuelle (avec tri);

  2. 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&#39;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&#39;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();
?>

Points clés inclus dans l'exemple:

  • 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.

Scénarios plus complexes: obtenez plusieurs données paginées en différentes sortes

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.

Conseils

  • É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 () .

Résumer

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!