Page 1 sur 1

Question sur exécution d'une requête au travers de php

Posté : 30 juin 2006, 21:26
par thegwil
Bonsoir à tous ! Et tout à d'abord merci pour toutes vos contributions qui m'ont déjà beaucoup aidé.

J'ai la requête suivante qui fonctionne très bien via phpmyadmin :

Code : Tout sélectionner

CREATE TEMPORARY TABLE parents_temp (idparent tinyint(3) unsigned); LOCK TABLES tags READ, tag_has_parent READ; INSERT INTO parents_temp SELECT parent_id FROM tag_has_parent WHERE tag_id = 15; SELECT tags.tag_name FROM tags, parents_temp WHERE tags.tag_id = parents_temp.idparent; UNLOCK TABLES; DROP TABLE parents_temp;
Par contre, si j'écris ceci :

Code : Tout sélectionner

$sql = "CREATE TEMPORARY TABLE parents_temp (idparent tinyint(3) unsigned);"; $sql .= "LOCK TABLES tags READ, tag_has_parent READ;"; $sql .= "INSERT INTO parents_temp SELECT parent_id FROM tag_has_parent WHERE tag_id = 15;"; $sql .= "SELECT tags.tag_name FROM tags, parents_temp WHERE tags.tag_id = parents_temp.idparent;"; $sql .= "UNLOCK TABLES;"; $sql .= "DROP TABLE parents_temp;"; $requete = mysql_query($sql, $solutionh) or die(mysql_error()); $resultat = mysql_fetch_assoc($requete);
Mysql me signale systématiquement une erreur de syntaxe.
Je suis donc obligé de faire :

Code : Tout sélectionner

$sql = "CREATE TEMPORARY TABLE IF NOT EXISTS parents_temp (idparent tinyint(3) unsigned) ;"; $requete=mysql_query($sql, $solutionh) or die(mysql_error()); $sql = "LOCK TABLES tags READ, tag_has_parent READ ;"; $requete=mysql_query($sql, $solutionh) or die(mysql_error()); $sql = "INSERT INTO parents_temp SELECT parent_id FROM tag_has_parent WHERE tag_id = 15 ;"; $requete=mysql_query($sql, $solutionh) or die(mysql_error()); $sql = "SELECT tags.tag_name FROM tags, parents_temp WHERE tags.tag_id = parents_temp.idparent ;"; $requete=mysql_query($sql, $solutionh) or die(mysql_error()); $resultat = mysql_fetch_assoc($requete); $sql = "UNLOCK TABLES ;"; $requete=mysql_query($sql, $solutionh) or die(mysql_error()); $sql = "DROP TABLE parents_temp ;"; $requete=mysql_query($sql, $solutionh) or die(mysql_error());
pour que cela fonctionne. Méthode qui ne me plaît guère.
J'ai bien évidemment fait un echo de $sql et j'ai beau lire et relire, je ne vois aucune erreur de syntaxe.

Quelqu'un aurait-il une explication concernant ce phénomène ? Et surtout y a-t-il une manière propre de le contrer ?

Tant que j'y pense et avant que vous ne demandiez, je suis obligé de travailler avec cette requête parce qu'il existe malheureusement encore des serveurs mysql de production qui n'acceptent pas les requêtes imbriquées. Cela dit, cette fameuse erreur de syntaxe (que je ne trouve pas) m'est renvoyée par mysql 3.23, 4 et 5.

Merci d'avance.
Bonne soirée.

PS : finalement, j'en viens à penser que cette une limitation de mysql et que ce message n'est pas dans la bonne salle. Si c'est le cas, un modérateur ne manquera pas de déplacer.

Posté : 30 juin 2006, 21:48
par Cyrano
Tu ne peux exécuter qu'une seule requête à la fois. Procède autrement :
<?php
$sql1 = "CREATE TEMPORARY TABLE parents_temp (idparent tinyint(3) unsigned);";
$sql2 = "LOCK TABLES tags READ, tag_has_parent READ;";
$sql3 = "INSERT INTO parents_temp SELECT parent_id FROM tag_has_parent WHERE tag_id = 15;";
$sql4 = "SELECT tags.tag_name FROM tags, parents_temp WHERE tags.tag_id = parents_temp.idparent;";
$sql5 = "UNLOCK TABLES;";
$sql6 = "DROP TABLE parents_temp;";
$requete1 = mysql_query($sql1, $solutionh) or die(mysql_error());
$requete2 = mysql_query($sql2, $solutionh) or die(mysql_error());
$requete3 = mysql_query($sql3, $solutionh) or die(mysql_error());
$requete4 = mysql_query($sql4, $solutionh) or die(mysql_error());
$requete5 = mysql_query($sql5, $solutionh) or die(mysql_error());
$requete6 = mysql_query($sql6, $solutionh) or die(mysql_error());
$resultat = mysql_fetch_assoc($requete4); 
?>

Posté : 01 juil. 2006, 00:35
par thegwil
Ok merci pour ta réponse mais j'essaye de comprendre.
Ma requête SQL compte 6 instructions.
Pourquoi n'ai-je aucun renvoi d'erreur dans phpmyadmin lorsque je l'envois en un seul bloc alors qu'il faut que je la splitte en autant de "mysql_query" qu'il y a d'instructions lorsque j'utilise mon script ?

Posté : 01 juil. 2006, 07:14
par Cyrano
Parce que phpMyAdmin est programmé pour analyser la chaine et détecter les requêtes multiples afin de les exécuter successivement. Ton script n'est certainement pas programmé de cette manière et envoie à MySQL une série de requêtes que mysql ne peut pas exécuter d'un seul bloc.

Posté : 01 juil. 2006, 15:55
par thegwil
Ok. Merci pour cette précision.
Donc au bout du compte, si je comprends bien, phpmyadmin exécute toutes les instructions de la requête une par une tout comme dans le script que tu m'as indiqué.
Il n'y a donc pas réellement de différence et aucune façon d'optimiser mon script.
C'est bien cela ?

Ce sera ma dernière question. Merci encore.

Bon WE