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

Langage PHP Discussion :

INSERT INTO avec des VALUE d'un tableau


Sujet :

Langage PHP

  1. #1
    Futur Membre du Club
    Homme Profil pro
    entrepreneur
    Inscrit en
    Septembre 2019
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : entrepreneur
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Septembre 2019
    Messages : 19
    Points : 5
    Points
    5
    Par défaut INSERT INTO avec des VALUE d'un tableau
    Bonjour à tous !

    Me revoilà avec un nouveau problème à me faire perdre les rares cheveux qu'il me reste !

    Voici le problème :

    Dans une page commande_client2.php je crée un formulaire qui m'affiche les champs d'une base article (champs filtrés selon un paramètre donné que j'ai récupéré via un autre formulaire situé dans commande_client1.php). Même s'il m'a fallu pas mal tâtonner et apprendre sur le tas, je débute en php, jusque là pas de souci, c'est après que ça corse. Mais d'ors et déjà voici mon code de commande_client2.php :

    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
    27
    28
    29
    30
     
    <?php
    try{$bdd = new PDO('mysql:host=localhost;dbname=les_zechoppes;charset=utf8', 'root', '');}
    catch(Exception $e){die('Erreur : '.$e->getMessage());}
     
    $id_echoppe = $_POST['id_echoppeF'];
    $reponse = $bdd->query("SELECT produit.nom as nom_produit, produit.id as id_produit, fournisseur.nom as nom_fournisseur FROM produit INNER JOIN fournisseur ON produit.id_fournisseur=fournisseur.id WHERE fournisseur.id_echoppe=$id_echoppe");
     
    ?>
    <form name="commande" method="post" action="commande_client_3.php">
    <?php
    while ($donnees = $reponse->fetch())
    {
    ?>
     
        	quantité de <?php echo '<b>'.$donnees['nom_produit'].'</b> (fournisseur : <b>'.$donnees['nom_fournisseur'].'</b>)'; ?> : <input type="texte" name=<?php echo $donnees['id_produit']; ?>> <br/>
       </p>
     
    <?php
    }
    ?>
    		<br/><br />
    			<input type="submit" value="CONTINUER">
     
    </form>
    <?php
     
    $reponse->closeCursor();
     
    ?>
    Le formulaire ci dessus a pour vocation de renseigner pour chaque produit, une quantité. Ainsi, dans une nouvelle page commande_client3.php, je cherche à écrire dans une table les valeurs (qté) saisies dans le précédent formulaire pour chaque article (du formulaire!). Or je n'ai aucune écriture !! Ni même d'erreur !! Juste une page blanche ... Voici le code de mon commande_client3.php :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <?php
     
    try{$bdd = new PDO('mysql:host=localhost;dbname=les_zechoppes;charset=utf8', 'root', '');}
    catch(Exception $e){die('Erreur : '.$e->getMessage());}
     
       foreach($_POST as $key => $value)
    {
    $req = $bdd->exec('INSERT INTO ligne_cde_client(id_produit,quantite) VALUES (int)$key, (int)$value');
    }
    ?>
    Au début j'ai soupçonné que mes $key et $value soient vides, j'ai donc voulu les afficher pour m'en assurer, avec un echo :

    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
    <?php
     
    try{$bdd = new PDO('mysql:host=localhost;dbname=les_zechoppes;charset=utf8', 'root', '');}
    catch(Exception $e){die('Erreur : '.$e->getMessage());}
     
       foreach($_POST as $key => $value)
    {
    $req = $bdd->exec('INSERT INTO ligne_cde_client(id_produit,quantite) VALUES (int)$key, (int)$value');
    }
     
       foreach($_POST as $key => $value)
    {
        echo 'id_produit='.$key.' ,quantite='.$value.'<br/>';
    }
     
    ?>
    Et là s'affiche bien toutes les valeurs que je souhaite écrire dans ma table, preuve que mon &_POST contient bien ce que je veux ! Voici en copier/coler dans mon exemple ce que ça affiche :
    id_produit=1 ,quantite=1001
    id_produit=2 ,quantite=1002
    id_produit=3 ,quantite=1003
    id_produit=4 ,quantite=1004
    id_produit=5 ,quantite=1005
    id_produit=6 ,quantite=1006
    id_produit=7 ,quantite=1007
    id_produit=8 ,quantite=1008
    id_produit=9 ,quantite=1009
    id_produit=10 ,quantite=1010
    id_produit=11 ,quantite=1011
    id_produit=12 ,quantite=1012

    ET POURTANT MA TABLE RESTE VIDE. Rhaaaaaa !

    Auriez vous une idée lumineuse ?

    Merciiiiiiiii

  2. #2
    Membre expert
    Avatar de Dendrite
    Femme Profil pro
    Développeuse informatique
    Inscrit en
    Juin 2008
    Messages
    2 129
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 58
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeuse informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2008
    Messages : 2 129
    Points : 3 627
    Points
    3 627
    Billets dans le blog
    8
    Par défaut
    Bonjour, il faut passer par une requête préparée. C'est tout l'intérêt de PDO.

    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <?php
    try{
      $bdd = new PDO('mysql:host=localhost;dbname=les_zechoppes;charset=utf8', 'root', '');
      $stg = $bdd->prepare('INSERT INTO ligne_cde_client(id_produit,quantite) VALUES ?, ?');
      foreach($_POST as $key => $value){
        $stg->execute(array($key,$value));
      }
    }catch(Exception $e){
      echo 'Erreur : '.$e->getMessage();
    }

    https://www.developpez.net/forums/bl.../pdo-soupe-lit
    PDO, une soupe et au lit !
    Partir de la fin est un bon moyen de retrouver son chemin. Bibi - 2020

  3. #3
    Futur Membre du Club
    Homme Profil pro
    entrepreneur
    Inscrit en
    Septembre 2019
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : entrepreneur
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Septembre 2019
    Messages : 19
    Points : 5
    Points
    5
    Par défaut
    Oups, désolé, j'avais oublié de préciser que j'avais tenté aussi via requête préparée. Malheureusement ça ne marchait pas plus.

    Voici le code modifié avec ta proposition (j'ai inclus mon écho pour m'assurer que mes valeurs sont bien passées en méthode POST/et pour info ça ne marche pas plus en enlevant ce bout de code ! L'inverse aurait d'ailleurs été étonnant...).

    Bref, toujours même souci ! Pas d'écriture dans la table. Et pas d'erreur ...

    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
    <?php
    try{
      $bdd = new PDO('mysql:host=localhost;dbname=les_zechoppes;charset=utf8', 'root', '');
      $stg = $bdd->prepare('INSERT INTO ligne_cde_client(id_produit,quantite) VALUES ?, ?');
      foreach($_POST as $key => $value){
        $stg->execute(array($key,$value));
      }
    }catch(Exception $e){
      echo 'Erreur : '.$e->getMessage();
    }
     
       foreach($_POST as $key => $value)
    {
        echo 'id_produit='.$key.' ,quantité='.$value.'<br/>';
    }
     
    ?>
    Auriez vous une autre piste ?

  4. #4
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    débutant ou pas, c'est une question de sécurité.

    LIS CE TUTO, et surtout FAIS l'EXERCICE proposé : PDO une soupe et au lit !

  5. #5
    Futur Membre du Club
    Homme Profil pro
    entrepreneur
    Inscrit en
    Septembre 2019
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : entrepreneur
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Septembre 2019
    Messages : 19
    Points : 5
    Points
    5
    Par défaut
    Hello,

    Merciiiiiiii !! Je viens de comprendre ma BETISE (pour être poli), grâce à ce bon tuto de Dentrite & co! Je crois que je vais allez au lit là !!

    J'ai donc modifié mon code ainsi :

    Et en gros, le souci n'était pas tant un problème de syntaxe (car même en requête préparée telle que conseillé par Dentrite dans sa précédente réponse ça ne fonctionnait pas) mais un problème de structure de table !!! J'ai pu le comprendre car le code tel qu'écrit ci dessous permet d'avoir le détail d'une erreur sql (à priori via le try catch de la fonction db_mysql.php (que je remets aussi ci dessous pour ceux qui liront ces échanges).

    Et là je lis une belle "erreur" :
    Erreur : SQLSTATE[HY000]: General error: 1364 Field 'id_entete_cde_client' doesn't have a default value
    Et là j'ai un peu le sentiment d'être celui qui appel le sav FNAC car son ordinateur ne marche pas et qui s’aperçoit au bout de 1 heure qu'il n'a pas branché la prise !!! Mon champs "id_entete_cde_client" n'avait aucune valeur par défaut. Donc forcement comme je ne la définis pas, ça plante...

    Bon, en l’occurrence cette valeur je pensais m'en occuper plus tard, mais du coup je vais maintenant la définir (je pressents que je vais avoir un souci, mais je vais tenter de résoudre ça tout seul avant de vous appeler au secours !!)

    En tout cas merci pour le coup de main, et merci surtout de m’avoir laissé chercher sans me donner la solution toute cuite (ou presque), on a le sentiment de progresser mieux !

    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
    27
    <?php
     
     
    $sql='INSERT INTO ligne_cde_client(id_produit, quantite) VALUES ( ?, ?)';
    //je passe par la methode de connexion tel qu'étudié dans PDO et au lit ;-) !
    $db = include 'db_mysql.php';
    try { 
       //la ligne qui lance la requête préparée
       $stmt = $db->prepare($sql);
       // j'affecte les marqueurs précis via mes variables de type POST envoyées par le formulaire commande_client2.php
      foreach($_POST as $key => $value){
        $stmt->execute(array($key,$value));
     
       // on peut récupérer le nombre de lignes affectées. Effectivement pas mal pour s'assurer de l'ecriture !
       $nb_insert = $stmt->rowCount();
       echo $nb_insert.' insertion effectuée<br/>';
       unset($db);
     
      }
     
     
    }catch(Exception $e){
      echo 'Erreur : '.$e->getMessage();
    }
     
     
    ?>
    Et vla le db_mysql.php

    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
    <?php
    // on vérifie si la fonction de connexion a déjà été définie afin d'éviter de la redéfinir
    if ( ! function_exists('db_connexion')) {
       function db_connexion() {
          // une fois ouverte, on renvoie toujours la même connexion
          static $pdo;
          // on vérifie si la connexion n'a pas déjà été initialisée
          if ( ! ($pdo instanceof PDO)) {
             // tentative d'ouverture de la connexion MySQL
             try {
                $pdo = new PDO('mysql:host=localhost;port=3306;dbname=les_zechoppes;charset=utf8','root', '', [
                PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
                PDO::ATTR_EMULATE_PREPARES   => false
                ]);
             } 
             catch (PDOException $e) {
                throw new InvalidArgumentException('Erreur connexion à la base de données : '.$e->getMessage());
                exit;
             }
          }
          // renvoi de la ressource : connexion à la base de données
          return $pdo;
       }
    }
    return db_connexion();
    A noter que maintenant que j'ai modifié ma structure de table sur le champs en question, le code initial marche parfaitement. Pour autant je garde le nouveau code plus pertinent et propre semble t il...

  6. #6
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par gdelarminat Voir le message
    ...et merci surtout de m’avoir laissé chercher sans me donner la solution toute cuite (ou presque), on a le sentiment de progresser mieux !...

    Ça fait plaisir à lire (et de voir que certains comprennent la démarche).

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

Discussions similaires

  1. [MariaDB] INSERT INTO avec des variables
    Par laterriere dans le forum SQL Procédural
    Réponses: 1
    Dernier message: 10/01/2019, 20h28
  2. INSERT INTO avec des virgules dans un champs
    Par _developpeur_ dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 15/06/2011, 12h21
  3. Requête INSERT INTO avec des champs et des variables
    Par fips1962 dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 26/05/2009, 17h51
  4. insert into avec des champs calculés ou déduits
    Par domiq44 dans le forum JDBC
    Réponses: 2
    Dernier message: 17/03/2009, 07h26
  5. [Débutant] INSERT INTO avec VALUES + SELECT
    Par Feezdev dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 15/06/2006, 10h10

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