Lorsque vous utilisez l'extension MySQLI de PHP pour les opérations de base de données, la fonction Multi_Query nous permet d'exécuter plusieurs instructions SQL à la fois, ce qui est très pratique lors des données par lots. Cependant, après avoir exécuté plusieurs déclarations, comment obtenir correctement le nombre affecté de lignes ( affecté_rows ) est devenu une question courante.
Cet article combinera l'attribut mysqli :: $ affecté_rows pour expliquer comment l'utiliser correctement et les problèmes qui doivent être prêts attention dans le scénario Multi_Query .
MySQLI :: $ affecte_rows est un attribut de l'objet MySQLI , indiquant le nombre de lignes affectées par l'exécution la plus récente des instructions d'insertion , de mise à jour ou de suppression . Une seule instruction SQL est très intuitive à exécuter:
$mysqli = new mysqli('gitbox.net', 'user', 'password', 'database');
$mysqli->query("UPDATE users SET status=1 WHERE last_login > NOW() - INTERVAL 30 DAY");
echo "Nombre de lignes affectées: " . $mysqli->affected_rows;
Après avoir exécuté cette instruction de mise à jour, affecté_rows est le nombre de lignes affectées.
Multi_Query permet l'exécution de plusieurs instructions SQL en même temps:
$sql = "UPDATE users SET status=1 WHERE id=1;";
$sql .= "UPDATE users SET status=2 WHERE id=2;";
$mysqli->multi_query($sql);
Mais pour le moment, quelle sera la valeur de affecte_rows ? La réponse est: affecte_rows ne reflète que le nombre de lignes affectées correspondant à l'ensemble de résultats actuellement traité. Étant donné que Multi_Query doit parcourir les résultats de chaque instruction, il doit être récupéré un par un.
Exemple de code:
$mysqli = new mysqli('gitbox.net', 'user', 'password', 'database');
$sql = "UPDATE users SET status=1 WHERE id=1;";
$sql .= "UPDATE users SET status=2 WHERE id=2;";
$sql .= "DELETE FROM logs WHERE created_at < NOW() - INTERVAL 30 DAY;";
if ($mysqli->multi_query($sql)) {
do {
// Obtenez le nombre de lignes affectées pour le résultat actuel
echo "Nombre de lignes affectées: " . $mysqli->affected_rows . "\n";
// Préparez-vous à traiter le résultat suivant
} while ($mysqli->more_results() && $mysqli->next_result());
} else {
echo "L'exécution a échoué: " . $mysqli->error;
}
Ici, nous utilisons le DO ... while en boucle pour traiter les instructions une par une. Après chaque exécution, nous lisons le Current affecté_rows pour obtenir avec précision le nombre de lignes affectées par chaque instruction.
Multi_Query doit être utilisé pour coopérer avec next_result () pour traverser les résultats un par un <br> Si vous n'appelez pas Next_Result () , vous ne pouvez obtenir PECTAT_ROWS de la première instruction et les instructions suivantes seront ignorées.
Certaines déclarations peuvent ne pas affecter le nombre de lignes <br> Par exemple, l' instruction SELECT renvoie -1 . Seulement valable pour les instructions qui modifient les données.
Affecté_rows peut être -1 lorsqu'une erreur se produit
Si l'instruction SQL ne parvient pas à s'exécuter, affecté_rows retournera -1 . Pour le moment, vous devez obtenir le message d'erreur via $ mysqli-> Erreur .
Faites attention à la cohérence lors de la gestion des transactions <br> Si plusieurs instructions sont exécutées dans une transaction, le PECTACT_ROWS d'une seule instruction ne peut garantir l'état final global de la transaction et doit être contrôlé en fonction de la validation de transaction et du retour en arrière.
Lorsque Multi_Query exécute plusieurs SQL, une boucle doit être utilisée pour coopérer avec next_result () pour traverser tous les résultats.
Une fois chaque instruction exécutée, affecté_rows est le nombre de lignes affectées de l'instruction actuelle.
Faites attention à la détection de l'état d'erreur et de la valeur de retour des instructions spéciales à affecté_rows .
Lors de l'exploitation d'une transaction, le nombre de lignes affectées n'est qu'un jugement auxiliaire et l'état final est soumis au résultat de la validation de la transaction.
En maîtrisant les points ci-dessus, vous pouvez utiliser correctement et efficacement MySQLI :: $ affecte_rows et Multi_Query pour effectuer plusieurs traitements SQL et traitement des résultats.