PHP préparé les instructions et les transactions dans une boucle
Les opérations classiques dans une boucle de code:
$mysqli->query("START TRANSACTION");
foreach ($pdata as $key => $value) {
$sql = "INSERT INTO temp (`fund_id`) VALUES (" . $value . ")";
$result = $mysqli->query($sql);
}
$mysqli->query("COMMIT");
Puis nous changeons de déclarations préparées à l'avance:
$mysqli->autocommit(FALSE);
foreach ($pdata as $key => $value) {
$sql = "INSERT INTO temp (`fund_id`) VALUES (?)";
$stmt = $mysqli->prepare($sql);
$stmt->bind_param('i', $value);
$stmt->execute();
}
$mysqli->commit();
Questions:
1) ce Sont ces deux codes identiques? Ai-je raté quelque chose dans le deuxième code, avec les requêtes préparées?
2) Est $mysqli->commit()
le même que $mysqli->query("COMMIT")
?
3) ai-je besoin d'ajouter $mysqli->query("START TRANSACTION");
pour la préparation du bloc d'instructions ou de l'opération démarrera automatiquement lorsque nous avons mis en autocommit(FALSE)
?
- Vous n'avez pas besoin de
START TRANSACTION
après que vous avez activé la validation automatique off. Vous pouvez$mysqli->prepare()
avant votre boucle, puis execute() à l'intérieur de laforeach
boucle. Il n'y a pas besoin deprepare()
à chaque itération de boucle. - Vous n'avez pas besoin de
bind_param()
chaque fois, que ce soit. Il se lie d'une référence à la variable, de sorte que chaque fois que vous exécuter, il va utiliser la variable de la valeur actuelle.
Vous devez vous connecter pour publier un commentaire.
Votre boucle peut être optimisé en tirant sur la
prepare
etbind_param
états hors de la boucle.Vous avez désactivé autocommit avec votre
autocommit(FALSE)
ligne et n'ont donc pas besoin d'utiliser leSTART TRANSACTION
déclaration.rollback
déclaration en cas de panne? php.net/manual/en/mysqli.rollback.php