Exécution de plusieurs requêtes SQL dans une seule instruction avec PHP

Comment joindre ces requêtes multiples en une seule (puis-je?)

$query = "DELETE FROM aktywne_kody WHERE kodsms ='$kodSMSgracza' AND typkodu ='$id'";
mysql_query($query) or die(mysql_error());

$query = "INSERT INTO uzyte_kody (gracz, kodsms, typkodu) VALUES ('$nickGracza', '$kodSMSgracza', '$id')";
mysql_query($query) or die("Błąd MySQL X04");

$query = "INSERT INTO do_odebrania (gracz, itemDATA, itemQTY) VALUES ('$nickGracza', '$itemDATA', '$itemQTY')";
mysql_query($query) or die("Błąd MySQL X05");

est-ce que c'est mieux si je fais mysql_close($db) après toutes les requêtes?

21
demandé sur John Smith 2012-12-21 01:32:01

4 réponses

passe 65536 à mysql_connect comme 5ème paramètre.

exemple:

$conn = mysql_connect('localhost','username','password', true, 65536 /* here! */) 
    or die("cannot connect");
mysql_select_db('database_name') or die("cannot use database");
mysql_query("
    INSERT INTO table1 (field1,field2) VALUES(1,2);

    INSERT INTO table2 (field3,field4,field5) VALUES(3,4,5);

    DELETE FROM table3 WHERE field6 = 6;

    UPDATE table4 SET field7 = 7 WHERE field8 = 8;

    INSERT INTO table5
       SELECT t6.field11, t6.field12, t7.field13
       FROM table6 t6
       INNER JOIN table7 t7 ON t7.field9 = t6.field10;

    -- etc
");

Lorsque vous travaillez avec des mysql_fetch_* ou mysql_num_rows, ou mysql_affected_rows, seule la première déclaration est valide.

par exemple, les codes suivants, la première instruction est INSERT, vous ne pouvez pas exécuter mysql_num_rows et mysql_fetch_*. Il est acceptable d'utiliser mysql_affected_rows de retourner le nombre de lignes insérées.

$conn = mysql_connect('localhost','username','password', true, 65536) or die("cannot connect");
mysql_select_db('database_name') or die("cannot use database");
mysql_query("
    INSERT INTO table1 (field1,field2) VALUES(1,2);
    SELECT * FROM table2;
");

un autre exemple, les codes suivants, la première instruction est SELECT, vous ne pouvez pas exécuter mysql_affected_rows. Mais vous pouvez exécuter mysql_fetch_assoc pour obtenir une paire clé-valeur de ligne résultant de la première déclaration SELECT, ou vous pouvez exécuter mysql_num_rows pour obtenir le nombre de lignes basées sur la première déclaration SELECT.

$conn = mysql_connect('localhost','username','password', true, 65536) or die("cannot connect");
mysql_select_db('database_name') or die("cannot use database");
mysql_query("
    SELECT * FROM table2;
    INSERT INTO table1 (field1,field2) VALUES(1,2);
");
26
répondu Husni 2015-12-05 03:12:11

ceci peut être créé sql point d'injection"SQL Injection Piggy-backed Queries". les attaquants peuvent ajouter plusieurs énoncés sql malveillants. ainsi, n'ajoutez pas les entrées de l'utilisateur directement aux requêtes.

considérations de sécurité

les fonctions API mysqli_query() et mysqli_real_query() ne mettent pas de drapeau de connexion nécessaire pour activer les requêtes multiples dans le serveur. Un appel D'API supplémentaire est utilisé pour déclarations multiples pour réduire la probabilité d'une attaque accidentelle par injection SQL. Un attaquant peut essayer d'ajouter des déclarations telles que ; DROP DATABASE mysql ou ; sleep(999). Si l'attaquant réussit à ajouter SQL à la chaîne de déclaration mais que mysqli_multi_query n'est pas utilisé, le serveur n'exécutera pas la seconde déclaration SQL, injectée et malveillante.

PHP Doc

4
répondu Alupotha 2016-01-06 05:18:53

vous pouvez juste ajouter le mot joindre ou ajouter un ; après chaque ligne(comme @pictchubbate dit). Mieux cette façon en raison de la lisibilité et aussi vous ne devriez pas se mêler supprimer avec INSERT; il est facile d'aller au sud.

La dernière question est un sujet de débat, mais autant que je sache, oui, vous devriez fermer après un ensemble de requêtes. Ceci s'applique principalement à mysql/php et pas à PDO, mysqli. Les choses se compliquent (et s'échauffent dans les débats) dans ces cas.

enfin, je suggère soit l'utilisation de PDO ou une autre méthode.

0
répondu MayTheSchwartzBeWithYou 2012-12-20 21:43:20

avec mysqli vous pouvez utiliser plusieurs énoncés pour de vrai en utilisant mysqli_multi_query() .

plus d'informations sur les déclarations multiples dans les docs PHP .

0
répondu Jonas Äppelgran 2014-04-08 08:59:54