Les mises à jour par lots sont une exigence commune lors de l'utilisation de PHP pour les opérations de base de données. L'exécution directe de plusieurs instructions de mise à jour distinctes est non seulement inefficace, mais augmente également la charge dans la base de données. L'utilisation de la méthode MySQLI_STMT :: Préparer , les instructions de prétraitement et la liaison des paramètres peuvent améliorer considérablement les performances et la sécurité des mises à jour par lots.
Cet article présentera en détail comment utiliser MySQLI_STMT :: Préparez-vous à implémenter les opérations de mise à jour par lots et à donner des suggestions d'optimisation d'efficacité spécifiques.
Les déclarations de prétraitement sont hautement sécurisées <br> Les instructions de prétraitement peuvent éviter le risque d'injection SQL et séparer l'entrée de l'utilisateur des instructions SQL par des paramètres de liaison.
Amélioration de l'efficacité d'exécution <br> La même déclaration de prétraitement ne doit être compilée qu'une seule fois, exécutée plusieurs fois, et seuls les paramètres sont remplacés, réduisant le temps d'analyse de la base de données
Code concis et facile à maintenir <br> Structure claire, adaptée à l'emballage logique de fonctionnement par lots et à multiplexage
Supposons que nous ayons une table utilisateur qui doit mettre à jour son statut en lots en fonction de l'ID utilisateur. La pratique traditionnelle est:
UPDATE users SET status = 'active' WHERE id = 1;
UPDATE users SET status = 'inactive' WHERE id = 2;
...
Cependant, les frais généraux de l'exécution de plusieurs instructions SQL sont élevés et la solution d'amélioration est:
Modèles de mise à jour précompilés.
Location à leur tour différents paramètres à exécuter.
Ce qui suit est un code de démonstration pour implémenter les mises à jour par lots à l'aide de mysqli_stmt :: Préparer :
<?php
$mysqli = new mysqli("gitbox.net", "username", "password", "database");
// Vérifiez la connexion
if ($mysqli->connect_error) {
die("Échec de la connexion: " . $mysqli->connect_error);
}
// Prétraitement SQL,Établir des espaces réservés
$sql = "UPDATE users SET status = ? WHERE id = ?";
$stmt = $mysqli->prepare($sql);
if (!$stmt) {
die("Prétraitement失败: " . $mysqli->error);
}
// Simuler les données de mise à jour par lots
$updateData = [
['status' => 'active', 'id' => 1],
['status' => 'inactive', 'id' => 2],
['status' => 'pending', 'id' => 3],
];
// Lier les paramètres
foreach ($updateData as $data) {
// 'si' Indique que le premier paramètre est une chaîne,Le deuxième paramètre est un entier
$stmt->bind_param('si', $data['status'], $data['id']);
$stmt->execute();
if ($stmt->error) {
echo "L'exécution a échoué: " . $stmt->error . "\n";
}
}
$stmt->close();
$mysqli->close();
?>
Traitement des transactions <br> Mettez plusieurs instructions de mise à jour dans la transaction pour réduire le nombre de commits de transaction
$mysqli->begin_transaction();
foreach ($updateData as $data) {
$stmt->bind_param('si', $data['status'], $data['id']);
$stmt->execute();
}
$mysqli->commit();
MISE À JOUR LA LA MERGE <br> Si les champs de mise à jour sont les mêmes et que le volume de données est important, vous pouvez utiliser le cas lorsque l'instruction pour mettre à jour plusieurs enregistrements à la fois.
$ids = array_column($updateData, 'id');
$ids_list = implode(',', $ids);
$sql = "UPDATE users SET status = CASE id ";
foreach ($updateData as $data) {
$status = $mysqli->real_escape_string($data['status']);
$sql .= "WHEN {$data['id']} THEN '{$status}' ";
}
$sql .= "END WHERE id IN ($ids_list)";
$mysqli->query($sql);
Cette méthode convient aux grandes mises à jour par lots à la fois, mais perd la flexibilité et la sécurité des instructions de prétraitement.
Préparez-vous à des connexions et des ressources adéquates <br> Assurez-vous que la connexion de la base de données est correctement configurée pour éviter les goulots d'étranglement des performances en raison des goulots d'étranglement des ressources
L'utilisation de mysqli_stmt :: se préparer à réaliser des mises à jour par lots peut non seulement assurer la sécurité des opérations, mais également améliorer l'efficacité de l'exécution. En combinant la gestion des transactions et des méthodes de construction SQL raisonnables, les performances peuvent être encore optimisées et conviennent à la plupart des scénarios d'application PHP + MySQL.
Avec l'exemple de code et les techniques ci-dessus, vous pouvez réaliser efficacement les opérations de mise à jour par lots efficaces et sécurisées.