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 :

Insertion de données d'un panier dans une base


Sujet :

PHP & Base de données

  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2021
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Janvier 2021
    Messages : 16
    Par défaut Insertion de données d'un panier dans une base
    Bonjour,

    Tout d'abord je précise que je suis débutant donc j'appelle à une certaine indulgence envers mon soucis...
    J'ai essayé, dans le cadre de la création d'un outil de gestion de bon de commandes, de réaliser un 'panier'.
    Après quelques heures de galère j'ai décidé de me servir d'un script assez facile à mettre en place sur mon projet.
    J'ai donc réussi à l'incorporer, mais maintenant je n'arrive pas à réaliser l'insertion des produits et de leur quantité dans ma base de données.
    Pour vous expliquer, mon insertion doit se faire premièrement dans une table commande puis dans une table commande_contenu.

    Voci mon script d'insertion :

    ajout_commande.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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
     
    <?php
     
    $id_produits = !empty($_POST['id_produit']) ? $_POST['id_produit'] : NULL;
    $quantites= !empty($_POST['quantite']) ? $_POST['quantite'] : NULL;
     
    // Requêtes d'ajout d'ouvrages à la commande
    if(isset($_POST['commander'])){
     
        // Création de la commande
        $commander = mysqli_real_escape_string($con, htmlspecialchars($_POST['commander']));
     
        $commande1="INSERT INTO commande(`id_client`,`etat_commande`)
                    VALUES (1, 'en attente')";
     
        //exécution de la requete
        if(!mysqli_query($con, $commande1) ){
            echo("Erreur dans la requete : " . $commande1 . ' <br>Erreur :' . mysqli_error($con));
        }
     
        // récupération de l'id nouvellement inséré en BDD
        $id_commande =  mysqli_insert_id($con);         
     
        $_SESSION['id_commande'] = $id_commande;
     
        // Puis boucle sur le/les produit(s) pour les ajouter dans la commande
        foreach($quantites as $id_produits => $qte ){
     
     
            if(!empty( $qte) && !empty($id_produits) ) {
            $commande2="INSERT INTO commande_contenu(`id_commande`,`id_produit`,`quantite`)
                        VALUES ('".$id_commande."', '".$id_produits."', '".$qte."')";
     
                //exécution de la requete 2 avec le même id_commande.
                if(!mysqli_query($con, $commande2) ){
                    echo("Erreur dans la requete : " . $commande2 . ' <br>Erreur :' . mysqli_error($con));
                }
            }
     
        } 
        header('Location:recap_commande.php');
    }
    La première partie fonctionne(insertion dans la table commande), mais pas la deuxième(insertion des données id_produits et quantite dans la table commande_contenu. A la ligne 26, j'ai l'erreur suivante :
    Warning: Invalid argument supplied for foreach() in C:\wamp64\www\semaine5\ajout_commande.php

    Puis, même ligne :
    Warning: Cannot modify header information - headers already sent by (output started at C:\wamp64\www\semaine5\ajout_commande.php:26) in C:\wamp64\www\semaine5\ajout_commande.php on line 40


    Je vous mets aussi mon script de panier pour que vous puissiez mieux comprendre :


    commande.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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
     
    <?php 
    // Création de la commande si n'existe pas dans la session de l'utilisateur
    if (! isset($_SESSION['commande']))  $_SESSION['commande'] = array();
     
    // Voici les données externes utilisées par la commande
    $id_produit   = isset($_GET['id_produit'])   ? $_GET['id_produit']   : null;
    $nom_produit  = isset($_GET['nomProduit'])  ? $_GET['nomProduit']  : null;
    $prix_produit = isset($_GET['prixProduit']) ? $_GET['prixProduit'] : '?';
    $qte_produit  = isset($_GET['qte_produit'])  ? $_GET['qte_produit']  : 1;
     
    // Voici les traitements de la commande
    if ($id_produit == null) echo 'Veuillez sélectionner un produit pour le mettre dans la commande!'; // Message si pas d'acticle sélectionné
    else
    if (isset($_GET['ajouter'])){ // Ajouter un nouvel produit
      $_SESSION['commande'][$id_produit]['nom']  = $nom_produit;
      $_SESSION['commande'][$id_produit]['prix'] = $prix_produit;
      $_SESSION['commande'][$id_produit]['qte']  = $qte_produit;
    } 
    else if (isset($_GET['modifier']))  $_SESSION['commande'][$id_produit]['qte'] = $qte_produit; // Modifier la quantité achetée
    else if (isset($_GET['supprimer']))  unset($_SESSION['commande'][$id_produit]); // Supprimer un produit de la commande
     
    // Voici l'affichage de la commande
    echo '<h2>Contenu de votre commande</h2><ul>';
    if (isset($_SESSION['commande']) && count($_SESSION['commande'])>0){
      $total_commande = 0;
      foreach($_SESSION['commande'] as $id_produit=>$produit_acheté){
        // On affiche chaque ligne de la commande : nom, prix et quantité modifiable + 2 boutons : modifier la qté et supprimer l'produit
        if (isset($produit_acheté['nom']) && isset($produit_acheté['prix']) && isset($produit_acheté['qte'])){
          echo '<li><form>', $produit_acheté['nom'], ' (', number_format($produit_acheté['prix'], 2, ',', ' '), ' €) ',
           '<input type="hidden" name="id_produit" value="', $id_produit , '" />
            <br />Qté: <input type="text" name="qte_produit" value="', $produit_acheté['qte'] , '" />
            <input type="submit" name="modifier" value="Nouvelle Qté" />
            <input type="submit" name="supprimer" value="Supprimer" />
          </form>
          </li>';
     
          // Calcule le prix total de la commande 
          $total_commande += $produit_acheté['prix'] * $produit_acheté['qte'];
        }
      }
      echo '<hr><h3>Total: ', number_format($total_commande, 2, ',', ' '), ' €'; // Affiche le total de la commande
    }
    else { echo 'Votre commande est vide'; } // Message si la commande est vide
    echo "</ul>";
     
     
     
    ?>
    Merci pour votre attention, bonne journée

  2. #2
    Expert confirmé
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 583
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 583
    Par défaut
    la 1re chose à regarder est le contenu de $_POST pour vérifier que vous récupérez bien toutes les données.

    vous pouvez essayer cette fonction qui affichera n'importe quelle variable
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    function aff($var) {
    	echo "<pre>";
    	echo htmlspecialchars(var_export($var, TRUE));
    	echo "</pre>";
    }

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2021
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Janvier 2021
    Messages : 16
    Par défaut
    J'obtiens cela en faisant un var_dump (la fonction au dessus me renvoyait une fatal error):

    array (size=1)
    'commander' => string 'Commander' (length=9)

  4. #4
    Expert confirmé
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 583
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 583
    Par défaut
    s'il n'y a pas les données "quantite" dans le tableau, cela veut dire qu'il y a un souci sur le formulaire qui envoie les données.

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2021
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Janvier 2021
    Messages : 16
    Par défaut
    Ok alors j'ai réussi à récupérer les données qui m'intéressent,

    array (size=3)
    'id_produit' => string '9' (length=1)
    'quantite_produit' => string '1' (length=1)
    'commander' => string 'Commander' (length=9)


    mais j'ai néanmoins toujours la même erreur,

    Warning: Invalid argument supplied for foreach() in C:\wamp64\www\semaine5\ajout_commande.php *

    J'ai fait des recherches sur la possible origine de cette erreur mais je n'ai pas réussi à la corriger...

    Bonne journée

  6. #6
    Expert confirmé
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 583
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 583
    Par défaut
    vous n'avez toujours rien dans $_POST['quantite'] et j'ai l'impression que vous récupérez seulement le dernier élément.
    pour récupérer toutes les données, vous pouvez par exemple utiliser les crochets dans les noms des champs comme cela :
    https://www.php.net/manual/fr/langua...s.external.php

  7. #7
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2021
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Janvier 2021
    Messages : 16
    Par défaut
    En effet je ne récupère pas toutes les données.
    J'ai essayé de faire comme vous me l'avez conseillé mais honnêtement je suis perdu je n'y arrive plus, toujours cette même erreur sous mes yeux depuis 24h.
    Je n'ai même pas quelque chose à vous proposer, je ne comprends pas.

  8. #8
    Expert confirmé
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 583
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 583
    Par défaut
    proposez nous le code qui génère le formulaire, on trouvera peut-être le souci.

  9. #9
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2021
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Janvier 2021
    Messages : 16
    Par défaut Formulaire
    Le voici :

    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
    31
    32
    33
     
    // Voici l'affichage de la commande
    echo '<h2>Contenu de votre commande</h2><ul>';
    if (isset($_SESSION['commande']) && count($_SESSION['commande'])>0){
     
      $total_commande = 0;
     
      foreach($_SESSION['commande'] as $id_produit=>$produit_acheté){
        // On affiche chaque ligne de la commande : nom, prix et quantité modifiable + 2 boutons : modifier la qté et supprimer l'produit
        if (isset($produit_acheté['nom']) && isset($produit_acheté['prix']) && isset($produit_acheté['quantite'])){
          echo '
            <li>
              <form method="GET">', $produit_acheté['nom'], ' (', number_format($produit_acheté['prix'], 2, ',', ' '), ' €) ',
              '<input type="hidden" name="id_produit" value="', $id_produit , '" />
                <br />Qté: <input type="text" name="quantite_produit" value="', $produit_acheté['quantite'] , '" />
                <input type="submit" name="modifier" value="Nouvelle Qté" />
                <input type="submit" name="supprimer" value="Supprimer" />
                <br/><br/>
                ';
     
          // Calcule le prix total de la commande 
          $total_commande += $produit_acheté['prix'] * $produit_acheté['quantite'];
        }
      }
      echo '<hr><h3>Total: ', number_format($total_commande, 2, ',', ' '), ' €'; // Affiche le total de la commande
    }
    else { 
      echo 'Votre commande est vide'; 
    } // Message si la commande est vide
     
    echo'
    <input type="submit" value="Commander" name="commander" class="btn btn-sm btn-primary">  
    </form>

  10. #10
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2021
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Janvier 2021
    Messages : 16
    Par défaut
    Bonjour,

    je me permets d'actualiser ce post n'ayant reçu aucune solution jusqu'à présent.
    J'ai continué de chercher mon erreur, et je pense que le premier argument de mon foreach attend peut-être une variable de type tableau associatif (page ajout_commande.php)
    Aussi, est-ce que le nom que j'associe a chacun des produits dans ma boucle ($id_produit) est cohérent ? j'ai l'impression que le soucis vient d'ici sans être arrivé à le résoudre
    Merci pour votre attention.

    EDIT : j'ai changé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    foreach($quantite_produit as $id_produit => $qte ){
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    foreach($produit_acheté as $id_produit => $qte ){
    Ca tente la requête !! malheureusement les valeurs ne sont pas au bon endroit... je progresse !
    Du coup mes soucis actuels sont que seulement le dernier élément est inséré, et que ça ne détecte pas l'id_produit (du coup rien n'est encore inséré).

    Erreur dans la requete : INSERT INTO commande_contenu(`id_commande`,`id_produit`,`quantite`) VALUES ('339', 'nom', 'Chaudiere en or')
    Erreur :Incorrect integer value: 'nom' for column 'id_produit' at row 1Erreur dans la requete : INSERT INTO commande_contenu(`id_commande`,`id_produit`,`quantite`) VALUES ('339', 'prix', '19990')
    Erreur :Incorrect integer value: 'prix' for column 'id_produit' at row 1Erreur dans la requete : INSERT INTO commande_contenu(`id_commande`,`id_produit`,`quantite`) VALUES ('339', 'quantite', '1')
    Erreur :Incorrect integer value: 'quantite' for column 'id_produit' at row 1

  11. #11
    Expert confirmé
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 583
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 583
    Par défaut
    si vous regardez le code HTML généré, vous verrez déjà qu'il y a plusieurs fois la balise "form" d'ouverture parce qu'elle est dans la boucle. il faut la mettre au début, avant la boucle.

    ensuite pour les champs qui contiennent les quantités, il faut utiliser des crochets pour récupérer un tableau. comme cela par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo '<input type="text" name="qte_produit[' . $id_produit . ']" value="'. $produit_acheté['qte'] . '" />';

  12. #12
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2021
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Janvier 2021
    Messages : 16
    Par défaut
    Bon...

    Je n'ai pas du tout réussi à résoudre le problème malgré vos conseils.
    J'ai même empiré les choses donc je suis revenu à une version antérieure de mon projet.
    Le résultat était toujours similaire à ce que j'avais partagé dans mon précédent message.
    Je ne souhaitais pas demander ça mais si quelqu'un a une solution concrète qui pourrait me débloquer, ce serait super.

    EDIT : du coup j'ai réessayé des choses et voilà ce que j'obtiens :

    Erreur dans la requete : INSERT INTO commande_contenu(`id_commande`,`id_produit`,`quantite`) VALUES ('468', '3', '1')
    Erreur : Duplicata du champ '468-3' pour la clef 'PRIMARY'
    Erreur dans la requete : INSERT INTO commande_contenu(`id_commande`,`id_produit`,`quantite`) VALUES ('468', '3', '1')
    Erreur : Duplicata du champ '468-3' pour la clef 'PRIMARY'
    Les valeurs que je souhaite sont bonnes ici. mais apparement ma boucle crée un duplicata les arguments du foreach doivent encore être faux...
    Cela dit l'insertion fonctionne. Mais que sur le dernier produit ajouté au panier.
    Sinon il m'est plus possible de modifier la quantité d'un produit, cela me renvoie ça :

    Nom : erreur_modif_qte.JPG
Affichages : 89
Taille : 69,8 Ko

Discussions similaires

  1. Réponses: 19
    Dernier message: 27/10/2011, 14h01
  2. Réponses: 3
    Dernier message: 19/09/2009, 03h19
  3. Réponses: 15
    Dernier message: 21/12/2008, 19h31
  4. Insertion des données d'un formulaire dans une base
    Par youssef222 dans le forum Langage
    Réponses: 3
    Dernier message: 22/10/2008, 00h16
  5. Insertion de données d'un formulaire dans une table
    Par manu971 dans le forum Requêtes et SQL.
    Réponses: 6
    Dernier message: 06/11/2007, 19h22

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