Partage
  • Partager sur Facebook
  • Partager sur Twitter

Requête insert qui n'aboutit pas

Sujet résolu
    12 janvier 2023 à 18:28:41

    Bonjour,

    Je débute en php/sql.
    Après avoir lu plusieurs fois le tuto je me lance pour créer un site (avec les pages perso Free) pour lister des événements.
    J'ai créé la base et inséré directement par phpmyadmin quelques enregistrements.
    J'ai créé une page qui me liste bien les enregistrements contenus dans la base.

    Mon objectif maintenant est de créer un formulaire pour enregistrer de nouveaux événements et là ça bloque, j'ai bien le message attendu comme quoi l'événement a bien été créé mais en base le nouvel enregistrement n'apparait pas.

    J'ai beau lire et relire mon code je ne vois pas où ça coince, voici mon code :

    <?php
    	try
    {
       $bdd=new PDO('mysql:host=sql.free.fr;dbname=nombase', 'utilisateur', 'motdepasse');
       
     }
     catch(Exception $e)
     {
            die('Erreur : '.$e->getMessage());
     }
    	
    	if ($_SERVER['REQUEST_METHOD'] == 'POST')
    	{
    		
    		if (!preg_match ('_[0-9][0-9]/[0-9][0-9]/[0-9]{4}_', $_POST['date']))
    				$erreur .= ' La date doit être au format JJ/MM/AAAA.';
    		elseif (!preg_match ('_[0-9][0-9]:[0-9][0-9]_', $_POST['heure']))
    				$erreur .= ' L\'heure doit être au format HH:MM.';																   
    		elseif (strlen ($_POST['lieu'])<2)
    			$erreur = 'Le champ " Lieu " est vide ou incomplet.';
    		elseif (strlen ($_POST['evenement'])<2)
    			$erreur = 'Le champ " Evénement " est vide ou incomplet.';
    		elseif (strlen ($_POST['auteur'])<2)
    			$erreur = 'Le champ " Auteur " est vide ou incomplet.';		
    		
    		else
    		{
    					
    		$bdd->exec ("INSERT INTO baia_evenements (date, heure, lieu, evenement, organisateur, prix, ajoute_le, auteur)
    					 VALUES
    					 ('$_POST[date]', '$_POST[heure]','$_POST[lieu]', '$_POST[evenement]', '$_POST[organisateur]', '$_POST[prix]', CURRENT_TIMESTAMP(), '$_POST[auteur]'");
    			
    				
    			$envoyé = true;
    			
    		}
    	}
    ?>
    
    <!DOCTYPE html>
    <html lang="fr">
    <head>
    <meta charset="utf-8">
    <title>Formulaire d'ajout d'un événement</title>
    <meta name="robots" content="noindex, nofollow" />
    <meta name="viewport" content="width=device-width, initial-scale=1">
    
    <link rel="stylesheet" href="style.css" type="text/css">
    </head>
    
    <body>
    
    <div style="max-width: 450px; height: 600px; background: #f6f2e8; padding: 20px;">
    
    <form method="post">
    <fieldset>
    <legend>Formulaire d'ajout d'un évènement </legend>
    <?
    
    	if (isset ($envoyé))
    		echo "<p style=\"font-weight: bold; text-align:center; margin-top:5e\">L'évènement a bien été ajouté</p>";
    	else
    	{
    
    		if (isset ($erreur))
    		{
    			echo "<p style=\"color:red\">$erreur</p>";
    		}
    ?>
    <p>Pour ajouter un évènement, merci de remplir tous les champs de ce formulaire : <br />
    	<label for="date">Date de l'évènement :</label> <br />
    	<input type="text" name="date" id="date" style="margin-top:5px; width: 100%;" />
    <br /><br />
    	<label for="heure">Heure de l'évènement :</label> <br />
    	<input type="text" name="heure" id="heure" style="margin-top:5px; width: 100%" />
    <br /><br />
    	<label for="lieu">Lieu de l'évènement :</label> <br />
    	<input type="text" name="lieu" id="lieu" style="margin-top:5px; width: 100%" />
    <br /><br />
    	<label for="evenement">Nature de l'évènement :</label> <br />
    	<input type="text" name="evenement" id="evenement" style="margin-top:5px; width: 100%" />
    <br /><br />
    	<label for="organisateur">Organisateur de l'évènement :</label> <br />
    	<input type="text" name="organisateur" id="organisateur" style="margin-top:5px; width: 100%" />
    <br /><br />
    	<label for="prix">Prix de l'évènement :</label> <br />
    	<input type="text" name="prix" id="prix" style="margin-top:5px; width: 100%" />
    <br /><br />
    	<label for="auteur">Êvènement ajouté par :</label> <br />
    	<input type="text" name="auteur" id="auteur" style="margin-top:5px; width: 100%" />
    </p>
    
    <p style="text-align:center">
    	<button type="submit">Envoyer</button>
    </p>
    
    <?
    	}
    ?>
    
    </fieldset>
    </form>
    </div>
    
    </body>
    </html>

    Une piste pour m'aider

    -
    Edité par Delher 12 janvier 2023 à 18:30:07

    • Partager sur Facebook
    • Partager sur Twitter
      12 janvier 2023 à 22:42:45

      Salut peut etre que ta requête est mal écrite, essaye ca :

      $insert= $bdd->prepare('INSERT INTO baia_evenements (date, heure, lieu, evenement, organisateur, prix, auteur)

      VALUES

      (:date, :heure,:lieu, :evenement, :organisateur,:prix,:auteur');

      $insert->execute(array(

      'date'=> $date

      'heure'=> $heure

      'lieu'=> $lieu

      'evenement' => $evenement,

      'organisateur' => $organisateur,

      'prix' => $prix,

      'auteur' => $auteur));

      Concernant le champ 'ajoute_le' pas besoin de le mettre dans l'insert si tu as bien indiqué dans ta table baia_evenements  dans le champs 'ajoute_le'  et en valeur par defaut tu mets 'CURRENT_TIMESTAMP'

      -
      Edité par Jack73Bauer 12 janvier 2023 à 22:43:39

      • Partager sur Facebook
      • Partager sur Twitter
        13 janvier 2023 à 11:11:51

        Bonjour,

        Merci de t'être penché sur mon problème.

        En base le champ 'ajoute_le' était en 'DATETIME' je l'ai passé en 'TIMESTAMP' avec en valeur par défaut 'CURRENT_TIMESTAMP'.

        J'ai modifié la requête en requête préparée comme tu me le suggérais, mais rien n'y fait, j'obtiens bien les messages 'événement ajouté' (deux fois puisque j'ai ajouté un echo) comme si tout s'était bien passé mais l'enregistrement n'apparait pas en base, la requête préparée :

        else
        		{
        		$insert= $bdd->prepare('INSERT INTO baia_evenements (date, heure, lieu, evenement, organisateur, prix, auteur)
        		VALUES
        		(:date, :heure,:lieu, :evenement, :organisateur,:prix,:auteur)');
        
        		$insert->execute(array(
        		'date'=> $date,
        		'heure'=> $heure,
        		'lieu'=> $lieu,
        		'evenement' => $evenement,
        		'organisateur' => $organisateur,
        		'prix' => $prix,
        		'auteur' => $auteur,));
        
        		echo 'L\'évènement a bien été ajouté !';
        			$envoyé = true;
        		}



        • Partager sur Facebook
        • Partager sur Twitter
          13 janvier 2023 à 12:00:05

          Je n'ai pas d'erreur qui s'affiche

          -
          Edité par Delher 13 janvier 2023 à 12:01:02

          • Partager sur Facebook
          • Partager sur Twitter
            14 janvier 2023 à 7:13:21

            Je viens de trouver mon erreur.

            En fait ce n'est pas la requête qui est en cause mais le fait que j'essayais d'enregistrer une donnée  contenant une apostrophe ' dans le champ 'organisateur'

            Après recherche j'ai donc échappé les apostrophes avec addslashes() sur ce champ, pas sûr que ce soit la meilleure syntaxe.

            $organisateur = $_POST[organisateur];	
            $organisateur = addslashes($organisateur);

            Existe-t-il une possibilité d'échapper tous les champs d'un coup ou faut-il le faire pour chaque champ attendant du texte?

            -
            Edité par Delher 14 janvier 2023 à 7:19:51

            • Partager sur Facebook
            • Partager sur Twitter
              14 janvier 2023 à 11:12:55

              Ne JAMAIS utiliser addslashes, ce n'est pas fait pour échapper des données pour un SGBD !!! Si ta requête fonctionne avec, c'est qu'elle n'est toujours pas préparée d'ailleurs, tu es revenu en arrière.

              > Existe-t-il une possibilité d'échapper tous les champs d'un coup ou faut-il le faire pour chaque champ attendant du texte?

              Tu n'aurais rien à faire [de plus] si tu préparais correctement tes requêtes. Ce qui t'assurerait en plus de ne pas avoir de failles de sécurité (injections SQL).

              > Je n'ai pas d'erreur qui s'affiche

              Cf ma signature pour activer les erreurs.

              Si tu veux apprendre, tu dois avoir la volonté de vouloir faire les choses au mieux (bonnes pratiques, sécurité, etc), ce n'est pas en persistant sur les pires "solutions" qui en sont toutes sauf une et diverses rustines de facilité que tu vas te rendre service ou créer des projets qui durent un minimum. Enfin, moi je dis ça pour toi.

              PS : depuis quand les requêtes ne sont plus préparées dans le tuto PHP ?

              -
              Edité par julp 14 janvier 2023 à 12:57:20

              • Partager sur Facebook
              • Partager sur Twitter
                14 janvier 2023 à 19:40:12

                Bonjour

                Je ne me souviens pas avoir dit que les requêtes ne sont plus préparées dans le tuto, même si la mienne initiale ne l'était pas.

                Suite à la remarque de Jack la seconde l'était, mais comme je n'avais mis que le code de la requête il ne pouvait pas voir que qu'en amont de celle ci il manquait des éléments concernant la récupération des variables transmises par post.

                En réécrivant la requête avec les bonnes variables ça fonctionne

                'date'=> $date,
                'heure'=> $_POST['heure'],
                'lieu'=> $_POST['lieu'],
                'evenement' => $_POST['evenement'],
                'organisateur' => $_POST['organisateur'],
                'prix' => $_POST['prix'],
                'auteur' => $_POST['auteur']));

                J'ai la volonté de faire au mieux, mais comme certainement beaucoup de débutant au bout d'un moment de recherches infructueuses on finit par poster sur un forum, pour trouver de l'aide

                Bonne soirée



                • Partager sur Facebook
                • Partager sur Twitter

                Requête insert qui n'aboutit pas

                × 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