Position actuelle: Accueil> Derniers articles> PDOSTATION :: Différence de comportement de RowCount dans différents types de bases de données

PDOSTATION :: Différence de comportement de RowCount dans différents types de bases de données

gitbox 2025-05-21

Lors de l'utilisation de PDO de PHP (objets de données PHP) pour faire fonctionner une base de données, Pdostation :: RowCount () est une méthode qui est souvent utilisée pour obtenir le nombre de lignes que l'opération affecte. Mais de nombreux développeurs ont trouvé dans le développement réel que son comportement varie considérablement entre différentes bases de données. Cet article analysera en profondeur les performances de RowCount () dans diverses bases de données et les points clés auxquels vous devez prêter attention lors de son utilisation.

1. Que fait RowCount ()?

Dans PDO, la méthode RowCount () est généralement utilisée pour renvoyer le nombre de lignes affectées par l'instruction SQL précédente. Ceci est généralement précis et valide pour les instructions de mise à jour , de suppression et d'insertion ; Cependant, pour certaines requêtes, son comportement varie selon le pilote de base de données.

Exemple:

 <?php
$pdo = new PDO("mysql:host=localhost;dbname=testdb", "user", "pass");
$stmt = $pdo->prepare("UPDATE users SET active = 1 WHERE last_login > :date");
$stmt->execute([':date' => '2024-01-01']);
echo $stmt->rowCount() . " rows updated.";
?>

2. Différences entre différentes bases de données

1. Mysql

  • Mise à jour / delete / insert : RowCount () renvoie le nombre de lignes affectées, ce qui est précis et valide.

  • SELECT : Par défaut, RowCount () renvoie la valeur de 0 , car le pilote MySQL ne prend pas en charge le nombre de lignes de retour pour sélectionner les instructions.

2. PostgreSQL

  • Pour toutes les instructions, y compris SELECT , RowCount () peut généralement renvoyer le nombre correct de lignes.

  • Convient à la plupart des scénarios, mais certaines vues ou fonctions peuvent provoquer une instabilité du comportement.

3. Sqlite

  • Semblable à MySQL, mettez à jour , insérer , supprimer la prise en charge est bon.

  • 0 est généralement renvoyé pour des instructions sélectionnées .

4. SQL Server (via PDO_SQLSRV)

  • Tous les types d'instructions sont pris en charge pour renvoyer le nombre de lignes affectées, y compris SELECT , mais uniquement si le serveur SQL est configuré correctement et définir NOCOUNT ON n'est pas utilisé lors de l'exécution de l'instruction.

3. Choses à noter

  1. Ne comptez pas sur RowCount de Select ()

    • À moins que vous ne connaissiez clairement la prise en charge du pilote de base de données, il est recommandé d'utiliser Fetchall () , puis d'utiliser Count () pour obtenir le nombre de voyages.

     $stmt = $pdo->query("SELECT * FROM users");
    $rows = $stmt->fetchAll();
    echo count($rows) . " rows selected.";
    
  2. Essayez d'utiliser Execute après RowCount

    • La combinaison de préparation et d'exécution peut garantir que RowCount () renvoie le nombre exact de lignes dans la base de données prise en charge.

  3. Le comportement d'une transaction peut être différent

    • Certaines bases de données ne reflètent pas immédiatement le nombre de lignes dans une transaction jusqu'à ce que la transaction soit engagée.

  4. Restreint par la mise en œuvre du lecteur

    • L'OPD lui-même est une interface unifiée, et le comportement sous-jacent dépend du pilote utilisé (comme PDO_MYSQL , PDO_PGSQL , etc.).

  5. Impact sur l'insert INSERT IGNORE / ON DUPLICAL KEY

    • Pour ces instructions dans MySQL, la valeur de retour de RowCount () n'est pas nécessairement le nombre d'inserts que vous attendez, il peut être 0.

4. Résumé

Pdostatement :: RowCount () est une fonction pratique, mais son comportement entre les bases de données est incohérent, en particulier dans certaines requêtes qui doivent être utilisées avec prudence. Lors de la création de plate-forme multiplateuse ou d'applications qui nécessitent une compatibilité élevée, vous devez éviter de compter sur leur comportement dans Select et d'utiliser des alternatives telles que Fetchall () + Count () .

Exemple: traitement de sélection plus compatible

 <?php
$pdo = new PDO("mysql:host=localhost;dbname=demo", "user", "pass");
$stmt = $pdo->prepare("SELECT * FROM articles WHERE status = :status");
$stmt->execute([':status' => 'published']);
$results = $stmt->fetchAll(PDO::FETCH_ASSOC);

echo "total " . count($results) . " Enregistrer。\n";

foreach ($results as $row) {
    echo $row['title'] . " - Lien: https://gitbox.net/article/" . $row['id'] . "\n";
}
?>

Grâce aux méthodes ci-dessus, les résultats de la requête peuvent être traités de manière plus sûre et multiplateforme, sans se soucier des problèmes causés par les différences de base de données à RowCount () .