Problème de code php

Résolu
Bonjour,

Voilà, j'ai un petit problème, toutes les parties de mon code fonctionnent sauf une: la partie des champs manquant: quand les champs ne sont pas remplis, le message d'erreur s'affiche bien mais le reste des infos sont quand même envoyés à ma BDD.
Voici le code: (partie défectueuse soulignée)

<?php
// Paramètres persos
$host = "localhost"; // hébergeur
$user = "*******"; // utilisateur
$pass = "*******"; // mot de passe
$bdd = "ancestra_other"; // nom de la BDD
// connexion
@mysql_connect($host,$user,$pass)
or die("Service temporairement inaccessible. Veuillez le signaler à l'administrateur général");
@mysql_select_db("$bdd")
or die("Service temporairement inaccessible. Veuillez le signaler à l'administrateur général");
// récupérer les champs
if(isset($_POST['nom'])) $nom=$_POST['nom'];
else $nom="";

if(isset($_POST['pass'])) $pass=$_POST['pass'];
else $pass="";

if(isset($_POST['classe'])) $classe=$_POST['classe'];
else $classe="";

if(isset($_POST['serveur'])) $serveur=$_POST['serveur'];
else $serveur="";
// On vérifie si les champs sont vides

if(empty($nom) OR empty($pass))
{
echo '<font color="red">Veuillez remplir tous les champs.</font>';
}


// on regarde si l'info existe déjà
$sql = "SELECT id FROM service_classe WHERE nom='$nom'";
$req = mysql_query($sql) or die('Erreur SQL, veuillez prévenir l\'administrateur de ce bug.'.$sql.'<br>'.mysql_error());

// on compte le nombre de résultats
$res = mysql_num_rows($req);

if($res!=0) // l'info existe déjà, on affiche un message d'erreur
{
echo '<center><font color="red">Vous avez déjà validé ce service avec ce compte, veuillez attendre une semaine avant de pouvoir l\'activer de nouveau.</font></center>';
}
// on vérifie si l'utilisateur existe
$sql2 = "SELECT guid FROM accounts WHERE account='$nom'";
$req2 = mysql_query($sql2) or die('Erreur SQL, veuillez prévenir l\'administrateur de ce bug.'.$sql2.'<br>'.mysql_error());

// on compte le nombre de résultats
$res2 = mysql_num_rows($req2);

if($res2!=1) // l'utilisateur n'existe pas, on affiche un message d'erreur
{
echo '<center><font color="red">Ce nom de compte n\'existe pas!</font></center>';
}
// on vérifie si le mot de passe existe
$sql3 = "SELECT guid FROM accounts WHERE pass='$pass'";
$req3 = mysql_query($sql3) or die('Erreur SQL, veuillez prévenir l\'administrateur de ce bug.'.$sql3.'<br>'.mysql_error());

// on compte le nombre de résultats
$res3 = mysql_num_rows($req3);

if($res3!=1) // le mot de passe n'existe pas, on affiche un message d'erreur
{
echo '<center><font color="red">Ce mot de passe n\'existe pas!</font></center>';
}
// Aucun champ n'est vide, on peut enregistrer dans la table
else
{
// Requete d'insertion MYSQL
$requete = "INSERT INTO service_classe (id, nom, pass, classe, serveur) VALUES ('','$nom','$pass','$classe','$serveur')";

// on insère les informations du formulaire dans la table
mysql_query($requete) or die('Erreur SQL, veuillez prévenir l\'administrateur de ce bug.'.$sql.'<br>'.mysql_error());

// on affiche le résultat pour le visiteur
echo "Vos infos on été ajoutées.";
}

?>

Merci d'avance pour votre aide,

Julien

3 réponses

  1. Merci à vous, mon problème est résolu.
    Pour ce qui est de la sécurité, je n'allais pas l'oublié, je test juste les fonctionnalités de mon code petit à petit, car je ne suis pas vraiment un pro en php ^^
    1. Bonjour,

      "quand les champs ne sont pas remplis, le message d'erreur s'affiche bien mais le reste des infos sont quand même envoyés à ma BDD"
      parce que selon votre code, l'insertion des données dans la base est indépendante de votre test sur le remplissage des champs.
      il faut que vous procéder de la manière suivante:

      if(champs vides) { 
       // message d'erreur 
      } 
      else { 
       // les sont champs sont remplis, insertion des données dans la BDD 
      }

      essayez donc le code suivant:

      <?php 
      // Paramètres persos 
      $host = "localhost"; // hébergeur 
      $user = "*******"; // utilisateur 
      $pass = "*******"; // mot de passe 
      $bdd = "ancestra_other"; // nom de la BDD 
      // connexion 
      @mysql_connect($host,$user,$pass) 
      or die("Service temporairement inaccessible. Veuillez le signaler à l'administrateur général"); 
      @mysql_select_db("$bdd") 
      or die("Service temporairement inaccessible. Veuillez le signaler à l'administrateur général"); 
      // récupérer les champs 
      if(isset($_POST['nom'])) $nom=$_POST['nom']; 
      else $nom=""; 
      if(isset($_POST['pass'])) $pass=$_POST['pass']; 
      else $pass=""; 
      if(isset($_POST['classe'])) $classe=$_POST['classe']; 
      else $classe=""; 
      if(isset($_POST['serveur'])) $serveur=$_POST['serveur']; 
      else $serveur=""; 
      
      // On vérifie si les champs sont vides 
      if(empty($nom) OR empty($pass)) 
      { // champs vides => message d'erreur 
       echo '<font color="red">Veuillez remplir tous les champs.</font>'; 
      } 
      else 
      { // les champs ne sont pas vides => on regarde si l'info existe déjà 
        $sql = "SELECT id FROM service_classe WHERE nom='$nom'"; 
        $req = mysql_query($sql) or die('Erreur SQL, veuillez prévenir l\'administrateur de ce bug.'.$sql.'<br>'.mysql_error()); 
        // on compte le nombre de résultats 
        $res = mysql_num_rows($req); 
        if($res!=0) 
        { // l'info existe déjà, on affiche un message d'erreur 
         echo '<center><font color="red">Vous avez déjà validé ce service avec ce compte, veuillez attendre une semaine avant de pouvoir l\'activer de nouveau.</font></center>'; 
        } 
        else 
        { // on vérifie si l'utilisateur existe 
         $sql2 = "SELECT guid FROM accounts WHERE account='$nom'"; 
         $req2 = mysql_query($sql2) or die('Erreur SQL, veuillez prévenir l\'administrateur de ce bug.'.$sql2.'<br>'.mysql_error()); 
         // on compte le nombre de résultats 
         $res2 = mysql_num_rows($req2); 
         if($res2!=1) 
         { // l'utilisateur n'existe pas, on affiche un message d'erreur 
       echo '<center><font color="red">Ce nom de compte n\'existe pas!</font></center>'; 
         } 
         else 
         { // on vérifie si le mot de passe existe 
          $sql3 = "SELECT guid FROM accounts WHERE pass='$pass'"; 
          $req3 = mysql_query($sql3) or die('Erreur SQL, veuillez prévenir l\'administrateur de ce bug.'.$sql3.'<br>'.mysql_error()); 
          // on compte le nombre de résultats 
          $res3 = mysql_num_rows($req3); 
          if($res3!=1) 
          { // le mot de passe n'existe pas, on affiche un message d'erreur 
           echo '<center><font color="red">Ce mot de passe n\'existe pas!</font></center>'; 
          } 
          else 
          { // Aucun champ n'est vide, => Requête d'insertion MYSQL 
           $requete = "INSERT INTO service_classe (id, nom, pass, classe, serveur) VALUES ('','$nom','$pass','$classe','$serveur')"; 
           // on insère les informations du formulaire dans la table 
           mysql_query($requete) or die('Erreur SQL, veuillez prévenir l\'administrateur de ce bug.'.$sql.'<br>'.mysql_error()); 
           // on affiche le résultat pour le visiteur 
           echo "Vos infos on été ajoutées."; 
          } 
        } 
       } 
      } 
      ?> 

      Remarque:
      - vous testez le compte et le mot de passe indépendamment, donc si le mot de passe existe, comment vous savez qu'il correspond à ce compte. je pense qu'il vaut mieux faire:
      $sql = "SELECT guid FROM accounts WHERE account='$nom' AND pass='$pass'";

      - code mal sécurisé, faites attention aux injections sql, il faut traiter les données avant de les utiliser dans les requêtes.

      bonne chance.
      1. oui car entrer la chaine vide ne suffit par a supprimer une variable, il faut utiliser la fonction
        unset($nom);