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>
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
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 :
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.
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 ?
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
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
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.
julp.fr ~ PHP < 8.0.0 : activer les erreurs PDO/SQL ~ PHP < 8.1.0 : activer les erreurs mysqli