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 :

Boucle sur formulaire et enregistrements multiples


Sujet :

Langage PHP

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2015
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Octobre 2015
    Messages : 4
    Points : 1
    Points
    1
    Par défaut Boucle sur formulaire et enregistrements multiples
    Bonjour a tous,

    J'essaie depuis quelque temps de mettre au point un formulaire un peu particulier pour éffectuer plusieurs enregistrements simultanés dans ma base de donnée, mais aucune solution ne semble convenir a ce que je souhaite faire, je me tourne donc vers vous en espérant que quelqu'un puisse m'apporter aide et conseil.

    J'entre dans le vif du sujet, je dois finir ce boulo au plus vite et ce script non fonctionnel est en train de me rendre fou.

    En gros on est sur un panier un peu particulier, car chaque produit droit apparaitre dans la bdd comme une commande a part entière, et donc chaque produit doit générer un nouvel enregistrement (exemple, si mon panier contient 5 articles, je vais avoir 5 insertions dans ma table).

    Concrètement on a une série d'informations a récupérer, réunir, et balancer dans la bdd. Pour lier ces infos et les insérer, j'affiche en premier les infos qui seront insérés pour un check manuel avant insertion, ensuite je récupère mes infos dans les sessions, je les balances dans un formulaire (qui sera en hidden), puis je balance le tout dans ma table.
    Le délire qui rend les choses difficile, c'est le fait que j'ai plusieurs lignes a rentrer dans ma bdd en même temps. J'ai donc une boucle sur mon formulaire ainsi qu'une boucle sur l'insertion des données.

    Le problème c'est que mes scripts sont visiblement bugués quelque part et que rien ne marche...

    Voila donc mon code qui récupère les différentes infos a insérer pour une validation. Le code fonctionne, mais le contenu de ma session panier s'affiche en double, y'a une petite boulette quelque part donc...

    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
     
    		<form name="validpanier2" method="post" action="index.php?page=validation2">
    			<input type="text" name="commandeslieu" value="<?php echo $_POST['commandeslieu'] ?>">
    				<?php
    				if (isset($_SESSION['panier']))	{
    					foreach ($_SESSION['panier']['id_article'] as $id)
    					{		
    	                                  for($i = 1; $i <= $panier_nbrprod; $i++)
                                                 { 
    								print '  <div style="background-color:white; border-radius:7px; padding:20px 50px; margin:15px 0 20px 0; position:relative;">
    											<p style="font-weight:bold; font-size:14pt;">'. $produits[$id][2] .' - <span style="color:#00AFEA">'.$produits[$id][1].'	</span></p>
    											<br>
    											<p>'. $_SESSION['panierdesc'. $produits[$id][0] .''] .'</p>
    											<br>
    											</div>
    											
    											<input type="text" name="commandesproduit'. $i .'" value="'. $produits[$id][1] .'">
    											<input type="text" name="commandescategorie'. $i .'" value="'. $produits[$id][2] .'">
    											<input type="text" name="commandesdetails'. $i .'" value="'. $_SESSION['panierdesc'. $produits[$id][0] .''] .'">
    										';	
    							}
    						}
    					}
    ?> ... <!--contenu html --> <?php
                    if (isset($_SESSION['panier']))		{
    				print '<input style="float:right; margin-right:60px;" type="submit" name="Valider" value="Valider">';	
    				} 	else 
    					print '<p>Aucune commande en cours</p>';	?>
    			</form>
    Voici maintenant le php qui traite le formulaire ci dessus pour faire les insertions multiples :

    La le problème c'est que la seule réponse du serveur me vient d'SQL, et qu'il s'agit d'une belle erreur sorti de nulle part (ou pas, mais vu que j'ignore d'ou elle vient... )

    Erreur SQL : You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 2
    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
    $temps = intval(time()); 
    $requete = "INSERT INTO CMS_commandes (commandes_produit, commandes_categorie, commandes_details, 
    								commandes_membre, commandes_lieu, commandes_date, commandes_validation) VALUES ";
    $a_ajouter = array();
    while(isset($_POST['commandesproduit'][++$i])) {
     
      $a_ajouter[] = "('".mysql_real_escape_string($_POST['commandesproduit'][$i])."', '".mysql_real_escape_string($_POST['commandescategorie'][$i])."', 
    							'".mysql_real_escape_string($_POST['commandesdetails'][$i])."','".mysql_real_escape_string($_SESSION['membre_pseudo'])."',
    							'".mysql_real_escape_string($_POST['commandeslieu'])."','".$temps."', '0'
    								)";
    }
    $requete .= implode(',', $a_ajouter); 
    mysql_query($requete) or die('Erreur SQL : '.mysql_error());
    ?>
    Le but est d'avoir un script qui va lister les produits de mon panier dans la premiere page, la seconde doit créer un enregistrement pour chacun d'entre eux. J'ai tenté d'inclure un $i dans mes champs pour lister mes commandes puis de faire un enregistrement pour chaque $i dans la seconde page mais... bah si ça marchait je ne serais pas ici !

    Si quelqu'un voit un hic dans mon code ou a une info susceptible de m'aider, je suis preneur !

    Merci d'avance !

    Tyranus

  2. #2
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    Une bonne technique pour débuguer dans ton cas serait d'afficher la requête dans l'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mysql_query($requete) or die('Erreur SQL : '.mysql_error().'<br> Requête : '.$requete);
    Au passage, ll'API mysql est obsolète en PHP5.5+ et sera supprimée en PHP7, il serait judicieux d'envisager de passer à PDO (ou mysqli) Dans ton cas, ça te permettrait en plus de faire une requête préparée à exécuter en boucle au lieu de te prendre le chou avec un tableau de requêtes à concaténer...
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  3. #3
    Membre éprouvé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2009
    Messages
    736
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2009
    Messages : 736
    Points : 1 101
    Points
    1 101
    Par défaut
    Il y une façon plus si simple que ce que vous êtes entrain de faire mais pour pouvoir t'aider tu dois m'expliquer d'où vient la variable $produits
    A la recherche d'un film : http://chercher-un-film.com

  4. #4
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    					foreach ($_SESSION['panier']['id_article'] as $id)
    					{		
    	                    for($i = 1; $i <= $panier_nbrprod; $i++)
    Là, en effet, tu parcours plusieurs fois le même tableau...

    Code php : 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
    <form name="validpanier2" method="post" action="index.php?page=validation2">
    	<input type="text" name="commandeslieu" value="<?php echo $_POST['commandeslieu'] ?>">
    <?php
    	if (isset($_SESSION['panier']))	{
    		foreach ($_SESSION['panier']['id_article'] as $id)
    		{		
    			echo '  <div style="background-color:white; border-radius:7px; padding:20px 50px; margin:15px 0 20px 0; position:relative;">
    			<p style="font-weight:bold; font-size:14pt;">'. $produits[$id][2] .' - <span style="color:#00AFEA">'.$produits[$id][1].'	</span></p>
    			<br>
    			<p>'. $_SESSION['panierdesc'. $produits[$id][0] .''] .'</p>
    			<br>
    			</div>
    
    			<input type="text" name="cmdproduit['. $id .'][1]" value="'. $produits[$id][1] .'">
    			<input type="text" name="cmdproduit['. $id .'][2]" value="'. $produits[$id][2] .'">
    			<input type="text" name="cmdproduit['. $id .'][0]" value="'. $_SESSION['panierdesc'. $produits[$id][0] .''] .'">
    			';	
    		}
    	}
    ?>
     ... <!--contenu html -->
    <?php
    	if (isset($_SESSION['panier']))
    	{
    		echo '<input style="float:right; margin-right:60px;" type="submit" name="Valider" value="Valider">';	
    	} else {
    		echo '<p>Aucune commande en cours</p>';
    	}
    ?>
    </form>
    Tu remarqueras que j'ai mis des crochets aux name :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    name="cmdproduit['. $id .'][1]
    => on récupère alors un array :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $cmdproduit_array = $_POST['cmdproduit'];
    qu'on peut ensuite traiter avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    foreach( $cmdproduit_array as $id => $cmdproduit)
    {
    	// $id est l'identifiant du produit
    	$commande_produit = $cmdproduit_array[$id][1];
    	$commande_categorie = $cmdproduit_array[$id][2];
    	$commande_details = $cmdproduit_array[$id][0];
    	// Ici, on peut enregistrer CE produit en BdD
    	// ....
    }

  5. #5
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2015
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Octobre 2015
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Bonsoir a tous, merci pour vos réponses plus que constructives !

    Alors, je jete un oeil en détails a tout ça et je prend mon clavier...

    Citation Envoyé par Celira Voir le message
    Une bonne technique pour débuguer dans ton cas serait d'afficher la requête dans l'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mysql_query($requete) or die('Erreur SQL : '.mysql_error().'<br> Requête : '.$requete);
    Au passage, ll'API mysql est obsolète en PHP5.5+ et sera supprimée en PHP7, il serait judicieux d'envisager de passer à PDO (ou mysqli) Dans ton cas, ça te permettrait en plus de faire une requête préparée à exécuter en boucle au lieu de te prendre le chou avec un tableau de requêtes à concaténer...
    Bien vu pour l'affichage de la requete

    22 ans et mon php est périmé J'ai souvent des erreurs sur des codes périmés quand je bosse en local

    ---

    Citation Envoyé par m4riachi Voir le message
    Il y une façon plus si simple que ce que vous êtes entrain de faire mais pour pouvoir t'aider tu dois m'expliquer d'où vient la variable $produits
    Il vient d'un tableau :
    $IDX_ID = 0; $IDX_TITRE = 1; $IDX_CATEGORIE = 2; $IDX_DESC = 3;
    $produits = array( "id" => array("id", "valeur", "valeur","valeur",),

    Je me doute qu'il y a une multitude de façons d'arriver a faire fonctionner ce module, certaines plus facile je pense, mais le faire marcher d'une façon ou d'une autre serait déjà une bonne chose ^^
    Je pourrais peaufiner ça par la suite lorsque j'aurais un peu de temps de libre pour perfectionner mon php !

    ---

    Citation Envoyé par jreaux62 Voir le message
    Bonjour,
    Là, en effet, tu parcours plusieurs fois le même tableau...
    A force de triturer le code dans tous les sens pour essayer de m'en sortir je fais des bourdes monumental, j'ai honte


    Je vous remercie pour le reste des conseils et corrections, je pense avoir ce qu'il me faut pour y arriver, c'est super
    j'essaie tout ça et je vous tiens au courant !

  6. #6
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2015
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Octobre 2015
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Rebonsoir tout le monde ! Après quelques essaies j'ai fini par me trouver confronter au même problème : Comment peu on lister les produits et faire une nouvelle insertion pour chacun d'entre eux ?
    S'il y a 3 produits en cours de commande, il faudrait que je me retrouve au final avec trois enregistrements dans ma table.

    Je voudrais donc lister les produits contenu dans le array et les balancer a la suite dans la bdd en séparant mes enregistrer par une virgule et en bouclant le tout, mais voila... z'y arrive pas

    A force de triturer le code ça ressemble de moins en moins a quelque chose de correct j'ai l'impression, c'est frustrant

    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
            <?php 
    $temps = intval(time()); 
    $requete = "INSERT INTO CMS_commandes (commandes_produit, commandes_categorie, commandes_details, 
    										commandes_membre, commandes_lieu, commandes_date, commandes_validation) VALUES ";	
    $cmdproduit_array = $_POST['cmdproduit'];			
    	foreach( $cmdproduit_array as $id => $cmdproduit)
    		{
    		// $id est l'identifiant du produit
    		$commande_produit = $cmdproduit_array[$id][1];
    		$commande_categorie = $cmdproduit_array[$id][2];
    		$commande_details = $cmdproduit_array[$id][0];
    		// Ici, on peut enregistrer CE produit en BdD
    		// ....
    $a_ajouter = array();													
      $a_ajouter[] = "('".$commande_produit."', '".$commande_categorie."','".$commande_details."',
    					'".$_SESSION['membre_pseudo']."','".mysql_real_escape_string($_POST['commandeslieu'])."','".$temps."', '0')";					
    $requete = implode(',' ,$a_ajouter);
     
    mysql_query($requete) or die('Erreur SQL : '.mysql_error().'<br> Requête : '.$requete);	  } ?>
    Quelqu'un aurait-il une solution fonctionnelle par hasard ?
    Je suis sur la création d'un petit CMS pour ma boite, et c'est le seul module qui ne fonctionne pas encore, c'est donc d'autant plus frustrant de ne pas réussir a régler ce dernier (gros) détail

    Encore merci pour l'aide que vous m'apportez !

  7. #7
    Invité
    Invité(e)
    Par défaut
    Pas d'implode.
    Tu executes l'INSERT dans le foreach, pour chaque produit.

  8. #8
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2015
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Octobre 2015
    Messages : 4
    Points : 1
    Points
    1
    Par défaut [RESOLUE] Boucle sur formulaire et enregistrements multiples
    Je repasse un peu en retard pour donner des news ainsi que ma solution, qui pourra servir a d'autres éventuellement.

    J'ai pu rapidement résoudre mon problème grace a votre aide, je vous en remercie, et m'exuse de vous tenir au courant avec tant de retard, je suis pas mal pris ces temps ci.

    Voici donc ma solution pour faire les enregistrements multiples une fois les données collectés.

    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
     
    	<?php 
     
    $temps = intval(time()); 
    $cmdproduit_array = $_POST['cmdproduit'];
     
    	foreach( $cmdproduit_array as $id => $cmdproduit)
    		{
     
    		$commande_produit = $cmdproduit_array[$id][1];
    		$commande_categorie = $cmdproduit_array[$id][2];
    		$commande_details = $cmdproduit_array[$id][0];
     
    mysql_query("INSERT INTO CMS_commandes (commandes_produit, commandes_categorie, commandes_details, 
    										commandes_membre, commandes_lieu, commandes_date, commandes_validation) 
    						VALUES ('".$commande_produit."', '".$commande_categorie."','".$commande_details."',
    					'".$_SESSION['membre_pseudo']."','".mysql_real_escape_string($_POST['commandeslieu'])."','".$temps."', '0')")		
     
    or die('Erreur SQL : '.mysql_error().'<br> Requête : '.$requete);		
     
     
    unset($_SESSION['panier']);
     
    	} ?>

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

Discussions similaires

  1. [AC-2007] Problème de boucle sur formulaire en continu
    Par Daniel-Gérald dans le forum Access
    Réponses: 2
    Dernier message: 13/12/2013, 09h33
  2. Boucle sur formulaire de simulation de clic sur bouton
    Par arnolano0 dans le forum VBA Access
    Réponses: 2
    Dernier message: 18/02/2010, 10h34
  3. [MySQL] Boucles sur formulaire
    Par falz222 dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 31/08/2006, 11h59
  4. Réponses: 19
    Dernier message: 26/01/2006, 08h44
  5. Réponses: 2
    Dernier message: 29/09/2005, 14h00

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