Plusieurs actions dans une seule requete

gabyte Messages postés 10 Date d'inscription mercredi 3 novembre 2010 Statut Membre Dernière intervention 8 décembre 2010 - 21 nov. 2010 à 11:41
neigedhiver Messages postés 2480 Date d'inscription jeudi 30 novembre 2006 Statut Membre Dernière intervention 14 janvier 2011 - 22 nov. 2010 à 09:37
Bonjour,

Je veux faire plusieurs actions en une seule requête. Si je passe par MySql (pour tester), cela fonctionne :

---dans MyQsl----------

TRUNCATE TABLE `VIRTUEL`;
INSERT INTO VIRTUEL(`id_virtuel`,`motclef`) SELECT `s_id`,`s_mc1` FROM `SOURCE` WHERE `s_mc1`!='';
INSERT INTO VIRTUEL(`id_virtuel`,`motclef`) SELECT `s_id`,`s_mc2` FROM `SOURCE` WHERE `s_mc2`!='';
INSERT INTO VIRTUEL(`id_virtuel`,`motclef`) SELECT `s_id`,`s_mc3` FROM `SOURCE` WHERE `s_mc3`!='';
INSERT INTO VIRTUEL(`id_virtuel`,`motclef`) SELECT `s_id`,`s_mc4` FROM `SOURCE` WHERE `s_mc4`!='';
INSERT INTO VIRTUEL(`id_virtuel`,`motclef`) SELECT `s_id`,`s_mc5` FROM `SOURCE` WHERE `s_mc5`!=''
----------------------------

Mais lorsque je fais une requête dans php -

----- dans php ----------

mysql_select_db($base, $fichier);
$query_Rch =
"TRUNCATE TABLE VIRTUEL;INSERT INTO VIRTUEL(id_virtuel,motclef) SELECT s_id, s_mc1 FROM SOURCE WHERE s_mc1!='';INSERT INTO VIRTUEL(`id_virtuel`,`motclef`) SELECT `s_id`,`s_mc2` FROM `SOURCE` WHERE `s_mc2`!='';INSERT INTO VIRTUEL(`id_virtuel`,`motclef`) SELECT `s_id`,`s_mc3` FROM `SOURCE` WHERE `s_mc3`!='';INSERT INTO VIRTUEL(`id_virtuel`,`motclef`) SELECT `s_id`,`s_mc4` FROM `SOURCE` WHERE `s_mc4`!='';INSERT INTO VIRTUEL(`id_virtuel`,`motclef`) SELECT `s_id`,`s_mc5` FROM `SOURCE` WHERE `s_mc5`!=''";

$Rch = mysql_query($query_Rch, $MUL) or die(mysql_error());
$row_Rch = mysql_fetch_assoc($Rch);
$totalRows_Rch = mysql_num_rows($Rch);

------------

et bien ça ne fonctionne plus :

you have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'INSERT INTO VIRTUEL(id_virtuel,motclef) SELECT s_id, s_mc1 FROM SOURCE WHERE s_m' at line 1

Auriez-vous une idée?

Gabyte - Angers
------------------

8 réponses

cod57 Messages postés 1653 Date d'inscription dimanche 7 septembre 2008 Statut Membre Dernière intervention 11 septembre 2013 19
21 nov. 2010 à 12:02
BONJOUR
essaye voir ça

----- dans php ----------

mysql_select_db($base, $fichier);
$query_Rch =
"
TRUNCATE TABLE `VIRTUEL`;
INSERT INTO VIRTUEL(`id_virtuel`,`motclef`) SELECT `s_id`,`s_mc1` FROM `SOURCE` WHERE `s_mc1`!='';
INSERT INTO VIRTUEL(`id_virtuel`,`motclef`) SELECT `s_id`,`s_mc2` FROM `SOURCE` WHERE `s_mc2`!='';
INSERT INTO VIRTUEL(`id_virtuel`,`motclef`) SELECT `s_id`,`s_mc3` FROM `SOURCE` WHERE `s_mc3`!='';
INSERT INTO VIRTUEL(`id_virtuel`,`motclef`) SELECT `s_id`,`s_mc4` FROM `SOURCE` WHERE `s_mc4`!='';
INSERT INTO VIRTUEL(`id_virtuel`,`motclef`) SELECT `s_id`,`s_mc5` FROM `SOURCE` WHERE `s_mc5`!=''
";

$Rch = mysql_query($query_Rch, $MUL) or die(mysql_error());
$row_Rch = mysql_fetch_assoc($Rch);
$totalRows_Rch = mysql_num_rows($Rch);

a++
0
kohntark Messages postés 3705 Date d'inscription lundi 5 juillet 2004 Statut Membre Dernière intervention 27 avril 2012 30
21 nov. 2010 à 12:32
Salut,

Premières lignes de la documentation de mysql_query :
mysql_query() envoie une seule requête (les requêtes multiples ne sont pas supportées) à la base de données courante


Cordialement,


Kohntark -
0
gabyte Messages postés 10 Date d'inscription mercredi 3 novembre 2010 Statut Membre Dernière intervention 8 décembre 2010
21 nov. 2010 à 12:55
Je me doutais un peu qu'une seule requête ne soit la règle

Avez-vous une idée du contournement de cette limite?

j'ai trouvé cela tout à l'heure sur le forum :
------- début -------
$sql = "INSERT INTO membres (pseudo,pass,email,nom,prenom,ville,dtnaissance,avatar,siteweb,aim,mmsn)
VALUES('$pseudo','$pass','$email','$nom','$prenom','$ville','$dtnaissance','$avatar','$siteweb','$aim','$mmsn')";

mysql_query($sql);

$sql = "INSERT INTO chat (pseudo) VALUES('$pseudo')";

mysql_query($sql);
-------- fin ----------
croyez-vous que je puisse faire cela du type :

----début exemple ------

$sql = "TRUNCATE TABLE `VIRTUEL`";

mysql_query($sql);

$sql = "INSERT INTO VIRTUEL(`id_virtuel`,`motclef`) SELECT `s_id`,`s_mc1` FROM `SOURCE` WHERE `s_mc1`!=''";

mysql_query($sql);

$sql = "INSERT INTO VIRTUEL(`id_virtuel`,`motclef`) SELECT `s_id`,`s_mc2` FROM `SOURCE` WHERE `s_mc2`!=''";

mysql_query($sql);

$sql = "INSERT INTO VIRTUEL(`id_virtuel`,`motclef`) SELECT `s_id`,`s_mc3` FROM `SOURCE` WHERE `s_mc3`!=''";

mysql_query($sql);

$sql = "INSERT INTO VIRTUEL(`id_virtuel`,`motclef`) SELECT `s_id`,`s_mc4` FROM `SOURCE` WHERE `s_mc4`!=''";

mysql_query($sql);

$sql = "INSERT INTO VIRTUEL(`id_virtuel`,`motclef`) SELECT `s_id`,`s_mc5` FROM `SOURCE` WHERE `s_mc5`!=''";

mysql_query($sql);


Gabyte - Angers
------------------
0
kohntark Messages postés 3705 Date d'inscription lundi 5 juillet 2004 Statut Membre Dernière intervention 27 avril 2012 30
21 nov. 2010 à 13:24
Je réponds vite fait, je dois partir.

Pour commencer abandonne les fonctions mysql_*() qui sont obsolètes, dirige toi plutôt vers mysqli*(), ou mieux, PDO.
Ca ne changera pas des masses la donne concernant ton "problème" (qui n'en est pas un)

A vue de nez, oui, tu peux procéder ainsi, mais pour plus de facilité de lecture et donc de simplicité tu pourrai grouper tes requêtes dans un tableau et faire un foreach dessus :

$aReqSQL = array(
'TRUNCATE TABLE `VIRTUEL`',
'NSERT INTO VIRTUEL(`id_virtuel`,`motclef`) SELECT `s_id`,`s_mc1` FROM `SOURCE` WHERE `s_mc1`!=\'\'',
[...]
);

foreach($aReqSQL as $req) {
mysql_query($req);
}

C'est juste pour poser l'idée, ça ne tiens pas compte de ce que je disais avant, de la gestion des erreurs, de la sécurité, ...

Cordialement,

Kohntark -
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
neigedhiver Messages postés 2480 Date d'inscription jeudi 30 novembre 2006 Statut Membre Dernière intervention 14 janvier 2011 19
21 nov. 2010 à 14:28
Salut,

Ca change quand même que PDO est capable d'envoyer plusieurs requêtes et retourne les résultats des requêtes dans un ResultSet, chaque résultat étant accessible séparément.

--
Neige

Souvent la réponse à votre question se trouve dans la doc. Commencez par là ;)
0
gabyte Messages postés 10 Date d'inscription mercredi 3 novembre 2010 Statut Membre Dernière intervention 8 décembre 2010
21 nov. 2010 à 17:54
et bien j'ai donc trouvé la méthode et appris pas mal de choses merci donc
Voici ce qui fonctionne :
--------- début ---------------

mysql_select_db($mabase, $fichier);

$aReqSQL = array(
'TRUNCATE TABLE `VIRTUEL`',
'INSERT INTO VIRTUEL(`id_virtuel`,`motclef`) SELECT `s_id`,`s_mc1` FROM `SOURCE` WHERE `s_mc1`!=\'\'',
'INSERT INTO VIRTUEL(`id_virtuel`,`motclef`) SELECT `s_id`,`s_mc2` FROM `SOURCE` WHERE `s_mc2`!=\'\'',
'INSERT INTO VIRTUEL(`id_virtuel`,`motclef`) SELECT `s_id`,`s_mc3` FROM `SOURCE` WHERE `s_mc3`!=\'\'',
'INSERT INTO VIRTUEL(`id_virtuel`,`motclef`) SELECT `s_id`,`s_mc4` FROM `SOURCE` WHERE `s_mc4`!=\'\'',
'INSERT INTO VIRTUEL(`id_virtuel`,`motclef`) SELECT `s_id`,`s_mc5` FROM `SOURCE` WHERE `s_mc5`!=\'\'');

foreach($aReqSQL as $req) {
$Rch = mysql_query($req, $fichier) or die(mysql_error());
$row_Rch = mysql_fetch_assoc($Rch);
$totalRows_Rch = mysql_num_rows($Rch);
}

---------- fin -------------
merci donc chers comparses
Gabyte - Angers
------------------
0
syndrael Messages postés 2378 Date d'inscription lundi 4 février 2002 Statut Membre Dernière intervention 29 décembre 2012 20
22 nov. 2010 à 08:01
Mysqli peut faire des requetes multiples. A trouver dans la doc (genre multi_query).
après est-ce vraiment utile quand on peut appeler les requetes les unes après les autres..
S.
0
neigedhiver Messages postés 2480 Date d'inscription jeudi 30 novembre 2006 Statut Membre Dernière intervention 14 janvier 2011 19
22 nov. 2010 à 09:37
En fait la question est : est-ce vraiment utile quand 5 requêtes pourraient s'écrire en une seule ?

--
Neige

Souvent la réponse à votre question se trouve dans la doc. Commencez par là ;)
0
Rejoignez-nous