Partage
  • Partager sur Facebook
  • Partager sur Twitter

Traduire le contenu d'un tableau en variables

Sujet résolu
    8 septembre 2019 à 16:09:12

    Bonjour à toutes et à tous,

    J'ai créé un formulaire permettant à un utilisateur de renseigner certaines informations pour obtenir un devis de traiteur, et mon problème survient lorsque je tente d'enregistrer dans ma base de donnée, des valeurs issues de checkboxs.

    En effet, l'utilisateur peut saisir certains types de régimes (exemple : végétalien, sans porc etc), et son choix peut-être multiple (d'où l'usage de checkboxs).

    Pour autant, il peut ne vouloir sélectionner que deux régimes sur trois voir aucun (cette partie est facultative), mais en tout cas pour ma part, j'ai forcément besoin d'enregistrer son choix en base, pour que l'administrateur (le traiteur) puisse lire ses demandes de devis correctement du côté administrateur.

    Du coup, j'ai prévu 3 colonnes dans ma base de données (regime1, regime2, regime3), et j'ai essayé d'enregistrer les valeurs checkboxs dans un tableau pour finalement le parcourir et générer des variables que je pourrais enregistrer par la suite.

    Peut-être n'est-ce finalement pas ce qu'il faut faire ?

    La partie concernée dans le formulaire :

    <div class="form-group col-8 offset-2">
    	<div class="d-flex justify-content-between mb-5">
    		<div class="form-check">
    		  	<input class="form-check-input" name="options_regimes[]" type="checkbox" value="vegetalien" id="vegetalien">
    		  	<label class="form-check-label" for="vegetalien">100% Végétalien</label>
    		</div>
    		<div class="form-check">
    		 	<input class="form-check-input" name="options_regimes[]" type="checkbox" value="vegetarien" id="vegetarien">
    		  	<label class="form-check-label" for="vegetarien">100% Végétarien</label>
    		</div>
    		<div class="form-check">
    		 	<input class="form-check-input" name="options_regimes[]" type="checkbox" value="sansporc" id="sansporc">
    		  	<label class="form-check-label" for="sansporc">100% Sans porc</label>
    		</div>
    	</div>
    	<label for="allergies">Autre demande particulière (Facultatif)</label>
    	<textarea name="allergies" id="allergies" class="form-control" placeholder="Exemple : Allergies"></textarea>
    	<div class="d-flex justify-content-between mt-5">
    		<button type="button" name="btn_regimes_details_previous" id="btn_regimes_details_previous" class="btn btn-outline-secondary"><i class="fa fa-chevron-left"></i> Redéfinir le nombre de convives</button>
    		<button type="button" name="btn_regimes_details" id="btn_regimes_details_next" class="btn btn-primary">Mon budget <i class="fa fa-chevron-right"></i></button>
    	</div>
    </div>


    Je renvoie les données par AJAX vers le fichier devis-form-traitement.php :

    <?php
    session_start();
    function insertDevis(){
    	try
    	{
    		$bdd = new PDO('mysql:host=localhost;dbname=sylvie;charset=utf8', 'root', 'motdepasse');
    	} catch (PDOException $e) {
    	    die('Erreur : ' . $e->getMessage());
    	}
    	$civilite = $_POST['options_genre'];
    	$nom = $_POST['name'];
    	$prenom = $_POST['firstname'];
    	$email = $_POST['email'];
    	$telephone = $_POST['telephone'];
    	$evenement = $_SESSION['event'];
    	$dateE = $_POST['date'];
    	$heureE = $_POST['heure'];
    	$convives = $_POST['convives'];
    	$lieu = $_POST['lieu'];
    	$divers = $_POST['indications'];
    	$req = $bdd->prepare('INSERT INTO lm_devis (civilite, nom, prenom, email, telephone, evenement, dateE, heureE, convives, lieu, regime1, regime2, regime3, divers) VALUES (:civilite, :nom, :prenom, :email, :telephone, :evenement, :dateE, :heureE, :convives, :lieu, :regime1, :regime2, :regime3, :divers)');
    	$req->execute(array(
    		'civilite' => $civilite,
    		'nom' => $nom,
    		'prenom' => $prenom,
    		'email' => $email,
    		'telephone' => $telephone,
    		'evenement' => $evenement,
    		'dateE' => $dateE,
    		'heureE' => $heureE,
    		'convives' => $convives,
    		'lieu' => $lieu,
    		'regime1' => $regime1,
    		'regime2' => $regime2,
    		'regime3' => $regime3,
    		'divers' => $divers
    	));
    }
    $message = "";
    if(!isset($_POST['lieu']) && !isset($_POST['date']) && !isset($_POST['heure']) && !isset($_POST['convives']) && !isset($_POST['options_budget']) && !isset($_POST['budgetOption']) && !isset($_POST['options_genre']) && !isset($_POST['name']) && !isset($_POST['email'])){
    	$message = "Votre saisie est incorrecte, veuillez vérifier si :
    	- le lieu de l'événement a été saisi,
    	- la date et l'heure sont corrects,
    	- le nombre de convives est au nombre minimum de 15,
    	- votre budget a bien été défini,
    	- votre civilité et votre nom sont au moins renseignés,
    	- si votre email a bien été renseigné.";
    }
    else{
    	if(isset($_POST['allergies']) && empty($_POST['allergies']) || isset($_POST['firstname']) && empty($_POST['firstname']) || isset($_POST['telephone']) && empty($_POST['telephone']) || isset($_POST['indications']) && empty($_POST['indications'])){
    		$_POST['allergies'] == "Aucune allergie définie";
    		$_POST['firstname'] == "NULL";
    		$_POST['telephone'] == "NULL";
    		$_POST['indications'] == "Aucune préférences de contact n'a été renseigné";
    	}
    	if(isset($_POST['options_regimes']))
    	{
    		$tableauRegimes = array();
    		foreach($_POST['options_regimes'] as $valeur){
    			$tableauRegimes[] = $valeur;
    		}
    		$regime1 = $tableauRegimes[0];
    		$regime2 = $tableauRegimes[1];
    		$regime3 = $tableauRegimes[2];
    	}
    	insertDevis();
    	$message = "Super";
    }
    echo $message;
    ?>

    J'ai le message "Super", mais rien n'est enregistré dans ma base car j'ai les erreurs suivantes :

    Notice: Undefined variable: regime1 in D:\Lucie\Logiciels\wamp64\www\sylvie\wp-content\themes\sylvietraiteur\parts\devis-form-traitement.php on line 33 

    Notice: Undefined variable: regime2 in D:\Lucie\Logiciels\wamp64\www\sylvie\wp-content\themes\sylvietraiteur\parts\devis-form-traitement.php on line 34 

    Notice: Undefined variable: regime3 in D:\Lucie\Logiciels\wamp64\www\sylvie\wp-content\themes\sylvietraiteur\parts\devis-form-traitement.php on line 35 

    Je suis sûre que mon problème intervient dans ma façon de récupérer sous forme de variables, le contenu de mon tableau $tableauRegimes, mais honnêtemment là je ne trouve pas... S'il quelqu'un peut m'aider s'il vous plaît ?

    • Partager sur Facebook
    • Partager sur Twitter
      9 septembre 2019 à 5:58:20

      Bonjour,

      Pas facile à lire ou à voir le numéro des lignes .... il faudrait que tu utilises le bouton marqué </> pour poster ton code.

      Néanmoins, il me me semble qu'il y a un problème pour ta requête d'insert où tu indiques les marqueurs et variables $regimex alors qu'elles ne sont pas définies à ce moment là.

      A+

      • Partager sur Facebook
      • Partager sur Twitter
        9 septembre 2019 à 8:26:59

        En fait au vu du fait que j'ai le bug de pas pouvoir cliquer sur signaler, citer sur les messages de ce topic, je dirais qu'il a bien cliquer et utilisé le bouton code mais que c'est le script OCR qui est planté sur cette page

        ça m'arrivent de temps en temps et je sais pas ce qui provoque ça niveau code.

        D'ailleurs je ne peux même pas éditer moi-même mon message donc désolé, s'il y a une faute ^^

        • Partager sur Facebook
        • Partager sur Twitter
          9 septembre 2019 à 19:15:03

          @monkey3d comme le dit quenti77 il doit y avoir un bug car c’est ce que j’ai fais.

          Ensuite, tu veux dire que je devrais déclarer mes variables au débuts ? Il faudrait que j’essaie, effectivement, la déclarer comme nulle au départ m’aiderait peut-être, mais ma façon de faire avec le tableau ne te choque pas ? 

          Car en fait je me demandais comment incrémenter le chiffre d’une variable (ex : regime$i++ devient regime2) en fonction du nombre de données comprises dans d’un tableau (et la valeur de ma variable régime1 serait en fait la donnée 1 du tableau et ainsi de suite).

          Je me disais c’est simple comme bonjour mais visiblement..

          • Partager sur Facebook
          • Partager sur Twitter
            9 septembre 2019 à 20:05:26

            ok ... bug OC :p

            Le message d'erreur est clair : variable indéfinie lors de l'appel.

            Ce que tu veux faire en php s'appelle des variables dynamiques : https://www.php.net/manual/fr/language.variables.variable.php

            A+

            • Partager sur Facebook
            • Partager sur Twitter
              9 septembre 2019 à 20:44:34

              Salut,

              Tes variables $regime 1 à 3 sont déclaré  l'exterieur de ta fonction insertDevis donc inaccessible (Cf : Porté des variables),

              Pour y avoir acces soit tu fait ton traitement de la création de ses variables dans ta fonction soit tu les passe en paramètres

               ?

              • Partager sur Facebook
              • Partager sur Twitter
              Infoxp ici depuis 2007
                11 septembre 2019 à 19:39:54

                Bonsoir tout le monde,

                J'ai appliqué vos recommandations et ça ne fonctionne toujours pas :(

                C'est-à-dire que j'ai déclaré mes variables $regime (1, 2, et 3) avant l'insert, et dans ma boucle for, en fonction de la taille de mon tableau $tableauRegimes, je déclare une variable dynamique tout en lui affectant la valeur appropriée ($regime1 = $tableauRegimes[1]), cependant, ça ne fonctionne pas.. ou ça n'a pas l'air, car ma page charge en continu, et rien ne se passe, je n'ai aucun message d'erreur.

                Mon code PHP (en espérant que ça ne bug pas) :

                <?php
                session_start();
                function insertDevis(){
                	try
                	{
                		$bdd = new PDO('mysql:host=localhost;dbname=sylvie;charset=utf8', 'root', 'motdepasse');
                	} catch (PDOException $e) {
                	    die('Erreur : ' . $e->getMessage());
                	}
                	$civilite = $_POST['options_genre'];
                	$nom = $_POST['name'];
                	$prenom = $_POST['firstname'];
                	$email = $_POST['email'];
                	$telephone = $_POST['telephone'];
                	$evenement = $_SESSION['event'];
                	$dateE = $_POST['date'];
                	$heureE = $_POST['heure'];
                	$convives = $_POST['convives'];
                	$lieu = $_POST['lieu'];
                	$divers = $_POST['indications'];
                	$regime1 = '';
                	$regime2 = '';
                	$regime3 = '';
                	$req = $bdd->prepare('INSERT INTO lm_devis (civilite, nom, prenom, email, telephone, evenement, dateE, heureE, convives, lieu, regime1, regime2, regime3, divers) VALUES (:civilite, :nom, :prenom, :email, :telephone, :evenement, :dateE, :heureE, :convives, :lieu, :regime1, :regime2, :regime3, :divers)');
                	$req->execute(array(
                		'civilite' => $civilite,
                		'nom' => $nom,
                		'prenom' => $prenom,
                		'email' => $email,
                		'telephone' => $telephone,
                		'evenement' => $evenement,
                		'dateE' => $dateE,
                		'heureE' => $heureE,
                		'convives' => $convives,
                		'lieu' => $lieu,
                		'regime1' => $regime1,
                		'regime2' => $regime2,
                		'regime3' => $regime3,
                		'divers' => $divers
                	));
                }
                $message = "";
                if(!isset($_POST['lieu']) && !isset($_POST['date']) && !isset($_POST['heure']) && !isset($_POST['convives']) && !isset($_POST['options_budget']) && !isset($_POST['budgetOption']) && !isset($_POST['options_genre']) && !isset($_POST['name']) && !isset($_POST['email'])){
                	$message = "Votre saisie est incorrecte, veuillez vérifier si :
                	- le lieu de l'événement a été saisi,
                	- la date et l'heure sont corrects,
                	- le nombre de convives est au nombre minimum de 15,
                	- votre budget a bien été défini,
                	- votre civilité et votre nom sont au moins renseignés,
                	- si votre email a bien été renseigné.";
                }
                else{
                	if(isset($_POST['allergies']) && empty($_POST['allergies']) || isset($_POST['firstname']) && empty($_POST['firstname']) || isset($_POST['telephone']) && empty($_POST['telephone']) || isset($_POST['indications']) && empty($_POST['indications'])){
                		$_POST['allergies'] == "Aucune allergie définie";
                		$_POST['firstname'] == "NULL";
                		$_POST['telephone'] == "NULL";
                		$_POST['indications'] == "Aucune préférences de contact n'a été renseigné";
                	}
                	if(isset($_POST['options_regimes']))
                	{
                		$tableauRegimes = array();
                		$var = 'regime';
                		foreach($_POST['options_regimes'] as $valeur){
                			$tableauRegimes[] = $valeur;
                		}
                		$nbrRegime = sizeof($tableauRegimes);
                		for ($i=0; $i<$nbrRegime; $i++){
                			${$var}.$i = $tableauRegimes[$i];
                		}
                	}
                	insertDevis();
                	$message = "Super";
                }
                echo $message;
                ?>


                Je sais que ma requête INSERT fonctionne autrement, car dans ma boucle for, j'avais essayé ça juste avant, et forcément, mes variables $regime1, et $regime2 étaient enregistrés dans ma bdd, mais vides, puisque je les ai déclarés ainsi au tout début :/

                if(isset($_POST['options_regimes']))
                {
                	$tableauRegimes = array();
                	foreach($_POST['options_regimes'] as $valeur){
                		$tableauRegimes[] = $valeur;
                	}
                	$nbrRegime = sizeof($tableauRegimes);
                	for ($i=0; $i<$nbrRegime; $i++){
                		$dynamique = 'regime'.$i;
                		echo $dynamique;
                	}
                }
                insertDevis();
                $message = "Super";


                Ai-je fait une bêtise ? :/

                • Partager sur Facebook
                • Partager sur Twitter
                  13 septembre 2019 à 10:09:41

                  Bonjour,

                  Je prends le train en route mais pour moi il y a déjà un problème avec cette condition :

                  if(isset($_POST['allergies']) && empty($_POST['allergies']) || isset($_POST['firstname']) && empty($_POST['firstname']) || isset($_POST['telephone']) && empty($_POST['telephone']) || isset($_POST['indications']) && empty($_POST['indications']))

                  Pas de parenthèses entre les AND et les OR, tu es vraiment sure de ton algo ?

                  • Partager sur Facebook
                  • Partager sur Twitter
                    13 septembre 2019 à 13:54:12

                    Bonjour à tous,

                    En fait @philodick, la condition ne me servait à rien. J'avais un doute à l'origine, mais j'en ai la confirmation au regard des enregistrements faits dans ma bdd.

                    Et j'ai corrigé mon problème.

                    Au début, j'ai fais :

                    $civilite = $_POST['options_genre'];
                    $nom = $_POST['name'];
                    $prenom = $_POST['firstname'];
                    $email = $_POST['email'];
                    $telephone = $_POST['telephone'];
                    $evenement = $_SESSION['event'];
                    $dateE = $_POST['date'];
                    $heureE = $_POST['heure'];
                    $convives = $_POST['convives'];
                    $lieu = $_POST['lieu'];
                    $budget = $_POST['budgetOption']." ".$_POST['options_budget'];
                    if(!isset($regime1)){$regime1 = '';}
                    if(!isset($regime2)){$regime2 = '';}
                    if(!isset($regime3)){$regime3 = '';}
                    $allergies = $_POST['allergies'];
                    $divers = $_POST['indications'];

                    Ou $regime1, $regime2, $regime3 sont enregistrés comme vide si aucun régime spécifique n'a été renseigné et plus loin pour l'affectation des données tableaux à mes variables générées (selon le nombre de données dans le tableau) j'ai fais :

                    else{
                    	if(isset($_POST['options_regimes'])){
                    		$tableauRegimes = array();
                    		foreach($_POST['options_regimes'] as $valeur){
                    			$tableauRegimes[] = $valeur;
                    		}
                    		$nbrRegime = sizeof($tableauRegimes);
                    		for ($i=0; $i<$nbrRegime; $i++){
                    			$dynamique = 'regime'.$i;
                    			${$dynamique} = $tableauRegimes[$i];
                    		}
                    		insertDevis();
                    		$message = "Super";
                    	}
                    }

                    Les variables dynamiques m'ont bien aidées, j'ignorais qu'on pouvait faire comme ça ;)

                    Puis il y avait quelques étourderies au niveau bdd, j'avais oublié des champs.



                    • Partager sur Facebook
                    • Partager sur Twitter
                      13 septembre 2019 à 14:52:34

                      Oui c'est très intéressant pour résoudre certains problèmes les variables dynamiques. Je m'en sers assez souvent. :D

                      Si tout est ok, passe en résolu.

                      Bye

                      • Partager sur Facebook
                      • Partager sur Twitter
                        13 septembre 2019 à 15:34:17

                        @monkey3d je n'ai pas pu modifier mon post précédent mais j'ai malheureusement parlait trop vite car en fait ce n'est pas bon :/


                        Rien n'est enregistré dans ma base de données, même quand j'ai choisi un régime...

                        • Partager sur Facebook
                        • Partager sur Twitter
                          17 septembre 2019 à 18:18:11

                          Comme j'ai dit revois la porté des variables ;)
                          • Partager sur Facebook
                          • Partager sur Twitter
                          Infoxp ici depuis 2007
                            17 septembre 2019 à 19:37:17

                            Bonsoir,

                            Ben désolé je dois pas être douée, j'y ai regardé mais ça ne marche toujours pas même avec la portée des variables ^^'

                            En fait je créé une variable dynamique ${$dynamique.$i} = $tableauRegimes[$i]; dans ma boucle for tout en bas et je créé des variables globales de ces variables générées dans ma function insertDevis()
                            Mais en fait mes variables ont l'air d'être vidées quand elles passent dans ma boucle ^^'

                            Mon code :

                            <?php
                            session_start();
                            $message = '';
                            function insertDevis(){
                            	try
                            	{
                            		$bdd = new PDO('mysql:host=localhost;dbname=sylvie;charset=utf8', 'root', 'motdepasse');
                            		$bdd->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_WARNING);
                                    $bdd->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE,PDO::FETCH_OBJ);
                            	} catch (PDOException $e) {
                            	    die('Erreur : ' . $e->getMessage());
                            	}
                            
                            	$civilite = $_POST['options_genre'];
                            	$nom = $_POST['name'];
                            	$prenom = $_POST['firstname'];
                            	$email = $_POST['email'];
                            	$telephone = $_POST['telephone'];
                            	$horaires_contact = $_POST['indications'];
                            	$evenement = $_SESSION['event'];
                            	$date_evenement = $_POST['date'];
                            	$heure_evenement = $_POST['heure'];
                            	$convives = $_POST['convives'];
                            	$lieu = $_POST['lieu'];
                            	$budget = $_POST['budgetOption']." ".$_POST['options_budget'];
                            	global $regime1, $regime2, $regime3;
                            	$regimes = $regime1.' '.$regime2.' '.$regime3;
                            	$allergies = $_POST['allergies'];
                            
                            	$req = $bdd->prepare('INSERT INTO lm_devis (civilite, nom, prenom, email, telephone, horaires_contact, evenement, date_evenement, heure_evenement, convives, lieu, budget) VALUES (:civilite, :nom, :prenom, :email, :telephone, :horaires_contact, :evenement, :date_evenement, :heure_evenement, :convives, :lieu, :budget)');
                            	$req->execute(array(
                            		'civilite' => $civilite,
                            		'nom' => $nom,
                            		'prenom' => $prenom,
                            		'email' => $email,
                            		'telephone' => $telephone,
                            		'horaires_contact' => $horaires_contact,
                            		'evenement' => $evenement,
                            		'date_evenement' => $date_evenement,
                            		'heure_evenement' => $heure_evenement,
                            		'convives' => $convives,
                            		'lieu' => $lieu,
                            		'budget' => $budget
                            	));
                            	$id = $bdd->lastInsertId();
                            	$req2 = $bdd->prepare('INSERT INTO lm_devis_regimes (devis, regimes, allergies) VALUES (:devis, :regimes, :allergies)');
                            	$req2->execute(array(
                            		'devis' => $id,
                            		'regimes' => $regime1." ".$regime2." ".$regime3,
                            		'allergies' => $allergies
                            	));
                            
                            }
                            if(!isset($_POST['lieu']) && !isset($_POST['date']) && !isset($_POST['heure']) && !isset($_POST['convives']) && !isset($_POST['options_budget']) && !isset($_POST['budgetOption']) && !isset($_POST['options_genre']) && !isset($_POST['name']) && !isset($_POST['email'])){
                            	$message = "Votre saisie est incorrecte, veuillez vérifier si :
                            	- le lieu de l'événement a été saisi,
                            	- la date et l'heure sont corrects,
                            	- le nombre de convives est au minimum de 15,
                            	- votre budget a bien été défini,
                            	- votre civilité et votre nom sont au moins renseignés,
                            	- un moyen de contact a bien été renseigné.";
                            }
                            else{
                            	if(isset($_POST['options_regimes'])){
                            		$tableauRegimes = array();
                            		foreach($_POST['options_regimes'] as $valeur){
                            			$tableauRegimes[] = $valeur;
                            		}
                            		$nbrRegime = sizeof($tableauRegimes);
                            		$regimes = '';
                            		for ($i=0; $i<$nbrRegime; $i++){
                            			$dynamique = 'regime'.$i;
                            			${$dynamique.$i} = $tableauRegimes[$i];
                            		}
                            		insertDevis();
                            		$message = "Super";
                            	}
                            }
                            echo $message;
                            ?>



                            • Partager sur Facebook
                            • Partager sur Twitter
                              10 octobre 2019 à 20:28:04

                              Pour comprendre la portée des variables voici cette exemple :

                              $foo = "Foo";
                              
                              function DireFooBar(){
                                   echo $foo . "Bar";
                              }

                              ici $foo n'existe pas dans la porté interne de la fonction donc tu aura un 'undefined variable $foo'

                              Pareil si tu fait

                              function FooBar(){
                                 $foobar = "FooBar";
                              }
                              FooBar();
                              echo $foobar; //Undefined





                              • Partager sur Facebook
                              • Partager sur Twitter
                              Infoxp ici depuis 2007

                              Traduire le contenu d'un tableau en variables

                              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                              • Editeur
                              • Markdown