8437 sujets

Développement web côté serveur, CMS

Bonsoir,
Je me permets de vous demander un peu d'aide car je bloque dans la vérification de mon formulaire avant envoi des informations à la bdd.
Côté client je fais les vérifications "visuelles" en HTML5 / CSS3 mais côté serveur je souhaite vérifier :
-que les champs ne sont pas vides
-qu'au moins une case checkbox ou radio est cochée
-que l'utilisateur ne pourra pas entrer n'importe quoi au niveau du nom, prénom etc. donc vérification de champs texte et numérique.
Pour les deux premiers ça fonctionne bien mais lorsque je veux rajouter un preg_match que je maitrise très mal, j'ai systématiquement un conflit. Soit le formulaire se valide alors qu'il ne devrait pas, soit il devrait et ne le fait pas.

Voici le code:

// Sécurisation lorsque des requetes dépendent les unes des autres, début de la transaction
mysql_query("SET AUTOCOMMIT=0");


// on vérifie que le formulaire a bien été posté 
if ((isset($_POST["formulaire"])) && ($_POST["formulaire"] == "formulaire")) {
    

    // on vérifie que les champs à remplir ne sont pas vide (nom, prénom, matricule, service, date et qu'au moins une case checkbox ou radio est cochée)

    if(($_POST['nom'] !="") && ($_POST['prenom'] !="") && ($_POST['matricule'] !="") && ($_POST['service'] !="") && ($_POST['date'] !="" && ($_POST['select'] !="0")) &&
        (isset($_POST['tel']) || isset($_POST['messagerie']) || isset($_POST['reseau']) )) {

mysql_query("START TRANSACTION");

// ici j'ai mes requêtes SQL d'insertion dans la base de donnée. Si besoin je peux les ajouter.

// fin de la transaction
        $commit = mysql_query('COMMIT');
               
 // Puisque les champs sont remplis lorsque l'on poste le formulaire, un message de validation s'affiche
        $affichage .= '<div class="success message" style="top: 0px;">
                            <h3>Félicitation!</h3>
                            <p>Votre formulaire a été envoyé avec succès.</p>
                       </div>';
        
            } else { 

        // Sinon, donc si un des champs est vide, ou qu'aucune case n'est cochée
        $affichage .= '<div class="error message" style="top: 0px;">
                            <h3>Erreur, votre formulaire n\'est pas valide</h3>
                            <p>Merci de vérifier les champs à remplir et les cases à cocher.</p>
                       </div>';

           
        
    }	// fin du if vérif si les champs ne sont pas vides
         
} // fin du if vérif que le formulaire est posté


voici le code pour la vérif de la saisie par l'utilisateur:

if   ((preg_match("/([^A-Za-z])/",$_POST['nom'])) && (preg_match("/([^A-Za-z])/",$_POST['prenom'])) && (preg_match("/([^A-Za-z])/",$_POST['matricule'])) &&
(preg_match("#^[0-9]$#", $_POST['matricule']))) {}


C'est là ou je bloque. J'ai essayé de mettre mon preg_match à plusieurs endroit mais ça ne fonctionne pas, exemple:

if (vérif formulaire) {
	if (vérif champs vides et case cochée){
		if (preg_match) {

			// requetes sql

		}
	}
}

// autre essai
if (vérif formulaire) {
	if (preg_match) {
		if (vérif champs vides et case cochée){

			// requetes sql
		}
	}
}


Est-ce que je m'y prends mal?
Pouvez- vous me m'aiguiller un peu et me dire également si mon code est lourd par exemple?
Merci par avance aux personnes qui voudront bien m'aider.

Bonne soirée
Biscott'
Oui, je pense que tu t'y prends mal.

Pour vérifier si une valeur (et donc un champs) est vide, il faut utiliser la fonction empty() de PHP.

Pour les cases à cocher, il faut vérifier si la case a été cocher grâce à isset(). Cette fonction retourne true si la variable existe (car une variable peut exister mais être vide, voilà la différence entre empty/isset).

Regarde comment utiliser ces fonctions sur le site php.net, c'est ultra simple. Smiley smile

Exemple, pour un champs qui a pour nom "nom", voici comment faire dans la page de validation :


if(!empty($_POST['nom'])) {
echo 'Ok';
}
Bonsoir Gaylord.P,
Merci d'avoir répondu. Smiley smile
Effectivement je me suis emmêlée dans mes isset / empty.
J'ai repris le code et normalement c'est propre :

if(((!empty($_POST['nom'])) && (!empty($_POST['prenom'])) && (!empty($_POST['matricule'])) && (!empty($_POST['service'])) && (!empty($_POST['date']))) && (isset($_POST['tel']) || isset($_POST['messagerie']) || isset($_POST['reseau']) )) {

Maintenant c'est de rajouter la condition pour la vérification de la saisie qui me gène. Il faut que je vérifie que les champs nom, prénom,service et matricule soient saisis correctement. D'après mes recherches c'est un preg_match et je pense que ça donne ça:

if ((preg_match("/([^A-Za-z])/",$_POST['nom'])) && (preg_match("/([^A-Za-z])/",$_POST['prenom'])) && (preg_match("/([^A-Za-z])/",$_POST['service'])) && (preg_match("#^[0-9]$#", $_POST['matricule']))) {}

Mais pas moyen de l'insérer pour que toutes les conditions soient vérifiées. J'ai toujours une erreur comme je l'expliquais au dessus.
Est-ce que je m'y prends mal là aussi?
Merci par avance.

Bonne soirée
Re,

Au choix : tout vérifier d'un coup ou un par un.
J'ai plutôt tendance à vérifier un par un, ainsi tu peux afficher un message d'erreur en fonction de l'erreur précise. Pour tes vérifications, à coup d'œil ça semble correct.

Pense également aux filtres qui te facilite grandement la tache : http://fr.php.net/manual/fr/function.filter-var.php
Cliques sur "types de filtre" et tu verras que tu peux vérifier facilement si une chaîne est bien numérique*, décimale, une adresse e-mail, etc ...

* : attention avec les données de type numérique, elles sont soumises à ton système (32 ou 64 bits) : pour "petits" nombres (1, 10, 100, 1000, 10000, 100000, etc.) ça fonctionne mais moi, par exemple, en 32bits, mon système ne parvenait pas à me détecter une chaîne de 13 caractères comme numérique. Je suis donc repassé au preg_match pour ce genre de vérif. A adapter selon tes besoins.
Bonjour et meilleurs voeux pour 2012,

Merci pour ces indications. Je vais effectivement faire un message distinct pour les champs de vérification de saisie. Pour le reste je pense laisser tel quel vu que j'ai déjà une vérification "visuelle" coté client.
Pour les filtres merci du lien j'ai lu avec beaucoup d'attention, c'est effectivement pratique.

Pour le moment je n'arrive toujours pas a placer toutes mes conditions de vérification sans générer une erreur.
Erreur de débutante probablement, je cherche toujours!

Bonne journée!
Bonjour Su4p,
Je te remercie de ton intervention. Effectivement je n'ai pas pris en compte les accents ni le -
il me semble que c'est correct comme ça:

if (preg_match("/([^A-Za-zàáâãäåçèéêëìíîïðòóôõöùúûüýÿ-])/", $_POST['nom'])) { 


Par contre j'ai toujours mon conflit dans mes conditions.
Vu que je veux empecher une écriture incorrecte dans la bdd j'ai pensé faire la fameuse vérif:
si le formulaire existe et est posté
si les champs ne sont pas vides et qu'au moins une case est cochée
si le nom est bien saisi
alors ecrire dans la bdd
sinon afficher une erreur

if ((isset($_POST["formulaire"])) && ($_POST["formulaire"] == "formulaire")) {
	
	if(((!empty($_POST['nom'])) && (!empty($_POST['prenom'])) && ...{
			
			if (preg_match("/([^A-Za-zàáâãäåçèéêëìíîïðòóôõöùúûüýÿ-])/", $_POST['nom'])) { 
				mysql_query("START TRANSACTION");
				... requete sql
				
			}else{
				 $affichage .= '<div>Nom invalide </div>';
			}
	// Tout est ok, un message de validation s'affiche
		 $affichage .= '<div class="success message" style="top: 0px;">
		                	<h3>Félicitation!</h3>
		                	<p>Votre formulaire a été envoyé avec succès.</p>
		                </div>';
        
     } else { 

        // Sinon
        $affichage .= '<div class="error message" style="top: 0px;">
                            <h3>Erreur, votre formulaire n\'est pas valide</h3>
                            <p>Merci de vérifier les champs à remplir et les cases à cocher.</p>
                       </div>';
     }
}     


Je vois bien que mon raisonnement est faux puisqu'il m'affiche l'erreur de nom mais valide quand même le formulaire.
Pouvez vous me mettre sur la piste?
Est ce qu'il y a de l'idée ou dois-je penser la vérification d'une manière différente?

Merci par avance.

Bonne soirée
As tu résolu ton problème ?

Sinon perso je créé une variable d'erreur (array (id+libellé)) lorsque j'en détecte une.

Si ma variable est vide je peux valider le formulaire sinon j'affiche mon tableau de libellé(s) d'erreur(s).

      // Affichage du div du message d'erreur si un champs est KO
      if(isset($_SESSION['Erreur']) && !empty($_SESSION['Erreur']))
      {
        // Calcul du nombre d'erreurs
        $I_NbErreur = count($_SESSION['Erreur']['id']);

        // Affichage de la liste des erreurs
        echo"<div class='form_errors'>";
        foreach ($_SESSION['Erreur']['label'] as $I_IdErreur => $S_TexteErreur)
        {
          $S_IdErreur = $_SESSION['Erreur']['id'][$I_IdErreur];
          echo"<label for='$S_IdErreur'>$S_TexteErreur</label>";
        }
        echo"</div>";
      }
      // Fin du div d'erreur


En espérant que ça puisse t'aider. Smiley cligne
Bonsoir Bilgor Le Rouge,

Je m'excuse, je te réponds un peu tardivement mais non je n'avais toujours pas trouvé ma solution.
Ce que tu me proposes est très intéressant, comme je débute je n'avais pas du tout envisagé cette solution et je devrais pouvoir m'en sortir grâce à toi!

Je m'y attaque et je reviens pour je l'espère mettre ce post en résolu. Smiley murf

Merci encore!