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 :

[Résolu] Erreur : Undefined variable dans un exec INSERT INTO


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Homme Profil pro
    Consultant fonctionnel
    Inscrit en
    Mars 2016
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant fonctionnel

    Informations forums :
    Inscription : Mars 2016
    Messages : 9
    Par défaut [Résolu] Erreur : Undefined variable dans un exec INSERT INTO
    Bonjour !

    J'ai décidé de créer un site web pour mettre des recettes de cuisine en ligne avec ma mère en utilisant php/MySQL, seulement j'ai un blocage :

    Je souhaite ajouter une nouvelle recette grâce un formulaire qui est censé créer une entrée dans la table "recette" de ma base "recettes_defaye".

    J'ai le formulaire suivant sur la première page :
    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
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    		<form method="post" action="ajout_recette.php" autocomplete="off">
    			<p>
    				<label for="utilisateur">Prénom :</label>
    					<select name="utilisateur" id="utilisateur">
    						<?php
    							try
    							{
    								// On se connecte à MySQL
    								$bdd = new PDO('mysql:host=localhost;dbname=recettes_defaye;charset=utf8', 'root', '');
    							}
    							catch(Exception $e)
    							{
    								// En cas d'erreur, on affiche un message et on arrête tout
    									die('Erreur : '.$e->getMessage());
    							}
    							$reponse = $bdd->query('SELECT prenom FROM user');
    							// On affiche chaque entrée une à une
    							while ($donnees = $reponse->fetch())
    							{
    							?>
    						   <option value="<?php echo $donnees["prenom"] ; ?>"><?php echo $donnees["prenom"] ; ?></option>
    							<?php
    							}
    							$reponse->closeCursor(); // Termine le traitement de la requête
    							?>
    					</select>
    			</p>
    			<p>
    				<label for="titre">Titre</label> : <input type="text" name="titre" id="titre" />
    			</p>
    			<p>
    				<label for="type">Type :</label>
    					<select name="type" id="type">
    						<?php
    							try
    							{
    								// On se connecte à MySQL
    								$bdd = new PDO('mysql:host=localhost;dbname=recettes_defaye;charset=utf8', 'root', '');
    							}
    							catch(Exception $e)
    							{
    								// En cas d'erreur, on affiche un message et on arrête tout
    									die('Erreur : '.$e->getMessage());
    							}
    							$reponse = $bdd->query('SELECT nomtype FROM type');
    							// On affiche chaque entrée une à une
    							while ($donnees = $reponse->fetch())
    							{
    							?>
    							<option value="<?php echo $donnees["nomtype"] ; ?>"><?php echo $donnees["nomtype"] ; ?></option>
    							<?php
    							}
    							$reponse->closeCursor(); // Termine le traitement de la requête
    						?>
     
    					</select>
    			</p>
    			<p>
    			<text
    				<label for="ingredients">Ingrédients</label> : <textarea name="ingredients" id="ingredients"></textarea>	
    			</p>
    			<p>
    				<label for="preparation">Préparation</label> : <textarea type="textearea" name="preparation" id="preparation"></textarea>	
    			</p>
    			<p>
    				<label for="attention">Points d'attention</label> : <textarea type="textearea" name="attention" id="attention"></textarea>
    			</p>
    			<p>
    				<label for="portions">Nombre de portions</label> : <input type="number" name="portions" id="portions" min="0" max="300" step="1" />	
    			</p>
    			<p>
    				<label for="temps">Durée (en minutes)</label> : <input type="number" name="temps" id="temps" min="0" max="300" step="1" />	
    			</p>
    			<p>
    				<label for="note">Note sur 5</label> : <input type="number" name="note" id="note" min="0" max="5" step="0.5" />	
    			</p>
    			<input type="submit" value="Valider" name="bouton" />		
    		</form>
    Sur la seconde page, j'ai l'erreur Undefined variable lorsque je fais :
    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
    	if (isset($_POST['type'])) { $idtype = $_POST['type']; }
    	if (isset($_POST['utilisateur'])) { $iduser = $_POST['utilisateur']; }
    	if (isset($_POST['titre'])) { $titre = $_POST['titre']; }
    	if (isset($_POST['portions'])) { $portions = $_POST['portions']; }
    	if (isset($_POST['ingredients'])) { $ingredients = $_POST['ingredients']; }
    	if (isset($_POST['preparation'])) { $preparation = $_POST['preparation']; }
    	if (isset($_POST['attention'])) { $attention = $_POST['attention']; }
    	if (isset($_POST['note'])) { $note = $_POST['note']; }
    	if (isset($_POST['temps'])) { $temps = $_POST['temps']; }
     
    	try
    	{
    		// On se connecte à MySQL
    		$bdd = new PDO('mysql:host=localhost;dbname=recettes_defaye;charset=utf8', 'root', '');
    	}
    	catch(Exception $e)
    	{
    		// En cas d'erreur, on affiche un message et on arrête tout
    			die('Erreur : '.$e->getMessage());
    	}
    	$bdd->exec("INSERT INTO recette(idtype, iduser, titre, portions, ingredients, preparation, attention, note, temps) VALUES($idtype, $iduser, $titre, $portions, $ingredients, $preparation, $attention, $note, $temps)");
     
     
    ?>
    Je précise que lorsque je fais des echo ou var_dump sur les variables $idtype, $iduser, $titre, $portions, $ingredients, $preparation, $attention, $note, $temps : il me renvoie bien les valeurs attendues.

    Est-ce que vous savez d'où peut venir le problème ?

    Merci par avance

  2. #2
    Expert confirmé
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 099
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 099
    Par défaut
    Je dirais qu’au moins une des variables que tu as testées est indéfinie, mais tu ne t’en es pas rendu compte car tu les as toutes testées en même temps.
    Le problème est que tu ne prévois pas de valeurs par défaut quand la donnée POST est absente. Je ferais quelque chose dans ce goût-là :
    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    if (isset($_POST['type'])) {
        $idtype = $_POST['type'];
    }
    else {
        $idtype = '0'; // valeur par défaut
    }

    Plus important : ta requête n’est pas protégée. Normalement on ne doit pas mettre de variables PHP dans une requête SQL. Tu peux la réécrire sous forme d’une requête préparée :
    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
    $pdo_statement = $bdd->prepare('INSERT INTO
        recette(idtype,  iduser,  titre,  portions,  ingredients,  preparation,  attention,  note,  temps)
        VALUES(:idtype, :iduser, :titre, :portions, :ingredients, :preparation, :attention, :note, :temps)');
     
    $pdo_statement->execute([
        ':idtype'      => $idtype,
        ':iduser'      => $iduser,
        ':titre'       => $titre,
        ':portions'    => $portions,
        ':ingredients' => $ingredients,
        ':preparation' => $preparation,
        ':attention'   => $attention,
        ':note'        => $note,
        ':temps'       => $temps,
    ]);

    Ensuite tu appelles $pdo_statement->fetch() ou ses variantes de la même façon qu’avant.
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  3. #3
    Membre régulier
    Homme Profil pro
    Consultant fonctionnel
    Inscrit en
    Mars 2016
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant fonctionnel

    Informations forums :
    Inscription : Mars 2016
    Messages : 9
    Par défaut
    Merci pour ta réponse. En fait, je crois que l'erreur Undefined variable était liée à une autre partie de mon code... Néanmoins, j'ai fait la modif pour affecter 0 aux variables au cas où les champs n'auraient pas été renseignés dans mon formulaire.

    J'ai aussi fait la modification pour passer par un prepare avant d'exécuter la requête sql. Le problème c'est que je n'ai plus de message d'erreur, mais ma base de données ne se remplit pas pour autant... Voici mon code :

    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
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    	<?php
     
    	if (isset($_POST['type'])) {
    	$idtype = $_POST['type'];
    	}
    	else {
    		$idtype = '0'; // valeur par défaut
    	}
     
    	if (isset($_POST['utilisateur'])) {
    		$iduser = $_POST['utilisateur'];
    	}
    	else {
    		$iduser = '0'; // valeur par défaut
    	}
     
    	if (isset($_POST['titre'])) {
    		$titre = $_POST['titre'];
    	}
    	else {
    		$titre = '0'; // valeur par défaut
    	}
     
    	if (isset($_POST['portions'])) {
    		$portions = $_POST['portions'];
    	}
    	else {
    		$portions = '0'; // valeur par défaut
    	}
     
    	if (isset($_POST['ingredients'])) {
    		$ingredients = $_POST['ingredients'];
    	}
    	else {
    		$ingredients = '0'; // valeur par défaut
    	}
     
    	if (isset($_POST['preparation'])) {
    		$preparation = $_POST['preparation'];
    	}
    	else {
    		$preparation = '0'; // valeur par défaut
    	}
     
    	if (isset($_POST['attention'])) {
    		$attention = $_POST['attention'];
    	}
    	else {
    		$attention = '0'; // valeur par défaut
    	}
     
    	if (isset($_POST['note'])) {
    		$note = $_POST['note'];
    	}
    	else {
    		$note = '0'; // valeur par défaut
    	}
     
    	if (isset($_POST['temps'])) {
    		$temps = $_POST['temps'];
    	}
    	else {
    		$temps = '0'; // valeur par défaut
    	}
     
    		echo "$idtype <br/>";
    		echo "$iduser <br/>";
    		echo "$titre <br/>";
    		echo "$portions <br/>";
    		echo "$ingredients <br/>";
    		echo "$preparation <br/>";
    		echo "$attention <br/>";
    		echo "$note <br/>";
    		echo "$temps <br/>";
    		echo "  <br/> Je vais bien, tout est défini :)";
     
    		try
    		{
    			// On se connecte à MySQL
    			$bdd = new PDO('mysql:host=localhost;dbname=recettes_defaye;charset=utf8', 'root', '');
    		}
    		catch(Exception $e)
    		{
    			// En cas d'erreur, on affiche un message et on arrête tout
    				die('Erreur : '.$e->getMessage());
    		}
    		$pdo_statement = $bdd->prepare('INSERT INTO
    			recette(idtype,  iduser,  titre,  portions,  ingredients,  preparation,  attention,  note,  temps)
    			VALUES(:idtype, :iduser, :titre, :portions, :ingredients, :preparation, :attention, :note, :temps)');
     
     
    		$pdo_statement->execute([
    			':idtype'      => $idtype,
    			':iduser'      => $iduser,
    			':titre'       => $titre,
    			':portions'    => $portions,
    			':ingredients' => $ingredients,
    			':preparation' => $preparation,
    			':attention'   => $attention,
    			':note'        => $note,
    			':temps'       => $temps,]);
     
    	?>
    Est-ce qu'il manque quelque chose ? Je n'ai pas compris ce que tu voulais dire par "Ensuite tu appelles $pdo_statement->fetch() ou ses variantes de la même façon qu’avant."

  4. #4
    Membre Expert
    Avatar de badaze
    Homme Profil pro
    Chef de projets info
    Inscrit en
    Septembre 2002
    Messages
    1 412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets info
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2002
    Messages : 1 412
    Par défaut
    Un conseil pour rendre ton code plus lisible.
    Initialise toutes les variables ensemble et au tout début.
    Ça t’évitera tous ces else.

  5. #5
    Membre régulier
    Homme Profil pro
    Consultant fonctionnel
    Inscrit en
    Mars 2016
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant fonctionnel

    Informations forums :
    Inscription : Mars 2016
    Messages : 9
    Par défaut
    Done. Ca me fait gagner un paquet de lignes effectivement!

  6. #6
    Expert confirmé
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 099
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 099
    Par défaut
    Citation Envoyé par yellowduff Voir le message
    Je n'ai pas compris ce que tu voulais dire par "Ensuite tu appelles $pdo_statement->fetch() ou ses variantes de la même façon qu’avant."
    Désolé si je t’ai induit en erreur. En l’occurence la requête est INSERT donc il n’y a pas de résultats à traiter. Ce que je voulais dire, c’est que lorsque tu traites les résultats d’une requête SELECT, la méthode fetch s’utilise de la même façon, que la requête soit préparée ou non.

    Attention à tes valeurs par défaut, il faut être un peu malin. Par exemple, une valeur de titre par défaut pourrait être "recette sans titre". À toi de voir si l’absence d’une valeur pertinente est acceptable dans ton système (est-ce qu’une recette qui n’a pas de titre peut être enregistrée dans la base de données) ou si tu dois renvoyer une erreur à l’utilisateur.
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  7. #7
    Membre régulier
    Homme Profil pro
    Consultant fonctionnel
    Inscrit en
    Mars 2016
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant fonctionnel

    Informations forums :
    Inscription : Mars 2016
    Messages : 9
    Par défaut
    Effectivement, c'est très juste. J'ai apporté des modifs pour que les valeurs par défaut soient plus cohérentes.

    Par contre je reste bloqué avec le même problème : je n'ai pas de ligne insérée dans ma base de données.... Comment pourrais-je savoir d'où vient le problème ? Est-ce qu'il y a des logs qui peuvent être consultés sur PhpMyAdmin ?

    Je vous remets mon code :
    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
    	<?php
     
    		$idtype = ''; // valeur par défaut
    		$iduser = ''; // valeur par défaut
    		$titre = 'Recette sans titre'; // valeur par défaut
    		$portions = '2'; // valeur par défaut
    		$ingredients = ''; // valeur par défaut
    		$preparation = ''; // valeur par défaut
    		$attention = ''; // valeur par défaut
    		$note = '0'; // valeur par défaut
    		$temps = '0'; // valeur par défaut
     
    		if (isset($_POST['type'])) {$idtype = $_POST['type'];}
    		if (isset($_POST['utilisateur'])) {$iduser = $_POST['utilisateur'];}
    		if (isset($_POST['titre'])) {$titre = $_POST['titre'];}
    		if (isset($_POST['portions'])) {$portions = $_POST['portions'];}
    		if (isset($_POST['ingredients'])) {$ingredients = $_POST['ingredients'];}
    		if (isset($_POST['preparation'])) {$preparation = $_POST['preparation'];}
    		if (isset($_POST['attention'])) {$attention = $_POST['attention'];}
    		if (isset($_POST['note'])) {$note = $_POST['note'];}
    		if (isset($_POST['temps'])) {$temps = $_POST['temps'];}
     
    		try
    		{
    			// On se connecte à MySQL
    			$bdd = new PDO('mysql:host=localhost;dbname=recettes_defaye;charset=utf8', 'root', '');
    		}
    		catch(Exception $e)
    		{
    			// En cas d'erreur, on affiche un message et on arrête tout
    				die('Erreur : '.$e->getMessage());
    		}
    		$pdo_statement = $bdd->prepare('INSERT INTO
    			recette(idtype,  iduser,  titre,  portions,  ingredients,  preparation,  attention,  note,  temps)
    			VALUES(:idtype, :iduser, :titre, :portions, :ingredients, :preparation, :attention, :note, :temps)');
     
    		$pdo_statement->execute([
    			':idtype'      => $idtype,
    			':iduser'      => $iduser,
    			':titre'       => $titre,
    			':portions'    => $portions,
    			':ingredients' => $ingredients,
    			':preparation' => $preparation,
    			':attention'   => $attention,
    			':note'        => $note,
    			':temps'       => $temps,]);		
    	?>

  8. #8
    Membre régulier
    Homme Profil pro
    Consultant fonctionnel
    Inscrit en
    Mars 2016
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant fonctionnel

    Informations forums :
    Inscription : Mars 2016
    Messages : 9
    Par défaut
    J'ai fini par trouver d'où venait le problème : J'essayais de mettre la mauvaise variable dans le mauvais champs.
    J'essayais de mettre le champs nom_type (le type de plat) dans une entrée de recette, alors que le champs de ma table recette était id_type (un INT et non pas un VARCHAR)....

    Merci encore pour l'aide !

  9. #9
    Expert confirmé
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 099
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 099
    Par défaut
    Ok

    Une astuce qui te sera toujours utile pour la suite : pour déboguer tes requêtes SQL, ajoute ceci après la création de ton PDO :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    (Voir gestion des erreurs PDO)
    Pour voir si une requête sans résultat (typiquement INSERT) a réussi ou non, tu peux aussi examiner la valeur de retour de execute. Ce sera false s’il y a eu un problème.
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

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

Discussions similaires

  1. [AC-2007] Erreur de syntaxe dans l'instruction INSERT INTO
    Par DébutantAccess dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 28/02/2013, 18h45
  2. OleDbException -{"Erreur de syntaxe dans l'instruction INSERT INTO."}
    Par daniel.moreda dans le forum Framework .NET
    Réponses: 1
    Dernier message: 27/09/2011, 16h38
  3. Erreur de syntaxe dans l'instruction INSERT INTO
    Par doolar dans le forum Bases de données
    Réponses: 3
    Dernier message: 04/05/2008, 15h37
  4. Erreur de syntaxe dans l'instruction INSERT INTO
    Par logiciel_const dans le forum Bases de données
    Réponses: 8
    Dernier message: 19/03/2008, 10h57
  5. erreur de syntaxe dans l'instructiuon insert into
    Par greg64 dans le forum Access
    Réponses: 6
    Dernier message: 13/04/2006, 14h07

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