Maison > Questions et réponses > le corps du texte
P粉3846792662023-08-09 13:15:28
Vous avez deux problèmes :
Vous n'utilisez pas la syntaxe de liaison correcte.
Vous avez essayé d'insérer plusieurs lignes dans une seule instruction préparée
if (isset($_POST['checkbox_selected'])) { $sql = "INSERT INTO map (user_id, feed_id, attribute_id, csvcolumn) VALUES (?, ?, ?, ?);"; // prepare only has to happen once $stmt = mysqli_prepare($conn,$sql); mysqli_begin_transaction($conn); try { foreach ($_POST['checkbox_selected'] as $key => $value) { $findrow = array_search_partial($attributeid, $value); $attribute = $value; $csv = $csvcolumn[$findrow]; $stmt->bindParam('iiii', $userid, $feed_id, $attribute, $csv); $stmt->execute(); } mysqli_commit($conn); } catch(mysqli_sql_exception $e) { mysqli_rollback($conn); // immediately roll back changes throw $e; // re-throw exception } }
Le seul léger avantage est que lorsque vous essayez d'envelopper plusieurs VALUES() dans une seule requête, elle sera enveloppée par une transaction implicite. Mais d’autres aspects de cette approche sont désavantageux. En ouvrant explicitement la transaction qui encapsule la boucle de liaison/exécution, vous obtenez les mêmes avantages [annulation d'erreur, traitement par lots d'E/S], tout en profitant également des avantages des instructions préparées [analyse de requête simple, paramétrage, etc.]