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

PHP & Base de données Discussion :

Impossible de créer des tables liées via php ?


Sujet :

PHP & Base de données

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2009
    Messages
    354
    Détails du profil
    Informations personnelles :
    Localisation : France, Sarthe (Pays de la Loire)

    Informations forums :
    Inscription : Février 2009
    Messages : 354
    Points : 491
    Points
    491
    Par défaut Impossible de créer des tables liées via php ?
    Bonjours, j'ai un problème étrange...
    Voilà, j'ai un système de module dans mon appli php. Quand j'ajoute un module, j'exécute un fichier contenant les tables sql à créer.
    Les tables sans clés étrangères ne pause pas de problème, mais vous l'aurez deviné, c'est pas le cas avec.
    Pourtant dans phpMyAdmin, tout ce passe nickel , avec ou sans clés.

    voici les tables et la commande:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
    CREATE TABLE IF NOT EXISTS `text_template` (
      `id_text_template` varchar(20) NOT NULL,
      `label` varchar(200) NOT NULL,
      PRIMARY KEY (`id_text_template`)
    ) ENGINE=InnoDB;
     
     
    CREATE TABLE IF NOT EXISTS `text_panel` (
      `id_panel` int(11) NOT NULL,
      `id_text_template` varchar(20) NULL,
      `content` longtext NOT NULL,
      PRIMARY KEY (`id_panel`),
      FOREIGN KEY (`id_panel`) REFERENCES `panel` (`id_panel`) ON DELETE CASCADE,
      FOREIGN KEY (`id_text_template`) REFERENCES `text_template` (`id_text_template`) ON UPDATE CASCADE
    ) ENGINE=InnoDB;
     
    CREATE TABLE IF NOT EXISTS `text_component` (
      `id_text_component` int(1) NOT NULL,
      `id_text_template` varchar(20) NULL,
      `sound` varchar(300) NULL,
      `mute` tinyint(1) NOT NULL,
      PRIMARY KEY (`id_text_component`),
      FOREIGN KEY (`id_text_template`) REFERENCES `text_template` (`id_text_template`) ON UPDATE CASCADE
    ) ENGINE=InnoDB;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $this->exec(file_get_contents('component/text/install.txt'));
    Une idée du pourquoi php ou mysql refuse de créer les tables??

  2. #2
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    Que fait cette méthode exec au juste ?

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2009
    Messages
    354
    Détails du profil
    Informations personnelles :
    Localisation : France, Sarthe (Pays de la Loire)

    Informations forums :
    Inscription : Février 2009
    Messages : 354
    Points : 491
    Points
    491
    Par défaut
    salut Benjamin Delespierre!

    La méthode exec est juste une méthode délégué d'un objet PDO.
    Je me demande si il ne faudrait pas créer les tables une part une, et non toute d'un coup ....?

  4. #4
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    Par défaut, PHP t'empêche d'exécuter plusieurs requêtes d'un seul coup.

    Ce que tu peux faire, c'est surcharger cette méthode pour qu'elle découpe la requête selon le séparateur ; et exécute tous les morceaux les uns après les autres mais c'est terriblement dangereux. Sois sûr de ce que tu fais. Si tu dispose des transaction (table InnoDB) alors cette opération est en revanche pratiquement sans risque car tu pourras toujours revenir en arrière.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2009
    Messages
    354
    Détails du profil
    Informations personnelles :
    Localisation : France, Sarthe (Pays de la Loire)

    Informations forums :
    Inscription : Février 2009
    Messages : 354
    Points : 491
    Points
    491
    Par défaut
    Ok merci beaucoup Benjamin Delespierre, j'étais sur la bonne voix

    Mais ça me laisse perplexe, sans clés étrangère, et en MYISAM, tout était exécuté.
    Cela voudrais dire que sans transaction possible, php effectuer la requête, et que avec, il refuse. Ça devrait logiquement être le contraire non?

    Enfin merci beaucoup !

    a++

  6. #6
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    Tu as réussi à faire passer un exec multi-requêtes avec PDO ??

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2009
    Messages
    354
    Détails du profil
    Informations personnelles :
    Localisation : France, Sarthe (Pays de la Loire)

    Informations forums :
    Inscription : Février 2009
    Messages : 354
    Points : 491
    Points
    491
    Par défaut
    ouais ça a marché sans problème.... vais re-tester pour être sur.

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2009
    Messages
    354
    Détails du profil
    Informations personnelles :
    Localisation : France, Sarthe (Pays de la Loire)

    Informations forums :
    Inscription : Février 2009
    Messages : 354
    Points : 491
    Points
    491
    Par défaut
    Donc ouais c'est comfirmé.
    J'étais meme pas en myisam, mais en innoDB.

    voilà le fichier exécute.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    CREATE TABLE IF NOT EXISTS `text_component` (
      `id_text_component` int(1) NOT NULL,
      `id_text_template` varchar(20) DEFAULT NULL,
      `sound` varchar(300) DEFAULT NULL,
      `mute` tinyint(1) NOT NULL,
      PRIMARY KEY (`id_text_component`),
      KEY `id_text_template` (`id_text_template`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
     
    INSERT INTO `text_component` (`id_text_component`, `id_text_template`, `sound`, `mute`) VALUES
    (1, NULL, NULL, 0);
     
    CREATE TABLE IF NOT EXISTS `text_panel` (
      `id_panel` int(11) NOT NULL,
      `id_text_template` varchar(20) DEFAULT NULL,
      `content` longtext NOT NULL,
      PRIMARY KEY (`id_panel`),
      KEY `id_text_template` (`id_text_template`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
     
     
    CREATE TABLE IF NOT EXISTS `text_template` (
      `id_text_template` varchar(20) NOT NULL,
      `label` varchar(200) NOT NULL,
      PRIMARY KEY (`id_text_template`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;

  9. #9
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    Ah bah écoute je viens d'apprendre un truc là... J'ai testé avec PDO::exec et PDO::query et ça passe sans problème...

    Donc ton problème initial venait pas de là. C'est peut être la contrainte sur la table panel qui pose problème, vérifie que cette table existe dans la DB dans laquelle tu mets ces tables.

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2009
    Messages
    354
    Détails du profil
    Informations personnelles :
    Localisation : France, Sarthe (Pays de la Loire)

    Informations forums :
    Inscription : Février 2009
    Messages : 354
    Points : 491
    Points
    491
    Par défaut
    ba en fait y'a aucun problème sur mes tables, elle passe via phpmyadmin.
    En plus ça ne marche pas quand j'exporte les tables depuis phpmyadmin, vers mon fichier à éxécuter ....sauf si j'enlève les contraintes

    Sinon ca passe bien en découpant les requêtes.

    J'ai testé avec PDO::exec et PDO::query et ça passe sans problème
    Meme avec une séléction !!
    Bizarre !! vous avez dit bizarre

  11. #11
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    PDO::query ne sert pas qu'a faire des séléctions

    Et si tu nous donnait le code d'erreur ça ferait avancer le train: http://php.net/manual/en/pdo.errorinfo.php

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2009
    Messages
    354
    Détails du profil
    Informations personnelles :
    Localisation : France, Sarthe (Pays de la Loire)

    Informations forums :
    Inscription : Février 2009
    Messages : 354
    Points : 491
    Points
    491
    Par défaut
    Ok! le méssage d'érreur est le suivant :

    QLSTATE[HY000]: General error: 1005 Can't create table 'mypan.text_template' (errno: 150)
    QLSTATE[HY000]: General error: -> m’oriente pas beaucoup.
    (errno: 150) -> problème de clés étrangère....

    Ca m'aide pas trop tout ca.

    PDO::query ne sert pas qu'a faire des séléctions
    Mouhaa?? je savais po ! mais qu'est ce que tu peux faire d'autre avec?

  13. #13
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    Aïe l'erreur 150 c'est pas la joie. Elle se produit quand la clé étrangère n'est pas exactement (au poil de cul) identique à la colonne de la table visée.

    A voir sur MySQL:
    If you re-create a table that was dropped, it must have a definition that conforms to the foreign key constraints referencing it. It must have the right column names and types, and it must have indexes on the referenced keys, as stated earlier. If these are not satisfied, MySQL returns error number 1005 and refers to error 150 in the error message.
    Donc vérifie bien les types, leurs tailles etc. (bien évidement ne pas mettre la clé étrangère en auto_increment).

  14. #14
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2009
    Messages
    354
    Détails du profil
    Informations personnelles :
    Localisation : France, Sarthe (Pays de la Loire)

    Informations forums :
    Inscription : Février 2009
    Messages : 354
    Points : 491
    Points
    491
    Par défaut
    Bien, je sais pas d'ou peux venir le problème....
    Comme je l'ai dit, ça passe dans phpmyadmin, et lorsque je découpe les tables, donc exit les problèmes de clés étrangère.
    Je trouverais ça bizarre que ça vienne de PDO, mais si ça viens pas de PDO , comment expliquer que ça marche dans phpmyadmin, ou la console mysql?
    Faudrait essayer, via les fonctions mysql_ , et non via pdo.

    Sinon j'ai pas tout bien compris le pavé sur l’erreur 150, enfin surtout le début.

    If you re-create a table that was dropped, it must have a definition that conforms to the foreign key constraints referencing it
    Y'a une différence à faire entre une table qui à déjà été supprimé, puis recréer, à une toute nouvelle table??

    En tout cas merci pour ton aide, et du temps consacré

  15. #15
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Points : 2 890
    Points
    2 890
    Par défaut
    La doc de PDO::exec() dit que ça exécute une requête SQL, elle ne dit pas qu'on peut en mettre plusieurs.

    Par ailleurs la doc de mysql_query dit explicitement que les requêtes multiples ne sont pas supportées.

    Il faut découper le bloc SQL en requêtes distinctes, c'est certainement ça que doit faire phpmyadmin.

  16. #16
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    Citation Envoyé par estofilo Voir le message
    La doc de PDO::exec() dit que ça exécute une requête SQL, elle ne dit pas qu'on peut en mettre plusieurs.

    Par ailleurs la doc de mysql_query dit explicitement que les requêtes multiples ne sont pas supportées.

    Il faut découper le bloc SQL en requêtes distinctes, c'est certainement ça que doit faire phpmyadmin.
    En effet, mais je viens de faire le test (sous WAMP, LAMP se comporte peut être différement) et PDO::exec est effectivement capable de faire plusieurs create table d'un coup contrairement à mysql_query...

    PHPMyAdmin procède au découpage effectivement.

  17. #17
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Points : 2 890
    Points
    2 890
    Par défaut
    Citation Envoyé par Benjamin Delespierre Voir le message
    En effet, mais je viens de faire le test (sous WAMP, LAMP se comporte peut être différement) et PDO::exec est effectivement capable de faire plusieurs create table d'un coup contrairement à mysql_query...
    Ca dépend du paramétrage de la connexion.
    En passant 65536 dans le dernier argument (client_flags) de mysql_connect,ça fait que mysql_query a le même comportement que PDO::exec au niveau des instructions multiples. Ces méthodes ne sont pas vraiment en cause, elles ne font que passer le contenu au serveur mysql sans regarder ce qu'il y a dedans.

    Le problème est que comme le montre l'exemple de kimjoa, l'usage des requêtes multiples peut très bien provoquer une erreur mysql complètement imprévisible sur des requêtes par ailleurs tout à fait valides individuellement.

Discussions similaires

  1. [AC-2010] Impossible de créer des relations avec une table liée à Outlook
    Par lagratteCchouette dans le forum Modélisation
    Réponses: 4
    Dernier message: 26/01/2014, 21h44
  2. [AC-2007] Créer un enregistrement avec des tables liées sur SQL Server
    Par NEfanda dans le forum Access
    Réponses: 2
    Dernier message: 29/04/2010, 19h31
  3. Réponses: 1
    Dernier message: 19/08/2009, 21h20
  4. Créer un bouton pour gérer la source des tables liées
    Par Fredo67 dans le forum VBA Access
    Réponses: 1
    Dernier message: 18/02/2008, 10h31

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