8721 sujets

Développement web côté serveur, CMS

Bonjour,

Je suis sur le script de vérif d'accès des utilisateurs (admin et client), et je pense que j'ai fais une vrai moulinette et que le code est optimisable.
Ca fonctionne c'est déjà bien. Mais si je pouvais, via cette optimisation, acquerir quelques reflexes de programmeur, je prends volontiers Smiley smile

Voici le code :


if( (!empty($_POST['email'])) && (!empty($_POST['password'])) )
{
 $identifiant = $_POST['email'];
 $donnees = $bd->query('SELECT * FROM client') or die ('erreur :'.mysql_error()); //table client
 $donnees2 =  $bd->query('SELECT * FROM administrateurs') or die ('erreur :'.mysql_error()); //table admin
 //on verifie d'abord les admins, puis les clients.
 // ADMIN
 while($result1 = $donnees2->fetch()){
  if($emailadmintrouve == true)
  { 
   // l'email est trouvé donc rien ne se passe. Soit le mot de passe est bon et la connexion sera resussi soit nno et le client sera informé.
  }
  else
  {
   //vérif existant email			
   if( $result1['adm_email'] == $identifiant )
   {
    //ici, l'email a été trouvé sur une ligne de la table admin, on verifie alors la correspondance avec le mot de passe.
    $emailadmintrouve = true;
    $mdpteste = $_POST['password'];
    $hash = $result1['adm_mdp'];
    $passok = password_verify($mdpteste, $hash); //vérifie la correspondance des mots de passe.
     if($passok == true)
     {
      //les test sont concluants, l'utiisateur est reconnu. On enregistre l'admin dans des variables session
      $_SESSION['email_adm'] = $result1['adm_email'];
      $_SESSION['id_adm'] = $result1['adm_id'];
      $_SESSION['accesadmin'] = true; //permet l'acces aux pages prestations
      $accespage = true;
     }
     else
     {
      $msg_erreur = "Le mot de passe semble incorrecte.";
     }
    }
    else
    {
     $msg_erreur = "L'email n'a pas été trouvé"; //"Authentification incorrecte. Vérifiez vos paramètres de connexion.";
    }
   }
  }
  // CLIENT
   if($emailadmintrouve == true) {} else { // Si l'admin est trouvé, on ne cherche pas dans les clients, sinon on cherche.
   while($result1 = $donnees->fetch()){
    if($emailtrouve == true)
    { 
     // l'email est trouvé donc rien ne se passe. Soit le mot de passe est bon et la connexion sera resussi soit nno et le client sera informé.
    }
    else
    {
     //vérif existant email			
     if( $result1['clt_email'] == $identifiant )
     {
      //ici, l'email a été trouvé sur une ligne de la table de client, on verifie alors la correspondance avec le mot de passe.
      $emailtrouve = true;
      $mdpteste = $_POST['password'];
      $hash = $result1['clt_mdp'];
      $passok = password_verify($mdpteste, $hash); //vérifie la correspondance des mots de passe.
       if($passok == true)
       {
        //les test sont concluants, l'utiisateur est reconnu. On enregistre le clt dans des variables session
        $_SESSION['email_clt'] = $result1['clt_email'];
        $_SESSION['id_clt'] = $result1['clt_id'];
        $_SESSION['accesclient'] = true; //permet l'acces aux pages prestations
        $accespage = true;
       }
       else
       {
        $msg_erreur = "Le mot de passe semble incorrecte.";
       }
      }
      else
      {
       $msg_erreur = "L'email n'a pas été trouvé"; //"Authentification incorrecte. Vérifiez vos paramètres de connexion.";
      }
     }
    }
   }
  }
  //cette dernière partie, permet de vérifier le formulaire sans javascript ou jquery, via php
  elseif (isset($_POST['Valider']) && $_POST["Valider"] === "Valider")
  {
   if(empty($_POST['password'])) {$msg_erreur ="Veuillez renseigner ce champ : Mot de passe.";}
   if(empty($_POST['email'])) {$msg_erreur ="Veuillez renseigner ce champ : Email.";}		
  }


Par avance, je vous remercie vivement de vos retours.

Ps : La première chose a optimiser, serait la bdd, en ayant une seule table, et une colonne qui identifie les admins des clients. Mais après sur toutes les requetes clients, j'aurais du trier les admins Smiley decu . Merci de de confirmer ou non ma pensée. (qui a cette heure là n'est pas au mieux de sa forme lol)

Alexbass
Modifié par Alexbass (13 Jan 2015 - 23:39)
Salut

Alors non. Séparer les deux est plus qu'une bonne idée c'est obligatoire a mon sens.

Bon ensuite oui c'est optimisable.

Ton processus est pas bon

En premier chercher le login dans la table admin car c'est la plus petite.
Sélect login, password from table admin where login = $_post Smiley email
Si numrows > 0
C'est un admin
Donc on teste le password
Puis si OK. Met tes sessions

Sinon même chose mais sur la table client

Voilà simple, rapide efficace

Bien sur il faut sécuriser la variable reçue.

Bon courage
Bonjour,

Merci beaucoup pour ta réponse.
Je pense en effet que c'est plus simple de chercher tout de suite la valeur que de boucler sur la base.
Puis de compter s'il y a un résultat etc...

Tu dis :
pchlj a écrit :
Bien sur il faut sécuriser la variable reçue.

Comment ?
Je croyais qu'avec PDO, j'étais déjà protégé des injections etc...
http://forum.alsacreations.com/topic-20-74107-1-Resolu-Verification-formulaire.html#p488813

Merci d'avance pour ton retour et l'aide des uns et autres de ce forum. Smiley smile

Cordialement.
J'ai trouvé la réponse à ma question je crois.

Il faut distinguer les requettes préparées, et "PDO".
Ce lien est fort utile : lien

J'ai quand même une autre question :
Le principe global, doit ressembler à ça :
if( (!empty($_POST['email'])) && (!empty($_POST['password'])) )
 {
  $identifiant = $_POST['email'];
  $stmt = $bd->prepare("SELECT * FROM administrateurs WHERE adm_email = :email");
  $stmt->bindValue('email', $identifiant, PDO:: PARAM_STR); // espace pour éviter le smiley
  $stmt->execute();
  $count = $stmt->rowCount();
  if($count>0)
  {
   //verif mdp
   echo "l'email est trouvé, nous allons vérifier le mot de passe.";
   //comment je récupère l'id de l'admin ?
  } 
  else
  {
   //cherche clt
  }

et ma question est en commentaire : comment je récupère l'id de l'admin. (adm_id sur ma base.)
Je pense que j'ai encore trouvé Smiley smile
qui cherche, trouve Smiley cligne

if( (!empty($_POST['email'])) && (!empty($_POST['password'])) )
	{
		$identifiant = $_POST['email'];
		//cherche l'admin
		$stmt = $bd->prepare("SELECT * FROM administrateurs WHERE adm_email = :email");
		$stmt->bindValue('email', $identifiant, PDO: [langue]ARAM_STR);
		$stmt->execute();
		$count = $stmt->rowCount();
		//cherche clt
		$stmt2 = $bd->prepare("SELECT * FROM client WHERE clt_email = :email");
		$stmt2->bindValue('email', $identifiant, PDO: [langue]ARAM_STR);
		$stmt2->execute();
		$count2 = $stmt2->rowCount();
		if($count>0)
		{
			//verif mdp
			echo "l'email adm est trouvé, nous allons vérifier le mot de passe.";
			while($result = $stmt->fetch()){
				echo $result['adm_id'];
			}
		} 
		elseif($count2>0) 
		{
			echo "l'email clt est trouvé";
			while($result = $stmt2->fetch()){
				echo $result['clt_id'];
			}
		}
		else
		{
			echo "l'email n'est trouvé dans aucune base.";
		}
	}
	elseif (isset($_POST['Valider']) && $_POST["Valider"] === "Valider")
	{
		if(empty($_POST['password'])) {$msg_erreur ="Veuillez renseigner ce champ : Mot de passe.";}
		if(empty($_POST['email'])) {$msg_erreur ="Veuillez renseigner ce champ : Email.";}		
	}


Je suis sur la bonne voie ?

encore mieux : Pas besoin de boucler :
$result = $stmt->fetch()
echo $result['nom_de_la_colonne_en_bdd'];

ça fonctionne Smiley smile
Modifié par Alexbass (19 Jan 2015 - 20:23)
Lol j'aime beaucoup ta façon de faire question et réponses.

Au final t as trouvé la solution et c'est le principal 😀
Bonjour,

J'ai de nouveau une question.
J'ai ajouté la possibilité d'associer un logo au client. (gestion d'avatar ou d'images membres pourrait s'y apparenter).

voici le code que j'ai :

if(isset($_POST['Valider2']) && $_POST["Valider2"] === "Valider" && $erreur_global == false && $id_clt_modif <> "")
{
 if ($_FILES['userfile']['error'] > 0) { $ErrImg = "Erreur lors du transfert"; } 
 elseif($_FILES['userfile']['size'] > 500000)  { $ErrImg = "L'image est trop volumineuse. > 500 Ko."; }
 else {
	//permet l'enregistrement de l'image dans le fichier image, de nommer l'image et ajoute l'extension.png
 $nom = "Images/avatars/{$id_clt_modif}.png";
 $resultat = move_uploaded_file($_FILES['userfile']['tmp_name'],$nom);
  if ($resultat) {
   move_uploaded_file($_FILES['userfile']['tmp_name'],$nom);
   $msg_update_ok = "Vos modifications ont été enregistrées.";
  }
 }
}
elseif($id_clt_modif == null) 	{$ErrImg = "Vous devez d'abord enregistrer les informations du client avant de lui ajouter une image."; }
elseif($erreur_global == true)  { $ErrImg = "Une erreur sur le formulaire des informations client ne vous permet pas d'ajouter une image."; }

Un client ne peut avoir q'un logo, donc je nomme les images avec l'id du client. (solution simple)

Pour l'affichage coté client, c'est facile, car une fois le client connecté, j'ai son id, et donc son image.
C'est facile parce que je sais que l'extension de l'image est .png, et parce que je l'enregistre en modifiant l'extension ainsi.
Je pense que je rencontrerais des problèmes si le fichier n'étais pas une image, ou si le fichier n'accepte pas la modification de l'extension.
Bref, c'est pas du tout optimisé, et j'aimerais que ça le soit un peu plus.

A l'affichage, j'ai le code suivant :

if (file_exists('Images/avatars/'.$id_clt_modif.'.png')){
 echo '<div style="margin: auto; "><img align="middle" class="avatar" alt="imagedate" src="Images/avatars/'.$id_clt_modif.'.png"/></div>';
}


A votre bon coeur, j'ai hâte de vous lire. Smiley smile
Merci d'avance.
Modifié par Alexbass (28 Jan 2015 - 21:02)