Bonjour,

Voila je rencontre un problème avec mon code , j'arrive pas à inserer les données dans ma BD .
J'ai un bouton nommé 'D' , aprés le clique sur ce bouton un formulaire s'affiche dans la même page pour remplir les infos necéssaires , et ensuite insérer ces données dans une table nommée, mais je sais pourqoui l'insertion ne l'insertion ne ça se fait pas.
Pouvez -vous m'aider s'ils vous plaît , j'arrive pas à trouver l'erreur.

Ce que je fais

Décrivez ici votre code ou ce que vous cherchez à faire

 echo'<form method="post" action="admin.php">
<input type="hidden" name="ok" value="ok" />
<input type="submit" name="D" value="Demande une formation" /></form>'
__________________________________________
<?php
if(isset($_POST["D"]))
 {

  echo'<center><h2> Demander une formation</h2></center>

  <center><form method"post" class="pure-form">
    <fieldset>
        <legend>Veuillez indiquer les information ci-dessus</legend>
       Nom: <input type="text" placeholder="Nom" name="Nom"><br/><br/>

       Fonction:<input type="text" placeholder="Fonction" name="Fonction"><br/><br/>

       Service:<input type="text" placeholder="Service" name="Service"><br/><br/>
       Description: <input type="text" placeholder="Description" name="Description"><br/><br/>
<button type="submit" class="pure-button pure-button-primary" name="Sign in">Sign in</button>
    </fieldset>
</form></center>';}

$conn=new PDO('mysql:host=localhost;dbname=sfe2','root','');
if(isset($_POST['Nom'])&& isset($_POST['Fonction']) && isset($_POST['Service']) && isset($_POST['Description'])&& isset($_POST['Sign in'])){
  $req="INSERT INTO demande VALUES ('".$_POST['Nom']."','".$_POST['Fonction']."','".$_POST['Service']."','".$_POST['Description']."')";
$result=$conn->exec($req);}
 ?>

Ma table demande:
demande(id_demande(auto_increment),Nom,Fonction,Service,Description).
Merci d'avance.

8 réponses


Bonjour.
Tu devrais penser à debuguer ton code et si tu n'as pas recopier ton code exactement comme tu l'as en local, fais le immédiatement.
Ensuite; tu devrais éviter de mettre des espaces dans les noms des champs d'un formulaire.
Si je comprend bien, le premier formulaire est sur une autre page, c'est ça ?
Tu devrais faire attention quand tu codes, car dans ton second formulaire, tu définies mal tes attributs html : <form method"post" class="pure-form">, il manque le signe = pour l'attribut method.
Pour terminer, tu devrais revoir la syntaxe pour un INSERT.

Salut,

tu devrais éviter de mettre des espaces dans les noms des champs d'un formulaire.

Absolument !
Et moins important, mais tant qu'a faire,
ne leur mets pas de majuscules non plus.

Aussi,
pour la requête INSERT, il manque les champs de la table avant les "VALUES".

Et ce n'est pas ça qui fait que ton code plante mais,
ça ne sert à rien de faire des isset(...) sur les name de ton form, ça retourne toujours TRUE.
J'imagine que tu veux mettre !empty(...) à la place.

Par contre si tu mets des !empty(...), c'est bien de laisser les isset(...) pour éviter les bugs.

if (isset($_POST['nom']) && !empty($_POST['nom'] &&
    isset($_POST['fonction']) && !empty($_POST['fonction'] &&
    isset($_POST['service']) && !empty($_POST['service'] &&
    isset($_POST['description']) && !empty($_POST['description'] &&
    isset($_POST['sign_in']) && !empty($_POST['sign_in'])
{
    ...
}

La chose la plus grave celon moi est :

$req="INSERT INTO demande VALUES ('".$_POST['Nom']."','".$_POST['Fonction']."','".$_POST['Service']."','".$_POST['Description']."')";
$result=$conn->exec($req);}

Tu est sensible à une injection SQL tel que "description vaut :

$_POST['Description'] = "blabla); INSERT into user VALUE('hacker','hacker','ROLE_ADMIN')";

Cela est un exemple, mais virtuellement tu peux imaginer ajouter un nouvel utilisateur non voulu dans la table utilisateur avec pour role ADMIN.

préfère les requêtes préparé tel quel :

$stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (:name, :value)");
$stmt->bindParam(':name', $name);
$stmt->bindParam(':value', $value);

@yanis-git , ou virer tous les users :D
c'est plus chaud la :D

$_POST['Description'] = "blabla); DELTE user WHERE ID>0;

@SLK, depuit PHP 5.5 empty = isset ;)
Aucune alerte n'est générée si la variable n'existe pas. Cela signifie que empty() est strictement équivalent à !isset($var) || $var == false.

@plus

Pierre

Sanae
Auteur

Bonjour,
vraiment je savais pas que j'ai commis toutes ces erreurs , dans une seule requête c'est embarassant
@Lartak , non le premier formulaire est dans la même page aussi , et pour les espaces je l'ai enlevé , aussi pour les majuscules.

Sanae
Auteur

@Lartak ,@SLK, Merci beaucoup pour les remarques et l'aide le problème est réglé.

Sanae
Auteur

@yanis-git , merci pour la remaque importante, je savais pas cette méthode de préparer les requêtes , je l'appliquerai pour tout mon code maintenant, Merci beaucoup

@SLK, depuit PHP 5.5 empty = isset ;)

Non.

empty($var) équivalent à !isset($var) || $var == false
DONC
empty = isset
???

du coup,
isset, c'est comme : !isset($var) || $var == false
???

Juste : Non.

Si tu travail sur une variable $_POST qui existe, et qui est remplie :
isset renverra TRUE
empty renverra FALSE

Si tu travail sur une variable $_POST qui existe, et qui n'est pas remplie :
isset renverra TRUE
empty renverra TRUE

Si tu travail sur une variable $_POST qui existe n'existe pas :
isset renverra FALSE
empty renverra TRUE, et génèrera une erreur, en disant que la variable n'est pas définie.

Bref,
pas du tout le même comportement,
pas la même chose.