IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

EDI, CMS, Outils, Scripts et API PHP Discussion :

Requête passant sous phpmyadmin mais pas en script [Wamp]


Sujet :

EDI, CMS, Outils, Scripts et API PHP

  1. #1
    Membre confirmé Avatar de Lordsephiroth
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    199
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2006
    Messages : 199
    Points : 494
    Points
    494
    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 :

    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    $query = ...
    mysql_query($query);
    die(mysql_error());
    Par contre, lorsque je change ce morceau de code pour :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Always code as if the guy maintaining your application is a violent psychopath!
    Site personnel sur la saga Final Fantasy : http://www.final-fantasy.ch

  2. #2
    Membre expert
    Inscrit en
    Janvier 2005
    Messages
    2 291
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 291
    Points : 3 212
    Points
    3 212
    Par défaut
    Si tu lis la documentation de la fonction mysql_query() il est dit
    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

  3. #3
    Membre confirmé Avatar de Lordsephiroth
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    199
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2006
    Messages : 199
    Points : 494
    Points
    494
    Par défaut
    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
    Always code as if the guy maintaining your application is a violent psychopath!
    Site personnel sur la saga Final Fantasy : http://www.final-fantasy.ch

  4. #4
    Membre confirmé Avatar de Lordsephiroth
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    199
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2006
    Messages : 199
    Points : 494
    Points
    494
    Par défaut
    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 )
    Always code as if the guy maintaining your application is a violent psychopath!
    Site personnel sur la saga Final Fantasy : http://www.final-fantasy.ch

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [MySQL] Requete qui fonction sous PhpMyAdmin mais pas avec PHP
    Par lorentdups dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 09/09/2011, 20h35
  2. [MySQL] Résultat dans phpMyAdmin mais pas dans script
    Par dubitoph dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 25/01/2010, 12h07
  3. [Wamp] Requete fonctionne sous phpmyadmin mais pas en script php
    Par ben.IT dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 12
    Dernier message: 04/01/2010, 16h16
  4. Requête OK sous Toad mais pas dans un ksh
    Par agdid04 dans le forum Outils
    Réponses: 2
    Dernier message: 08/10/2008, 16h19
  5. Réponses: 2
    Dernier message: 04/09/2008, 18h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo