Position actuelle: Accueil> Derniers articles> Comment obtenir le résultat d'une requête fusionnée à l'aide de Pdostatement :: RowCount

Comment obtenir le résultat d'une requête fusionnée à l'aide de Pdostatement :: RowCount

gitbox 2025-05-28

Dans le développement de PHP, l'utilisation de l'APD pour les opérations de base de données est l'une des façons recommandées. Pdostatement :: RowCount () est une méthode fournie par PDO pour renvoyer le nombre de lignes affectées par l'instruction SQL précédente. Cependant, son comportement varie légèrement entre les différents types de relevés SQL, en particulier lors de l'exécution des requêtes de sélection , de mise à jour , de supprimer et d'union , il est nécessaire de comprendre le mécanisme derrière.

Cet article présentera l'utilisation de base de Pdostation :: RowCount () et explorera en profondeur comment il fonctionne lors du traitement des résultats de la requête de la fusion de l'Union , ainsi que la méthode de comptage correct du nombre de lignes de résultat de fusion.

1. Utilisation de base de Pdostation :: RowCount ()

Lors de l'exécution de supprimer , d'insérer ou de mettre à jour , RowCount () peut renvoyer le nombre de lignes affectées. Les exemples sont les suivants:

 <?php
$pdo = new PDO('mysql:host=localhost;dbname=testdb', 'user', 'pass');
$stmt = $pdo->prepare("UPDATE users SET status = 'active' WHERE last_login > NOW() - INTERVAL 30 DAY");
$stmt->execute();

echo "Mis à jour " . $stmt->rowCount() . " Records de ligne。";
?>

Dans le code ci-dessus, RowCount () renvoie le nombre de lignes qui ont été mises à jour.

Mais lors de l'exécution d'une requête sélectionnée , RowCount () ne fonctionne pas toujours comme prévu. Pour la plupart des bases de données (en particulier MySQL), sous le paramètre par défaut PDO :: MySQL_ATTR_USE_BUFFERED_QUERY , RowCount () ne renvoie pas le nombre de lignes de résultat dans la requête de sélection , mais renvoie 0.

2. Obtenez correctement le nombre de lignes de résultat dans la requête sélectionnée

Si vous utilisez une requête sélectionnée et que vous souhaitez obtenir le nombre de lignes du résultat, la méthode recommandée est d'obtenir tous les résultats et de le calculer via Count () , par exemple:

 <?php
$stmt = $pdo->query("SELECT * FROM articles WHERE category = 'php'");
$results = $stmt->fetchAll();

echo "Il y a un total " . count($results) . " Enregistrer。";
?>

3. Le nombre de lignes lors de l'utilisation de la requête syndicale

Union est la syntaxe en SQL pour fusionner deux résultats de requête ou plus. Par défaut, il supprime les lignes en double ( Union All est utilisé si vous souhaitez conserver des lignes en double). Alors, comment obtenir le nombre de lignes de résultats de la requête syndicale via l'OPD?

Démonstration d'erreur:

 <?php
$stmt = $pdo->query("SELECT name FROM authors UNION SELECT name FROM editors");
echo $stmt->rowCount(); // Dans la plupart MySQL Dans le cas où il reviendra 0
?>

Cela est dû au fait que RowCount () ne prend pas en charge le nombre de lignes de résultat pour sélectionner les requêtes dans MySQL.

Façon correcte: Fetchall + Count

 <?php
$stmt = $pdo->query("
    SELECT name FROM authors
    UNION
    SELECT name FROM editors
");

$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
echo "合并查询后Il y a un total " . count($rows) . " Enregistrer。";
?>

Cette méthode obtient tous les résultats via fetchall () , puis compte le nombre de lignes avec Count () . Il peut non seulement obtenir correctement le nombre de résultats fusionnés de la requête syndicale , mais également adapter à d'autres requêtes de sélection complexes.

4. Obtenez le nombre de lignes lorsque vous utilisez Union All

Lorsque vous utilisez Union All (pas de déduplication), vous pouvez également utiliser la même méthode pour obtenir tous les enregistrements:

 <?php
$stmt = $pdo->query("
    SELECT name FROM authors
    UNION ALL
    SELECT name FROM editors
");

$rows = $stmt->fetchAll();
echo "UNION ALL Le nombre de lignes dans le résultat de la requête est:" . count($rows);
?>

5. Conseils: comment gérer la pagination des requêtes syndicales

Si les résultats de votre requête syndicale sont nombreux et doivent être paginés, vous pouvez utiliser toute la requête syndicale comme sous-requête pour gérer la pagination:

 <?php
$page = 1;
$limit = 10;
$offset = ($page - 1) * $limit;

$sql = "
    SELECT * FROM (
        SELECT name FROM authors
        UNION
        SELECT name FROM editors
    ) AS combined
    LIMIT :limit OFFSET :offset
";

$stmt = $pdo->prepare($sql);
$stmt->bindValue(':limit', $limit, PDO::PARAM_INT);
$stmt->bindValue(':offset', $offset, PDO::PARAM_INT);
$stmt->execute();

$results = $stmt->fetchAll();
foreach ($results as $row) {
    echo $row['name'] . "<br>";
}
?>

Résumer

  • Pdostatement :: RowCount () ne renvoie généralement pas les résultats valides pour certaines instructions (en particulier dans MySQL).

  • L'utilisation de fetchall () + count () est un moyen plus général et fiable d'obtenir le nombre de lignes de requête.

  • Pour Union ou Union toutes les requêtes, il est également recommandé d'utiliser Fetchall () pour compter la longueur du tableau pour obtenir le nombre total de lignes.

  • Si vous devez paginer la requête de fusion, vous pouvez traiter le résultat syndical en tant que sous-requête.

J'espère que cet article peut vous aider à comprendre le scénario d'utilisation de RowCount () plus clairement et à éviter de placer des pièges lors du comptage du nombre de lignes dans les résultats de la requête syndicale . Ces conseils sont particulièrement importants si vous construisez une API ou une plate-forme d'analyse de données (comme dans un projet sur gitbox.net ).

Avez-vous besoin de moi pour écrire la fonction de wrapper de pagination pour vous aussi?