Problème de code php

Résolu
Julien -  
 Julien -
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. ktm620enduro Messages postés 377 Statut Membre 38
     
    oui car entrer la chaine vide ne suffit par a supprimer une variable, il faut utiliser la fonction
    unset($nom);
    0
  2. kadeh Messages postés 341 Statut Membre 92
     
    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.
    0
  3. Julien
     
    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 ^^
    0