Php - Vérification de champs

Résolu/Fermé
Astolpho Messages postés 73 Date d'inscription vendredi 8 avril 2022 Statut Membre Dernière intervention 12 juin 2024 - 8 avril 2022 à 17:18
Astolpho Messages postés 73 Date d'inscription vendredi 8 avril 2022 Statut Membre Dernière intervention 12 juin 2024 - 11 avril 2022 à 15:51
Bonjour a tous,

Je souhaiterais vérifier un champ "lastname" avant insertion de données, si le champs est vide ça laisse passer, s'il est déjà renseigner ça laisse passer, s'il est renseigné mais qu'il fait moins de 3 caractères, ça met un message.

En gros, j'aimerais avoir la possibilité de laisser le champs vide, ou s'il est déjà enregistrer il ne fait rien et s'il fait moins de 3 caractères il met le message.

Quand je laisse le champs vide, il me met le message de la vérification de moins de 3 caractères, il me laisse pas la possibilité de mettre un champ vide

    
    // Check nombre de caractère
	$lastnamelength = (strlen( $_POST['lastname']));
	if($lastnamelength <=2) {
	$errors  ['lastname']= "le nom ne peut pas faire moins de 3 caracteres";

	} else {
	
    // Check s'il existe dejà, il ne fait rien (au cas ou on enregistre d'autre champs, il ne le réenregistre pas
	if($lastnamelength == $_POST['lastname']){
	return true;

	}  else { 

      // Check si le champs est vide, il le laisse vide
	if(empty($_POST['lastname'])){
        return true;

	}


Je cherche une astuce pour faire fonctionner toutes ses combinaisons si c'est possible.
A voir également:

8 réponses

jordane45 Messages postés 38266 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 2 novembre 2024 4 694
9 avril 2022 à 18:57
Oh mon dieu... ce nombre d'erreurs dans ton code.... aie !!

Bon,
En gros ..
Histoire d'avoir un code propre

<?php
//---------------------------------------------------------------//
//connexion à la bdd
// A lire et à appliquer avant de poursuivre :
// http://www.commentcamarche.net/faq/46512-pdo-gerer-les-erreurs
//---------------------------------------------------------------//
require_once('../inc/connexion.php');


//---------------------------------------------------------------//
// On va découper ton code en "fonctions"
// ça le rendra plus lisible et plus facile
// à maintenir ou à faire évoluer
//---------------------------------------------------------------//
/**
Fonction pour mettre à jour 
*/
function updCustomers($id_customers, $showin,$firstname,$lastname,$zipcode="",$city="",$phone="",$mobile=""  ){
   $db = getDB();
   $sql = "UPDATE customers  
            SET
               showin=:showin
               ,firstname=:firstname
               ,lastname=:lastname
               ,address=:address
               ,zipcode=:zipcode
               ,city=:city
               ,email=:email
               ,phone=:phone
               ,mobile=:mobile
            WHERE id_customers=:id_customers";
  try{
     // Prepare statement
     $stmt = $db->prepare($sql);

     $stmt->bindParam(':showin', $showin);
     $stmt->bindParam(':firstname', strtolower(ucwords($firstname));
     $stmt->bindParam(':lastname', strtolower(ucwords($lastname));
     $stmt->bindParam(':address', strtolower($address));
     $stmt->bindParam(':email', strtolower($email));
     $stmt->bindParam(':zipcode', $zipcode);
     $stmt->bindParam(':city', strtolower(ucwords($city));
     $stmt->bindParam(':id_customers', $id_customers);
     // execute  query
    return  $stmt->execute();
  }catch(Exception $e){
    echo "Erreur dans la requête " . $sql;
    echo $e->getMessage();
    exit;
  }
  
}

/**
* Fonction pour insérer un customer ( je te le donne en exemple...)
*/
function createCustomer($showin,$firstname,$lastname,$zipcode="",$city="",$phone="",$mobile=""){
   $db = getDB();
   $sql = "INSERT INTO customers ( showin,firstname,lastname,address,zipcode,city,email,phone,mobil)
           VALUES (:showin,:firstname,:lastname,:address,:zipcode,:city,:email,:phone,:mobil)";
  try{       
     // Prepare statement
     $stmt = $db->prepare($sql);
     $stmt->bindParam(':showin', $showin);
     $stmt->bindParam(':firstname', strtolower(ucwords($firstname));
     $stmt->bindParam(':lastname', strtolower(ucwords($lastname));
     $stmt->bindParam(':address', strtolower($address));
     $stmt->bindParam(':email', strtolower($email));
     $stmt->bindParam(':zipcode', $zipcode);
     $stmt->bindParam(':city', strtolower(ucwords($city));
     
     // execute  query
     $stmt->execute();
    // on récupère l'id du customer créé : https://www.php.net/manual/fr/pdo.lastinsertid.php
    $id = $db->lastInsertId();
    return $id;
  }catch(Exception $e){
    echo "Erreur dans la requête " . $sql;
    echo $e->getMessage();
    exit;
  }
}

/**
 Fonction pour récupérer l'id d'un customer via son "lastname"
*/
function getCustomerByLastName($lastname){

  $db = getDB();
  $sql = 'SELECT id_customers FROM customers WHERE lastname = ?';
  try{
    $stmt = $db->prepare ($sql);
    $stmt->execute(array($lastname));
    $resultat = $stmt->fetchColumn(); // https://www.php.net/manual/fr/pdostatement.fetchcolumn.php
    return $resultat;
  }catch(Exception $e){
    echo "Erreur dans la requête " . $sql;
    echo $e->getMessage();
    exit;
  }
}


/**
 Fonction pour récupérer l'id d'un customer via son "email"
*/
function getCustomerByEmail($email){
  $db = getDB();
  $sql = 'SELECT id_customers FROM customers WHERE email = ?';
  try{
    $stmt = $db->prepare ($sql);
    $stmt->execute(array($email));
    $resultat = $stmt->fetchColumn(); // https://www.php.net/manual/fr/pdostatement.fetchcolumn.php
    return $resultat;
  }catch(Exception $e){
    echo "Erreur dans la requête " . $sql;
    echo $e->getMessage();
    exit;
  }
}


//---------------------------------------------------//
// On récupère proprement les variables envoyées 
// en $_POST  AVANT de les utiliser
// pour cela, j'utilise l'écriture ternaire : https://blog.smarchal.com/operateur-ternaire-php#:~:text=L'op%C3%A9rateur%20ternaire%20est%20un,%5BTHEN%5D%20%3A%20%5BELSE%5D%3B
//---------------------------------------------------//
$id_customers = !empty($_POST["id_customers"]) ? $_POST["id_customers"] : NULL;
$showin = !empty($_POST["showin"]) ? $_POST["showin"] : NULL;
$firstname = !empty($_POST["firstname"]) ? $_POST["firstname"] : NULL;
$lastname = !empty($_POST["lastname"]) ? $_POST["lastname"] : NULL;
$address = !empty($_POST["address"]) ? $_POST["address"] : NULL;
$zipcode = !empty($_POST["zipcode"]) ? $_POST["zipcode"] : NULL;
$city = !empty($_POST["city"]) ? $_POST["city"] : NULL;
$phone = !empty($_POST["phone"]) ? $_POST["phone"] : NULL;
$mobile = !empty($_POST["mobile"]) ? $_POST["mobile"] : NULL;
$email = !empty($_POST["email"]) ? $_POST["email"] : NULL;

$updateCustomers = !empty($_POST["updateCustomers"]) ? $_POST["updateCustomers"] : NULL;



//---------------------------------------------------//
// Traitement du formulaire
//---------------------------------------------------//
if(!empty($_POST)) {

  $errors =array();

   // si le lastname n'est pas vide
  if(!empty($lastname)) {

    $db_lastName =  getCustomerByLastName($lastname);
    if(!empty($db_lastName)){
      $errors['lastname'] = "Cet utilisateur existe déjà";
    }else{
      //on vérifie si la bonne taille
      $lastnamelength = (strlen( $lastname));
      if($lastnamelength <=2) {
        $errors  ['lastname']= "le nom ne peut pas faire moins de 3 caracteres"; 
      } 
      if(!preg_match("#^[A-Za-z]+(?:[\s-][a-zA-Z]+)*$#", $lastname)) {
        $errors['lastname'] = "On ne peut peux pas rentrer de caractères numérique dans le champs du nom";
      }
    }
   }

  // pour le mail : https://www.php.net/manual/fr/filter.filters.validate.php
  // https://www.php.net/manual/fr/filter.examples.validation.php
  if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
     $errors['email'] = "Votre email n'est pas valide";
  } else{
    // on vérifie si il n'existe pas déjà en bdd
    $db_email =  getCustomerByEmail($email);
    if(!empty($db_email)){
       $errors ['email'] = "cet email existe deja";
    }    
  }

  if(!empty($city)) {
    if(!preg_match("#^[A-Za-z]+(?:[\s-][a-zA-Z]+)*$#", $city )) {
      $errors ['city']  = "La ville  n'est pas valide"; 
    }
  }

  if(!empty($zipcode)) {
    if(!preg_match("#^[0-9]{5}$#", $zipcode )) {
      $errors['zipcode']  = "Le code postal n'est pas valide"; 
    }
  }

    
  // Si il n'y a pas d'erreurs ...
  if(empty($errors)) {
    
    if(isset($updateCustomers)) {
     //On met à jour le customer
     updCustomers($id_customers, $showin,$firstname,$lastname,$zipcode,$city,$phone,$mobile );
     
     //header('Location: ../form/customersProfile.php?id_customers='.$_GET["id_customers"].'');
     exit; //toujours mettre un exit après une redirection
    }  

    // debug ($errors);

  } else{
    //on affiche les erreurs.. par exemple :
    print_r($errors);
  }
}


?>

1
jordane45 Messages postés 38266 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 2 novembre 2024 4 694
8 avril 2022 à 17:22
Bonjour
Ton if ligne 16 et à déplacer en premier.
Celui qui se trouve actuellement à la ligne 10 ne correspond pas du tout à ce que tu cherches à faire.... Tu as légèrement oublié de faire une requête SQL pour aller vérifier en base si le nom est déjà utilisé ou non.
0
Astolpho Messages postés 73 Date d'inscription vendredi 8 avril 2022 Statut Membre Dernière intervention 12 juin 2024
Modifié le 8 avril 2022 à 17:29
Pour la requête je m'en suis rendu compte en mettant le message du coup c'est plus comme ça :

//Vérifie que le champs est vide
   if(empty($_POST['lastname'])){
        return true;

 } else {

    // Vérifie que le nom ne fasse pas moins de 3 caractères
 $lastnamelength = (strlen( $_POST['lastname']));
 if($lastnamelength <=2) {
 $errors  ['lastname']= "le nom ne peut pas faire moins de 3 caracteres";

 } else {
  
    // Check s'il existe dejà, il ne fait rien (au cas ou on enregistre d'autre champs, il ne le réenregistre pas
  $db = getDB();
  $req = $db->prepare ('SELECT id_customers FROM customers WHERE lastname = ?');
  $req->execute(array($_POST['lastname']));
  $lastname =$req->fetch();
  if($lastname == $_POST['lastname']) {
  return true;
  

 }  

 }

0
jordane45 Messages postés 38266 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 2 novembre 2024 4 694
8 avril 2022 à 18:57
Donc.. c'est bon ? ( si oui, marque le sujet en RESOLU ).
0
Astolpho Messages postés 73 Date d'inscription vendredi 8 avril 2022 Statut Membre Dernière intervention 12 juin 2024
Modifié le 8 avril 2022 à 20:06
Comme ça, ça fonctionne

  $db = getDB();
  $req = $db->prepare ('SELECT id_customers FROM customers WHERE lastname = ?');
  $req->execute(array($_POST['lastname']));
  $lastname =$req->fetch();

        if(empty($_POST['lastname']) || ($lastname == $_POST['lastname'])) {
  return true; 
}

  {

   $lastnamelength = (strlen( $_POST['lastname']));
   if($lastnamelength <=2) {
   $errors  ['lastname']= "le nom ne peut pas faire moins de 3 caracteres"; 
} 
    
      if(!preg_match("#^[A-Za-z]+(?:[\s-][a-zA-Z]+)*$#", $_POST['lastname'] )) {
  $errors ['lastname'] = "On ne peut peux pas rentrer de caractères numérique dans le champs du nom";
 }


}


Par contre si je laisse le champs du lastname vide, il ne rempli pas ou ne modifie pas l'email , c'est a cause de la condition des moins de 3 caractères ,(j' ai pas de message d'erreur quand je le laisse vide). Par contre si je rentre un lastname je peux modifier l'email en même temps.

        // Vérifie que l'email est conforme et que cet email n'existe pas
 if(empty($_POST['email']) || !preg_match('#^[\w.-]+@[\w.-]+\.[a-zA-Z]{2,6}$#', $_POST['email'])) {
  $errors ['email'] = "Votre email n'est pas valide";

 }  else {
  $db = getDB();
  $req = $db->prepare ('SELECT id_customers FROM customers WHERE email = ?');
  $req->execute(array($_POST['email']));
  $email =$req->fetch();
  if($email == $_POST['email']) {
  return true;
  }

 }


Il sont dépendant les uns des autres ?
il faut faire un script unique avec tout les champs que j'ai besoin de contrôler ?

Le champs lastname n'est pas obligé d'être renseigné, celui obligatoire c'est la raison sociale qui peut être un nom d'entreprise ou un prénom et un nom. Le champs lastname c'est pour le nom du contact de la raison sociale si ont veut le remplir, c'est pas obligé.

par exemple si la raison sociale est le nom et le prénom pas besoin de remplir le champs prénom et nom puisque c'est les même.

Tant que le champs lastname reste vide, je ne peux remplir aucun autre champs
0
jordane45 Messages postés 38266 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 2 novembre 2024 4 694
8 avril 2022 à 20:24
Il faudrait nous montrer le code complet ( en un seul morceau ) ... pas juste des petits bouts ...
Sinon on ne peut pas savoir comment tu as structuré ton code...
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Astolpho Messages postés 73 Date d'inscription vendredi 8 avril 2022 Statut Membre Dernière intervention 12 juin 2024
Modifié le 8 avril 2022 à 20:36
Voici le code :

<?php
require_once('../inc/connexion.php');


if(!empty($_POST)) {

 $errors =array();
     

    // $lastname = $_POST['lastname'];



        $db = getDB();
  $req = $db->prepare ('SELECT id_customers FROM customers WHERE lastname = ?');
  $req->execute(array($_POST['lastname']));
  $lastname =$req->fetch();

        if(empty($_POST['lastname']) || ($lastname == $_POST['lastname'])) {
  return true; 

     }

  

    $lastnamelength = (strlen( $_POST['lastname']));
    if($lastnamelength <=2) {
    $errors  ['lastname']= "le nom ne peut pas faire moins de 3 caracteres"; 

      } 
    
       if(!preg_match("#^[A-Za-z]+(?:[\s-][a-zA-Z]+)*$#", $_POST['lastname'] )) {
    $errors ['lastname'] = "On ne peut peux pas rentrer de caractères numérique dans le champs du nom";

  }


   if(empty($_POST['email']) || !preg_match('#^[\w.-]+@[\w.-]+\.[a-zA-Z]{2,6}$#', $_POST['email'])) {
  $errors ['email'] = "Votre email n'est pas valide";

 }  else {
  $db = getDB();
  $req = $db->prepare ('SELECT id_customers FROM customers WHERE email = ?');
  $req->execute(array($_POST['email']));
  $email =$req->fetch();
  if($email) {
   $errors ['email'] = "cet email existe deja";

  }

    }


         if($_POST['city'] =="") {
    return true;
    }  
 if(!preg_match("#^[A-Za-z]+(?:[\s-][a-zA-Z]+)*$#", $_POST['city'] )) {
            $errors ['city']  = "La ville  n'est pas valide"; 
    return false;
  }
   if($_POST['zipcode'] =="") {
    return true;
    }   
 if(!preg_match("#^[0-9]{5}$#", $_POST['zipcode'] )) {
            $errors ['zipcode']  = "Le code postal n'est pas valide"; 
    return false;
}

 if(empty($errors)) {

  if(isset($_POST['updateCustomers'])) {

   $id_customers = $_POST["id_customers"];

   $showin = addslashes (ucwords($_POST['showin']));
   $firstname = addslashes (ucwords($_POST['firstname']));
   $lastname = addslashes (ucwords($_POST['lastname'])); 
   $address = addslashes (ucwords($_POST['address'])); 
   $zipcode = ($_POST['zipcode']); 
   $city = addslashes (ucwords($_POST['city'])); 
   $email = strtolower($_POST['email']);
   $phone = strtolower($_POST['phone']);
   $mobile = strtolower($_POST['mobile']);


   $resultat = "UPDATE customers  SET
   showin='$showin'
   ,firstname='$firstname'
   ,lastname='$lastname'
   ,address='$address'
   ,zipcode='$zipcode'
   ,city='$city'
   ,email='$email'
   ,phone='$phone'
   ,mobile='$mobile'


   WHERE id_customers='$id_customers'";

            // Prepare statement
   $stmt = $db->prepare($resultat);

   $stmt->bindParam(':showin', $_POST['showin']);
   $stmt->bindParam(':firstname', $_POST['firstname']);
   $stmt->bindParam(':lastname', $_POST['lastname']);
   $stmt->bindParam(':address', $_POST['address']);
   $stmt->bindParam(':email', $_POST['email']);
   $stmt->bindParam(':zipcode', $_POST['zipcode']);
   $stmt->bindParam(':city', $_POST['city']);


            // execute  query
   $stmt->execute();

   //header('Location: ../form/customersProfile.php?id_customers='.$_GET["id_customers"].'');

  }  


// debug ($errors);

 } 



} 

?>
0
jordane45 Messages postés 38266 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 2 novembre 2024 4 694
8 avril 2022 à 21:08
Tant que le champs lastname reste vide, je ne peux remplir aucun autre champs

C'est normal ... vu que tu fais
  if(empty($_POST['lastname']) || ($lastname == $_POST['lastname'])) {
  return true; 

Là .. si le champ est vide .. tu sors de ta fonction...
0
Astolpho Messages postés 73 Date d'inscription vendredi 8 avril 2022 Statut Membre Dernière intervention 12 juin 2024
Modifié le 9 avril 2022 à 17:22
je l'ai mis comme ça, je ne peux pas entrer de lastname vide , j'ai le message des 3 caractères. C'est peut-être contradictoire d'autoriser un champs vide et de mettre une condition d'un nom de 3 caractères. Un champs vide fait forcément moins de 3 caractères

 if(is_null($_POST['lastname']) || ($lastname == $_POST['lastname'])) {

  }
  //return true; 

  $lastnamelength = (strlen( $_POST['lastname']));
   if ($lastnamelength <=2) {
   $errors  ['lastname']= "le nom ne peut pas faire moins de 3 caracteres"; 

   
  }
0
Astolpho Messages postés 73 Date d'inscription vendredi 8 avril 2022 Statut Membre Dernière intervention 12 juin 2024
9 avril 2022 à 19:09
C'est beaucoup plus cohérent comme ça, c'est plus propre. Je vais regarder tout ça à tête reposé.
Merci beaucoup
0
Salut, complétement inutile de faire ça côté serveur donc après envoi des données...
Il faut le faire en JavaScript ce genre de validation: avant que les données du formulaire soient envoyées et si c'est pas bon pas d'envoi au PHP = pas de temps de latence+rechargement de la page et de travail du serveur sur des données qui ne peuvent pas servir.
Vous évitez de faire 2 requêtes serveur et leur traitement : une fois lors de la réception des données envoyées, une fois pour envoyer un message d'avertissement sur la page qui indique l'erreur ou manque des champs à remplir.

Il reste toutefois à vérifier les champs en PHP mais là c'est pour une question de sécurité mais si le formulaire n'envoie les données que quand celles ci sont correctement remplies vous y gagnez déjà beaucoup.
0
jordane45 Messages postés 38266 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 2 novembre 2024 4 694 > DoctorHow
Modifié le 10 avril 2022 à 07:47
Inutile ??
Sachant que le js est accessible par l'utilisateur...il peut envoyer ce qu'il veut...
Il faut Toujours vérifier côté serveur !

Et qui te dit qu'il n'a pas déjà mis en place la vérification côté client en js ?
Sans oublier les patterns dans les input pour le format des champ qui est possible également...
0
Astolpho Messages postés 73 Date d'inscription vendredi 8 avril 2022 Statut Membre Dernière intervention 12 juin 2024
11 avril 2022 à 15:51
Je compte utiliser les patterns input, la vérification PHP, c'est au cas ou.
0