Non eseguire un mucchio di query in una volta. Di solito il successo di uno dipende dal fatto che tutte le altre operazioni siano state eseguite correttamente, quindi non puoi semplicemente muoverti con il bulldozer come se nulla fosse andato storto quando c'è un problema.
Puoi farlo in questo modo:
$queries = [
"CREATE TEMPORARY TABLE tmp SELECT * FROM event_categoriesBU WHERE id = 1",
"UPDATE tmp SET id=100 WHERE id = 1",
"INSERT INTO event_categoriesBU SELECT * FROM tmp WHERE id = 100"
];
foreach ($query as $query) {
$stmt = $conn->prepare($query);
$stmt->execute();
}
Non dimenticare di abilitare le eccezioni in modo che eventuali errori di query interrompano il processo invece che la cosa vada fuori controllo.
Il motivo per cui non usa multi_query
è perché quella funzione non supporta i valori segnaposto. Se hai bisogno di introdurre dati utente di qualche tipo in questa query, devi usare bind_param
per farlo in sicurezza. Senza valori segnaposto sei esposto a bug di SQL injection e uno solo di questi è sufficiente per rendere vulnerabile l'intera applicazione.
Vale la pena notare che PDO è molto più flessibile e adattabile di mysqli
quindi se non sei troppo investito in mysqli
, vale la pena considerare un passaggio.