Précédent   Forum des professionnels en informatique > PHP > PHP & SGBD
PHP & SGBD Forum d'entraide sur les SGBD avec PHP. Avant de poster : FAQ BDD, toutes les FAQ PHP, cours BDD et sources BDD
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 30/06/2011, 16h26   #1
Membre éclairé
 
Avatar de kimjoa
 
Inscription : février 2009
Messages : 318
Détails du profil
Informations personnelles :
Localisation : France, Sarthe (Pays de la Loire)

Informations forums :
Inscription : février 2009
Messages : 318
Points : 360
Points : 360
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 :
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 :
$this->exec(file_get_contents('component/text/install.txt'));
Une idée du pourquoi php ou mysql refuse de créer les tables??
kimjoa est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/06/2011, 17h04   #2
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 2 984
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 24
Localisation : France

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

Informations forums :
Inscription : février 2010
Messages : 2 984
Points : 5 011
Points : 5 011
Que fait cette méthode exec au juste ?
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom
Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même).

Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...".
Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug.

Les boutons et existent, servez-vous en
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 30/06/2011, 17h09   #3
Membre éclairé
 
Avatar de kimjoa
 
Inscription : février 2009
Messages : 318
Détails du profil
Informations personnelles :
Localisation : France, Sarthe (Pays de la Loire)

Informations forums :
Inscription : février 2009
Messages : 318
Points : 360
Points : 360
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 ....?
kimjoa est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/06/2011, 17h13   #4
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 2 984
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 24
Localisation : France

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

Informations forums :
Inscription : février 2010
Messages : 2 984
Points : 5 011
Points : 5 011
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.
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom
Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même).

Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...".
Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug.

Les boutons et existent, servez-vous en
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 30/06/2011, 17h18   #5
Membre éclairé
 
Avatar de kimjoa
 
Inscription : février 2009
Messages : 318
Détails du profil
Informations personnelles :
Localisation : France, Sarthe (Pays de la Loire)

Informations forums :
Inscription : février 2009
Messages : 318
Points : 360
Points : 360
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++
kimjoa est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/06/2011, 17h25   #6
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 2 984
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 24
Localisation : France

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

Informations forums :
Inscription : février 2010
Messages : 2 984
Points : 5 011
Points : 5 011
Tu as réussi à faire passer un exec multi-requêtes avec PDO ??
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom
Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même).

Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...".
Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug.

Les boutons et existent, servez-vous en
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 30/06/2011, 17h27   #7
Membre éclairé
 
Avatar de kimjoa
 
Inscription : février 2009
Messages : 318
Détails du profil
Informations personnelles :
Localisation : France, Sarthe (Pays de la Loire)

Informations forums :
Inscription : février 2009
Messages : 318
Points : 360
Points : 360
ouais ça a marché sans problème.... vais re-tester pour être sur.
kimjoa est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/06/2011, 17h31   #8
Membre éclairé
 
Avatar de kimjoa
 
Inscription : février 2009
Messages : 318
Détails du profil
Informations personnelles :
Localisation : France, Sarthe (Pays de la Loire)

Informations forums :
Inscription : février 2009
Messages : 318
Points : 360
Points : 360
Donc ouais c'est comfirmé.
J'étais meme pas en myisam, mais en innoDB.

voilà le fichier exécute.
Code :
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;
kimjoa est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/06/2011, 17h49   #9
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 2 984
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 24
Localisation : France

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

Informations forums :
Inscription : février 2010
Messages : 2 984
Points : 5 011
Points : 5 011
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.
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom
Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même).

Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...".
Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug.

Les boutons et existent, servez-vous en
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 30/06/2011, 17h54   #10
Membre éclairé
 
Avatar de kimjoa
 
Inscription : février 2009
Messages : 318
Détails du profil
Informations personnelles :
Localisation : France, Sarthe (Pays de la Loire)

Informations forums :
Inscription : février 2009
Messages : 318
Points : 360
Points : 360
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.

Citation:
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
kimjoa est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/06/2011, 18h06   #11
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 2 984
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 24
Localisation : France

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

Informations forums :
Inscription : février 2010
Messages : 2 984
Points : 5 011
Points : 5 011
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
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom
Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même).

Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...".
Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug.

Les boutons et existent, servez-vous en
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 30/06/2011, 18h22   #12
Membre éclairé
 
Avatar de kimjoa
 
Inscription : février 2009
Messages : 318
Détails du profil
Informations personnelles :
Localisation : France, Sarthe (Pays de la Loire)

Informations forums :
Inscription : février 2009
Messages : 318
Points : 360
Points : 360
Ok! le méssage d'érreur est le suivant :

Citation:
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.

Citation:
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?
kimjoa est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/06/2011, 18h31   #13
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 2 984
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 24
Localisation : France

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

Informations forums :
Inscription : février 2010
Messages : 2 984
Points : 5 011
Points : 5 011
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:
Citation:
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).
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom
Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même).

Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...".
Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug.

Les boutons et existent, servez-vous en
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 30/06/2011, 18h49   #14
Membre éclairé
 
Avatar de kimjoa
 
Inscription : février 2009
Messages : 318
Détails du profil
Informations personnelles :
Localisation : France, Sarthe (Pays de la Loire)

Informations forums :
Inscription : février 2009
Messages : 318
Points : 360
Points : 360
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.

Citation:
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é
kimjoa est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/07/2011, 13h11   #15
Modérateur
 
Inscription : octobre 2008
Messages : 1 508
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : octobre 2008
Messages : 1 508
Points : 2 040
Points : 2 040
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.
estofilo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/07/2011, 10h40   #16
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 2 984
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 24
Localisation : France

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

Informations forums :
Inscription : février 2010
Messages : 2 984
Points : 5 011
Points : 5 011
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.
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom
Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même).

Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...".
Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug.

Les boutons et existent, servez-vous en
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/07/2011, 15h09   #17
Modérateur
 
Inscription : octobre 2008
Messages : 1 508
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : octobre 2008
Messages : 1 508
Points : 2 040
Points : 2 040
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.
estofilo est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 03h48.


 
 
 
 
Partenaires

Hébergement Web