Dans la couche d'abstraction de la base de données de PHP, PDO (PHP Data Objectts), Pdostation :: RowCount () est une méthode courante qui renvoie le nombre de lignes affectées par la dernière exécution SQL. Cependant, de nombreux développeurs constateront que le comportement de la méthode est incohérent lors de l'utilisation dans différents pilotes de base de données, et ne parvient même pas à obtenir les résultats attendus dans certains scénarios.
Selon les instructions de la documentation officielle PHP :
Pour la plupart des bases de données, RowCount () est uniquement applicable pour supprimer , insérer ou mettre à jour les instructions. Pour certaines instructions, certains pilotes de base de données peuvent renvoyer le nombre de lignes affectées, mais cela ne fait pas partie du comportement unifié de l'APD.
Autrement dit, le comportement de RowCount () dépend de l'implémentation du pilote de base de données sous-jacente.
Type de base de données | Prise en charge de RowCount pour sélectionner des instructions | Prise en charge de RowCount pour la mise à jour / supprimer / insérer |
---|---|---|
Mysql | ? Peu fiable (retourne généralement 0) | ? Renvoie le nombre de lignes affectées |
Postgresql | ? soutien | ? soutien |
Sqlite | ? soutien | ? soutien |
MSSQL | ? (Implémentation du pilote de dépendance) | ? |
Par exemple, dans MySQL:
$pdo = new PDO('mysql:host=localhost;dbname=test', 'user', 'pass');
$stmt = $pdo->query("SELECT * FROM users");
echo $stmt->rowCount(); // Retour habituellement 0
Mais dans PostgreSQL ou SQLite, le nombre réel de lignes peut être renvoyé.
La raison principale est que le pilote de base de données exécute SQL de différentes manières, en particulier pour SELECT . Certains pilotes ne chargent pas tous les résultats à l'avance, mais récupèrent plutôt les données lors de la traversée. Dans ce cas, il ne peut pas savoir combien de lignes il y a à l'avance.
Le pilote MySQL officiel ( MySQLND ) indique clairement que pour Select , RowCount () ne devrait pas être dépendant.
$stmt = $pdo->query("SELECT * FROM users");
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
$count = count($rows);
echo "commun {$count} Données de ligne";
ou:
$count = 0;
$stmt = $pdo->query("SELECT * FROM users");
while ($row = $stmt->fetch()) {
$count++;
}
echo "commun {$count} Données de ligne";
Remarque: Si le volume de données est grand, Fetchall () occupera beaucoup de mémoire et il est recommandé d'utiliser le comptage de boucle.
$stmt = $pdo->prepare("UPDATE users SET status = 'active' WHERE last_login > NOW() - INTERVAL 7 DAY");
$stmt->execute();
echo "Mis à jour " . $stmt->rowCount() . " D'ACCORD";
RowCount () pour ces opérations est généralement fiable.
Vous pouvez encapsuler votre propre fonction RowCount, juger le type SQL et sélectionner la méthode statistique appropriée:
function safeRowCount(PDOStatement $stmt, $sqlType = 'SELECT') {
if (strtoupper($sqlType) === 'SELECT') {
return count($stmt->fetchAll());
} else {
return $stmt->rowCount();
}
}
Cela vous permet de garder votre comportement cohérent dans différents pilotes de base de données.
Le comportement incohérent de Pdostation :: RowCount () est l'un des pièges communs dans le développement de la base de données PHP. Comprendre son mécanisme sous-jacent et sélectionner la méthode de traitement appropriée basée sur les types SQL est la clé pour écrire du code hautement compatible.
Pour plus d'exemples de code ou d'expérience de partage, veuillez visiter notre communauté technologique: https://gitbox.net/forum .