Précédent   Forum des professionnels en informatique > PHP > Outils > WAMP
WAMP Forum d'entraide sur WAMP (Windows Apache MySQL PHP) : installation, utilisation, etc.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 09/10/2007, 16h36   #1
Membre actif
 
Avatar de Lordsephiroth
 
Patrick Mingard
Inscription : mai 2006
Messages : 166
Détails du profil
Informations personnelles :
Nom : Patrick Mingard
Âge : 27

Informations forums :
Inscription : mai 2006
Messages : 166
Points : 185
Points : 185
Par défaut Requête passant sous phpmyadmin mais pas en script

Bonjour à tous,

Je suis confronté actuellement à un problème que je n'avais jamais vu auparavant.

Je travaille actuellement sur WAMP 1.7.2.

Mon soucis est le suivant : une de mes requête refuse d'être exécutée lorsqu'elle est envoyée par un script PHP. Une erreur m'est retournée :

Citation:
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 ';ALTER TABLE object_cd ADD INDEX (id_artiste);ALTER TABLE object_cd ADD FOREIGN ' at line 7
Pour précision, cette erreur m'est retournée lorsque mon script exécute ces lignes :

Code :
1
2
3
4
 
$query = ...
mysql_query($query);
die(mysql_error());
Par contre, lorsque je change ce morceau de code pour :

Code :
1
2
3
 
$query = ...
mysql_query($query) or die($query);
et que je copie-colle la requête affichée dans le navigateur dans phpmyadmin, là aucun soucis, la requête est exécutée correctement.

Je comprends pas tellement comment une requête peut se comporter différemment suivant qu'elle est appelée par un script PHP ou par phpmyadmin.


Pour info, voici la requête en question :

Code :
1
2
3
4
5
6
7
8
9
10
 
CREATE TABLE object_cd ( 
id int(10) unsigned NOT NULL auto_increment, 
id_artiste int(10) unsigned NOT NULL, 
nom text collate latin1_german1_ci NULL, 
prix int(10) NULL, 
PRIMARY KEY (ID) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_german1_ci;
ALTER TABLE object_cd ADD INDEX (id_artiste);
ALTER TABLE object_cd ADD FOREIGN KEY (id_artiste) REFERENCES object_artiste (id) ON DELETE CASCADE ON UPDATE CASCADE;
La table object_artiste existe bien évidemment et elle contient une clé primaire nommée id.

Pour information, cette requête est appelée comme requête finale d'une transaction (MySQL fermant automatiquement les transactions lorsque des requêtes de type CREATE, ALTER ou DELETE).

Lorsque je copie-colle la requête dans phpmyadmin je ne suis bien sûr pas dans une transaction. C'est la seule différence que je vois.

De plus le script marche parfaitement si je supprime les deux sous-requêtes ALTER TABLE et que je garde uniquement le CREATE. C'est uniquement quand les trois sous-requêtes sont mises ensemble qu'elles ne passent pas.


Pour certaines raison je peux que très difficilement les exécuter séparément, elles doivent se trouver les trois dans la même requête.


Si vous avez une idée pour trouver la solution, je vous serais très reconnaissant
Lordsephiroth est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/10/2007, 16h42   #2
Membre Expert
 
Inscription : janvier 2005
Messages : 2 288
Détails du profil
Informations forums :
Inscription : janvier 2005
Messages : 2 288
Points : 2 287
Points : 2 287
Si tu lis la documentation de la fonction mysql_query() il est dit
Citation:
mysql_query() envoie une seule requête (les requêtes multiples ne sont pas supportées) à la base de données courante sur le serveur associé avec le link_identifier spécifié.
Toi tu as trois requetes SQL concaténées dans ta variable et donc ca fait une erreur, il faut les envoyer consécutivement.

EDIT: si tu dois absolument les faire en meme temps pour éviter d'avoir des données fausses a un moment dans ta table (entre les deux requetes, meme si c'est quelques millisecondes ca peut etre ennuyeux parfois) il faut que tu verrouilles ta table avant la première requete et que tu la déverrouilles a la fin

EDIT 2: comme c'est une création de table ca ne marchera pas, par contre tu dois pouvoir en UNE requete unique créer ta table, l'index et la clé étrangère. si tu as trois requetes différentes c'est parce que en la créant dans phpmyadmin tu l'as fait séparément au lieu de le faire en une seule fois
koopajah est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/10/2007, 16h48   #3
Membre actif
 
Avatar de Lordsephiroth
 
Patrick Mingard
Inscription : mai 2006
Messages : 166
Détails du profil
Informations personnelles :
Nom : Patrick Mingard
Âge : 27

Informations forums :
Inscription : mai 2006
Messages : 166
Points : 185
Points : 185
Arg, c'est génant ça.

En fait je génère la requête SQL par un compilateur et il m'est très difficile de savoir au moment ou je crée la table si il y aura une clé étrangère dedans ou non.

De plus cette requête est retournée par une fonction, c'est un peu génant.

Bref, je vais retourner de ma fonction une table de requêtes à exécuter et je ferai un foreach() une fois la table récupérée.

Merci de la réponse très rapide
Lordsephiroth est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/10/2007, 17h04   #4
Membre actif
 
Avatar de Lordsephiroth
 
Patrick Mingard
Inscription : mai 2006
Messages : 166
Détails du profil
Informations personnelles :
Nom : Patrick Mingard
Âge : 27

Informations forums :
Inscription : mai 2006
Messages : 166
Points : 185
Points : 185
Effectivement ça marche bien avec un retour d'array de requêtes.

phpmyadmin utilise soit une autre commande d'accès à la base de données pour exécuter plusieurs requêtes en un appel ou alors phpmyadmin fait une coupure à chaque ';' lui-même avant d'exécuter les différentes sous-requêtes. En tout cas dans phpmyadmin ça marchait en mettant dans un écran SQL les trois sous-requêtes en une requête.


(je le mentionne car ce sera peut être utile un jour à un visiteur qui fera une recherche avant de poster... laissez moi rêver )
Lordsephiroth est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 22h17.


 
 
 
 
Partenaires

Hébergement Web