Position actuelle: Accueil> Derniers articles> Pourquoi Pdostatement :: RowCount n'est pas pris en charge dans certains pilotes de base de données

Pourquoi Pdostatement :: RowCount n'est pas pris en charge dans certains pilotes de base de données

gitbox 2025-05-28

Lorsque vous utilisez une extension PDO (PHP Data Objectts) de PHP pour faire fonctionner des bases de données, les développeurs s'appuient souvent sur la méthode PDOSTATION :: RowCount () pour obtenir le nombre de lignes affectées. Cependant, de nombreuses personnes trouveront dans le développement réel que cette méthode ne semble pas renvoyer le résultat correct dans certains pilotes de base de données, et même renvoie 0 directement lors de l'exécution des requêtes de sélection. Pourquoi est-ce? Cet article analysera ce problème en profondeur.

1. La fonction et l'utilisation de RowCount

Pdostatement :: RowCount () est une méthode fournie par PDO pour renvoyer le nombre de lignes affectées par la dernière instruction SQL exécutée. Il est le plus souvent utilisé dans deux types d'opérations SQL:

  • Mettre à jour , supprimer , insérer , etc. modifieront les opérations de données

  • Sélectionnez la requête (certains pilotes prennent en charge)

Exemples d'utilisation de base:

 $pdo = new PDO('mysql:host=localhost;dbname=test', 'user', 'password');
$stmt = $pdo->prepare("DELETE FROM users WHERE status = :status");
$stmt->execute([':status' => 'inactive']);
echo $stmt->rowCount(); // Sortie le nombre de lignes affectées

2. Pourquoi RowCount renvoie-t-il 0 lors de la sélection de requête?

Selon la documentation officielle, RowCount () ne prend pas en charge le renvoi du nombre de lignes affectées pour sélectionner les requêtes dans certains pilotes de base de données. L'exemple le plus typique est MySQL. Lorsque vous utilisez le pilote PDO de MySQL, après l'exécution d'une requête sélectionnée, l'appel RowCount () renvoie généralement 0 au lieu du nombre attendu de résultats.

La raison en est la suivante : pour sélectionner les requêtes, la bibliothèque client de MySQL n'informe pas le nombre de lignes affectées, sauf si elle est utilisée avec le pilote MySQLND (activé par défaut dans PHP 5.3+). Même ainsi, vous ne pouvez pas compter entièrement sur RowCount () .

Si vous avez vraiment besoin d'obtenir le nombre de résultats de requête sélectionnés, un moyen plus sûr consiste à utiliser fetchall () puis à compter () pour compter:

 $stmt = $pdo->query("SELECT * FROM users WHERE status = 'active'");
$results = $stmt->fetchAll();
echo count($results);

Bien que cela consomme plus de mémoire, il garantit une précision.

3. Différents comportements du pilote de base de données

Voici les situations de support de RowCount () dans plusieurs bases de données courantes:

base de données Select est-il pris en charge? Utilisez RowCount ()
Mysql ? Généralement non pris en charge (sauf si mysqlnd)
Postgresql ? soutien
Sqlite ? Sélectionner la requête n'est généralement pas prise en charge
MSSQL / SQLSRV ? soutien
Oracle ? soutien

Par conséquent, lorsque vous utilisez RowCount () , vous devez porter un jugement basé sur la base de données cible.

4. Pratiques et précautions recommandées

  1. Évitez de compter sur RowCount () pour déterminer si la requête sélectionnée a des résultats. Il est préférable d'utiliser fetch () ou fetchall () pour déterminer s'il existe un résultat en fonction de la question de savoir si les données sont renvoyées.

  2. Dans Delete / Update / Insert, RowCount () est généralement fiable. Tant que la requête est réussie, elle peut généralement renvoyer le nombre de lignes affectées.

  3. Assurez-vous d'utiliser RowCount () pour obtenir la quantité de sélection lorsque MySQLND (MySQL Native Driver) est activé.

Vous pouvez utiliser phpinfo () ou exécuter le code suivant pour voir si vous utilisez mysqlnd:

 echo phpinfo();

ou:

 echo (extension_loaded('mysqlnd')) ? 'mysqlnd loaded' : 'mysqlnd not loaded';

5. Résumé

Pdostatement :: RowCount () , bien qu'une méthode pratique, son comportement dépend du degré de prise en charge du pilote de base de données sous-jacent. Afin d'assurer la compatibilité des données transversales du code, il est recommandé d'éviter RowCount () lors de l'utilisation de requêtes de sélection et d'utiliser à la place un moyen plus stable et fiable de juger le nombre de lignes de données.

Pour plus de tutoriels liés à la base de données, veuillez visiter: https://gitbox.net/dev/database-tutorials