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 :

INSERT VALUES SELECT et PDO [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre confirmé
    Inscrit en
    Novembre 2008
    Messages
    80
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 80
    Par défaut INSERT VALUES SELECT et PDO
    Bonjour à tous,
    Voilà un moment que je cherche à réaliser l'action ci-dessous :

    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
     
    $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

  2. #2
    Expert confirmé

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Par défaut
    y'a pas de $req dans ton code

  3. #3
    Membre éprouvé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2006
    Messages
    985
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 985
    Par défaut
    Citation Envoyé par jeje_974 Voir le message
    Bonjour à tous,
    Voilà un moment que je cherche à réaliser l'action ci-dessous :

    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
     
    $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 : 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
     
    $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']));
    }

  4. #4
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    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 : 16 814
    Billets dans le blog
    14
    Par défaut
    Ce n'est pas
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO... VALUES... SELECT
    Il faut choisir :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « 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 la suite Linux Mageïa !

  5. #5
    Membre confirmé
    Inscrit en
    Novembre 2008
    Messages
    80
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 80
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  6. #6
    Expert confirmé

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Par défaut
    oui elles sont ou tes variables ?

  7. #7
    Membre confirmé
    Inscrit en
    Novembre 2008
    Messages
    80
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 80
    Par défaut
    Tout d'abord merci pour ton aide...c'est très gentil ! ! !

    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.

    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 ! ! !

    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

  8. #8
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    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 : 16 814
    Billets dans le blog
    14
    Par défaut
    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 ?

    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « 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 la suite Linux Mageïa !

  9. #9
    Membre confirmé
    Inscrit en
    Novembre 2008
    Messages
    80
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 80
    Par défaut
    Bonjour,

    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 ?

    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

  10. #10
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    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 : 16 814
    Billets dans le blog
    14
    Par défaut
    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 ?

    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 Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « 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 la suite Linux Mageïa !

  11. #11
    Membre confirmé
    Inscrit en
    Novembre 2008
    Messages
    80
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 80
    Par défaut
    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.

    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

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

Discussions similaires

  1. Insert multiple (INSERT INTO ...VALUES SELECT...)
    Par acognard dans le forum Débuter
    Réponses: 7
    Dernier message: 13/05/2014, 13h42
  2. [AC-2010] Requete insert value et select en meme temps
    Par Mut dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 11/06/2012, 15h14
  3. Combiner INSERT INTO .. SELECT et VALUES
    Par sacha1208 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 12/01/2011, 16h32
  4. [Débutant] INSERT INTO avec VALUES + SELECT
    Par Feezdev dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 15/06/2006, 10h10
  5. [Insert et Select de la même table]
    Par lucimast dans le forum Langage SQL
    Réponses: 4
    Dernier message: 20/01/2004, 14h53

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