J'ai un problème avec une requête préparée avec un double update.
Sur un fichier php seul (de test donc) mes requetes s'exécutent toutes. Si je les intègre au programme, ça ne fonctionne plus.
La différence évidente est que dans le fichier test, les variables sont déclarées en dur ($nom="truc";..) alors que dans le programme elles sont récupérées ($nom = $_POST['le_nom'];....) . Un echo renvoie bien $nom, donc ça passe bien.
$marequete="UPDATE `table` SET `valeur`=".$x." WHERE `table`.`Nom`='variable1'; UPDATE `table` SET `valeur`=".$y." WHERE `table`.`Nom`='variable2';";
Au mieux, j'ai une erreur de syntaxe, au pire, aucun résultat.
une requête préparée mais il n'y a pas de marqueur (et une vraie requête préparée c'est une requête pas 2, le multi-statement ne serait pas accepté)
une erreur de syntaxe mais tu ne la donnes pas pour autant
Il manque les quotes pour le SQL ? Encore que si la requête était correctement préparée au lieu d'injecter tes données par concaténation, ce problème ne se poserait pas et ça ne te vaudrait pas non plus des injections SQL ...
Je demande à voir si c'est vraiment en même temps (plutôt traité à la suite directe et dans la même transaction en auto-commit).
De toute façon, ta requête préparée ne sert à rien là et ne fonctionnera pas (une vraie requête préparée ne peut pas être constituée de plusieurs instructions/requêtes - pas de ;). Si tu avais X update à faire, tu prépares ton update, débutes une transaction et l'exécute X fois.
26.8.11.21 mysql_stmt_prepare()
The string must consist of a single SQL statement. You should not add a terminating semicolon (;) or \g to the statement.
Tu peux toujours tout mettre dans une requête multi-statement et l'exécuter par mysqli_multi_query mais c'est plus complexe à implémenter (si c'est pour se retrouver avec des injections SQL, ce n'est pas la peine) et la requête en devient inutilement longue/répétitive (possible d'atteindre le max_allowed_packet ?).
Avec un autre SGBD, on aurait certainement pu faire ça en une seule requête en injectant les valeurs en sous-requête. Type pour PostgreSQL :
UPDATE table
SET val = t.val
WHERE nom = t.nom
FROM (
VALUES('val1', 'nom1'), ('val2', 'nom2')
) t(val, nom);
La il va me falloir 2 semaines de repos au moins :-)
Bon, ca marche, c'est nickel.
Merci, merci !!!!!
Requête préparée
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
julp.fr ~ PHP < 8.0.0 : activer les erreurs PDO/SQL ~ PHP < 8.1.0 : activer les erreurs mysqli
julp.fr ~ PHP < 8.0.0 : activer les erreurs PDO/SQL ~ PHP < 8.1.0 : activer les erreurs mysqli
julp.fr ~ PHP < 8.0.0 : activer les erreurs PDO/SQL ~ PHP < 8.1.0 : activer les erreurs mysqli
julp.fr ~ PHP < 8.0.0 : activer les erreurs PDO/SQL ~ PHP < 8.1.0 : activer les erreurs mysqli