Précédent   Forum des professionnels en informatique > PHP > PHP & SGBD > PHP & MySQL
PHP & MySQL Forum d'entraide sur les fonctions MySQL avec PHP. Avant de poster -> FAQ MySQL, Cours MySQL et Sources MySQL. Pour les questions concernant le moteur MySQL plutôt que les fonctions PHP, merci d'utiliser le forum MySQL.
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 03/10/2011, 15h54   #1
Invité de passage
 
Inscription : novembre 2008
Messages : 35
Détails du profil
Informations forums :
Inscription : novembre 2008
Messages : 35
Points : 4
Points : 4
Par défaut INSERT VALUES SELECT et PDO

Bonjour à tous,
Voilà un moment que je cherche à réaliser l'action ci-dessous :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
 
$req_inserer = $bdd->prepare('INSERT INTO ime_constituer 
(
        num_enfant_C,
	num_item_C,
	num_exercice_C,
	guidance_C,
	obs_C
 
) 
VALUES 
(
SELECT :num_enfant, :num_item_exercice, :num_exercice
FROM ime_enfant, ime_exercices
WHERE num_enfant = ? 
)');
 
$req -> bindValue('num_enfant',$num_enfant,PDO::PARAM_STR);
$req -> bindValue('num_item',$num_item,PDO::PARAM_STR);
$req -> bindValue('num_exercice',$num_exercice,PDO::PARAM_STR);
 
$req->execute(array($_GET['num_enfant']));
}
mais j'ai le message d'erreur suivant :

Notice: Undefined variable: req in C:\wamp\www\imebaobab\evaluation\enfant_item_evaluation.php on line 212

J'ai bien compris qu'il ne connaissait pas la variable req mais un oeil nouveau sur mon code pourrait peut-être m'aider.
Merci d'avance pour votre aide
Jérôme
jeje_974 est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 03/10/2011, 16h11   #2
Modérateur
 
Inscription : septembre 2010
Messages : 7 131
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 131
Points : 8 491
Points : 8 491
y'a pas de $req dans ton code
__________________
http://blog.stealth35.com/
stealth35 est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/10/2011, 16h13   #3
Membre éclairé
 
Homme Gérard Okono
Développeur Web
Inscription : juillet 2006
Messages : 711
Détails du profil
Informations personnelles :
Nom : Homme Gérard Okono
Localisation : Cameroun

Informations professionnelles :
Activité : Développeur Web
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : juillet 2006
Messages : 711
Points : 328
Points : 328
Citation:
Envoyé par jeje_974 Voir le message
Bonjour à tous,
Voilà un moment que je cherche à réaliser l'action ci-dessous :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
 
$req_inserer = $bdd->prepare('INSERT INTO ime_constituer 
(
        num_enfant_C,
	num_item_C,
	num_exercice_C,
	guidance_C,
	obs_C
 
) 
VALUES 
(
SELECT :num_enfant, :num_item_exercice, :num_exercice
FROM ime_enfant, ime_exercices
WHERE num_enfant = ? 
)');
 
$req -> bindValue('num_enfant',$num_enfant,PDO::PARAM_STR);
$req -> bindValue('num_item',$num_item,PDO::PARAM_STR);
$req -> bindValue('num_exercice',$num_exercice,PDO::PARAM_STR);
 
$req->execute(array($_GET['num_enfant']));
}
mais j'ai le message d'erreur suivant :

Notice: Undefined variable: req in C:\wamp\www\imebaobab\evaluation\enfant_item_evaluation.php on line 212

J'ai bien compris qu'il ne connaissait pas la variable req mais un oeil nouveau sur mon code pourrait peut-être m'aider.
Merci d'avance pour votre aide
Jérôme
Ce n'est que normal. Tu commences avec $req_inserer et tu finis par $req

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
 
$req = $bdd->prepare('INSERT INTO ime_constituer 
(
        num_enfant_C,
	num_item_C,
	num_exercice_C,
	guidance_C,
	obs_C
 
) 
VALUES 
(
SELECT :num_enfant, :num_item_exercice, :num_exercice
FROM ime_enfant, ime_exercices
WHERE num_enfant = ? 
)');
 
$req -> bindValue('num_enfant',$num_enfant,PDO::PARAM_STR);
$req -> bindValue('num_item',$num_item,PDO::PARAM_STR);
$req -> bindValue('num_exercice',$num_exercice,PDO::PARAM_STR);
 
$req->execute(array($_GET['num_enfant']));
}
okoweb est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/10/2011, 16h50   #4
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 029
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 11 029
Points : 18 324
Points : 18 324
Envoyer un message via MSN à CinePhil
Ce n'est pas
Code SQL :
INSERT INTO... VALUES... SELECT
Il faut choisir :
Code SQL :
1
2
3
4
INSERT INTO... SELECT
-- ou bien 
INSERT INTO...
VALUES -- les valeurs
De plus, tu as 5 colonnes dans le INSERT INTO et seulement 3 dans le SELECT. Si les deux dernières colonnes doivent prendre leur valeur par défaut, inutile de les mettre dans la requête INSERT.

Tu cites deux tables dans le FROM sans mettre de condition de jointure donc tu auras un produit cartésien des deux tables ! Si tu veux faire une jointure, elles s'écrivent depuis 1992 avec l'opérateur JOIN ; il serait temps de s'y mettre !

Si num_enfant, num_item_exercice et num_exercice sont des colonnes des tables, pourquoi les passer en paramètres cachés ? Si ce sont des valeurs, pourquoi utiliser une requête SELECT ?

Ta requête devrait donc être celle-ci :
Code SQL :
1
2
3
4
5
INSERT INTO ime_constituer (num_enfant_C, num_item_C, num_exercice_C) 
SELECT :num_enfant, :num_item_exercice, :num_exercice
FROM ime_enfant
INNER JOIN ime_exercices ON -- manque condition de jointure !
WHERE num_enfant = ?
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/10/2011, 17h01   #5
Invité de passage
 
Inscription : novembre 2008
Messages : 35
Détails du profil
Informations forums :
Inscription : novembre 2008
Messages : 35
Points : 4
Points : 4
Effectivement, cela a résolu quelque peu le problème...mais j'ai un autre message d'erreur...à forcer de taper du code je m'y perds

Voilà les messages d'erreurs :
Code :
1
2
3
4
5
6
7
8
9
10
 
Notice: Undefined variable: num_enfant in C:\wamp\www\imebaobab\evaluation\enfant_item_evaluation.php on line 212
 
Notice: Undefined variable: num_item in C:\wamp\www\imebaobab\evaluation\enfant_item_evaluation.php on line 213
 
Notice: Undefined variable: num_exercice in C:\wamp\www\imebaobab\evaluation\enfant_item_evaluation.php on line 214
 
Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[HY093]: Invalid parameter number: mixed named and positional parameters' in C:\wamp\www\imebaobab\evaluation\enfant_item_evaluation.php on line 216
 
PDOException: SQLSTATE[HY093]: Invalid parameter number: mixed named and positional parameters in C:\wamp\www\imebaobab\evaluation\enfant_item_evaluation.php on line 216
Voilà voilà en fait je pense que j'ai un problème avec mes variables du select qui ne se retrouve pas dans le bindvalue...enfin je crois ! ! !
Merci encore pour votre aide.
Jérôme
jeje_974 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/10/2011, 17h06   #6
Modérateur
 
Inscription : septembre 2010
Messages : 7 131
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 131
Points : 8 491
Points : 8 491
oui elles sont ou tes variables ?
__________________
http://blog.stealth35.com/
stealth35 est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/10/2011, 17h13   #7
Invité de passage
 
Inscription : novembre 2008
Messages : 35
Détails du profil
Informations forums :
Inscription : novembre 2008
Messages : 35
Points : 4
Points : 4
Tout d'abord merci pour ton aide...c'est très gentil ! ! !

Citation:
De plus, tu as 5 colonnes dans le INSERT INTO et seulement 3 dans le SELECT. Si les deux dernières colonnes doivent prendre leur valeur par défaut, inutile de les mettre dans la requête INSERT.
Ok...je ne savais pas comment faire.

Citation:
Tu cites deux tables dans le FROM sans mettre de condition de jointure donc tu auras un produit cartésien des deux tables ! Si tu veux faire une jointure, elles s'écrivent depuis 1992 avec l'opérateur JOIN ; il serait temps de s'y mettre !
Le produit cartésien est ce que je cherche pour mon application...donc c'est bon ! ! !

Citation:
Si num_enfant, num_item_exercice et num_exercice sont des colonnes des tables, pourquoi les passer en paramètres cachés ? Si ce sont des valeurs, pourquoi utiliser une requête SELECT ?
Pourrais-tu m'expliquer plus en détail ce que tu veux dire dans cette citation ?

Merci pour tout.
Jérôme
jeje_974 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/10/2011, 23h28   #8
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 029
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 11 029
Points : 18 324
Points : 18 324
Envoyer un message via MSN à CinePhil
Citation:
Envoyé par jeje_974 Voir le message
Le produit cartésien est ce que je cherche pour mon application...donc c'est bon ! ! !
Tu es sûr ?
pourquoi veux-tu insérer autant de lignes qu'il y a de possibilités de mariages entre les lignes des deux tables ?
Tu peux expliquer plus concrètement ce que tu cherches à faire ?

Citation:
Pourrais-tu m'expliquer plus en détail ce que tu veux dire dans cette citation ?
La syntaxe habituelle d'une requête SELECT est :
Code SQL :
1
2
3
SELECT -- des colonnes
FROM -- une table
WHERE -- condition(s) de restriction
Les colonnes ont des noms fixes ; je ne vois donc pas l'intérêt de nommer ces colonnes via des variables dans ta requête.
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/10/2011, 06h59   #9
Invité de passage
 
Inscription : novembre 2008
Messages : 35
Détails du profil
Informations forums :
Inscription : novembre 2008
Messages : 35
Points : 4
Points : 4
Bonjour,

Citation:
Tu es sûr ?
pourquoi veux-tu insérer autant de lignes qu'il y a de possibilités de mariages entre les lignes des deux tables ?
Tu peux expliquer plus concrètement ce que tu cherches à faire ?
J'ai des enfants qui doivent être évalués sur 250 exercices. J'ai donc une table enfant et une table exercice reliées toutes les deux par une table constituer dans laquelle j'aurais constituer(num_enfant, num_exercice, observations). Dans la mesure ou les enfants seront évalués sur l'ensemble des exercices j'ai bien un produit cartésien avec lequel je remplis ma table constituer. Ai-je bien raison ? As-tu une autre piste de développement ?

Citation:
Les colonnes ont des noms fixes ; je ne vois donc pas l'intérêt de nommer ces colonnes via des variables dans ta requête.
Ok, merci j'ai compris mon erreur ! ! !


J'ai désormais une autre question : comment fait-on pour sauvegarder plusieurs lignes d'un formulaire en même temps via un UPDATE ?
Je vais chercher de mon côté mais si tu pouvais me mettre sur la piste ce serait sympa...merci


Merci pour tout.
Jérôme
jeje_974 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/10/2011, 09h54   #10
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 029
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 11 029
Points : 18 324
Points : 18 324
Envoyer un message via MSN à CinePhil
Citation:
Envoyé par jeje_974 Voir le message
J'ai des enfants qui doivent être évalués sur 250 exercices. J'ai donc une table enfant et une table exercice reliées toutes les deux par une table constituer dans laquelle j'aurais constituer(num_enfant, num_exercice, observations). Dans la mesure ou les enfants seront évalués sur l'ensemble des exercices j'ai bien un produit cartésien avec lequel je remplis ma table constituer. Ai-je bien raison ? As-tu une autre piste de développement ?
OK pour le produit cartésien pour remplir la table associative. Mais alors, pourquoi ajouter une restriction ?
Citation:

Citation:
J'ai désormais une autre question : comment fait-on pour sauvegarder plusieurs lignes d'un formulaire en même temps via un UPDATE ?
Je vais chercher de mon côté mais si tu pouvais me mettre sur la piste ce serait sympa...merci
Tu récupères tes lignes de formulaire via une variable tableau, tu boucles sur ce tableau pour alimenter la requête UPDATE qui va s'exécuter autant de fois qu'il y a de lignes dans le tableau.
Et puisque tu utilises PDO, examine bien la manière de faire de vraies requêtes préparées qui sont je pense utiles dans ce cas précis.
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/10/2011, 11h19   #11
Invité de passage
 
Inscription : novembre 2008
Messages : 35
Détails du profil
Informations forums :
Inscription : novembre 2008
Messages : 35
Points : 4
Points : 4
Citation:
OK pour le produit cartésien pour remplir la table associative. Mais alors, pourquoi ajouter une restriction ?
En fait la BD est plus complexe que ce que j'ai montré...les enfants sont crées dans la table enfant et font l'objet de projets pédagogiques (PP). Mais un enfant, même s'il possède un PP ne sera pas forcément évalué...donc pas de lignes le concernant dans constituer. C'est la raison pour laquelle je ne traite les exercices que pour l'enfant qui va être évalué, et donc enfant par enfant, d'où la restriction. Si l'enfant n'est pas évalué, pas de lignes le concernant dans constituer...je ne sais pas si j'ai été bien clair dans mon explication. Si tu n'as pas compris, dis le moi, je reformulerai.

Citation:
Tu récupères tes lignes de formulaire via une variable tableau, tu boucles sur ce tableau pour alimenter la requête UPDATE qui va s'exécuter autant de fois qu'il y a de lignes dans le tableau.
Et puisque tu utilises PDO, examine bien la manière de faire de vraies requêtes préparées qui sont je pense utiles dans ce cas précis.
Ok, merci je vais chercher dans ce sens.
Merci encore pour ton temps passé sur mon problème.
@+
Jérôme
jeje_974 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 19h21.


 
 
 
 
Partenaires

Hébergement Web