Bonsoir,

Je me demandais si ce code protégais plutôt bien un formulaire de contacte.

if (isset($_POST) && !empty($_POST)){
        $name = addslashes($_POST'name']);
        $url = addslashes("http://".$_POST'url']."/");
        $email = addslashes($_POST'email']);
        $objet = addslashes($_POST'objet']);
        $message    = addslashes($_POST'message']);
        $name = str_replace(" ", "", $name);
        $objet = str_replace(" ", "", $objet);
        function EMail($adresse){  
            if(preg_match('#^\w.-]+@\w.-]+\.[a-zA-Z]{2,6}$#',$adresse)){
                return true;
            }  
           else{
                return false;
           }
        }
        if(strlen($name) <= 20){

            if (filter_var($url, FILTER_VALIDATE_URL)) {
                if(EMail($email) == true ){
                    if(strlen($objet) <= 255){
                        echo "Envoyer le message";
                    }else{
                        echo '<p class="alert alert-error" >Objet trop grand;</p>';
                    }
                }else{
                    echo '<p class="alert alert-error" >Email incorect</p>';
                }
            }else {
                echo 'Cette URL a un format non adapté.';
            }
        }else{
            echo '<p class="alert alert-error" >Nom trop grand</p>';
        }
    }

10 réponses


vavoir
Auteur
Réponse acceptée

Si je résume je devrai faire sa:

<?php
function validate($name = null, $adresse = null, $objet = null){
    $error = array();
    if(!filter_var($email, FILTER_VALIDATE_EMAIL)){
        // vérifier tout les champs 1 par 1, ici pour l'exemple j'ai mit que l'email
    }else{
        $error] = "Email incorect";
        // Si y a une erreur on l'ajouter au tableau;
    }

}

if (isset($_POST) && !empty($_POST)){
    extract(array_map('addslashes', $_POST));
    validate($name, $adresse, $objet);
    // plus affichage du formualire avec les valeur post et les message d'erreur.
}

Je teste et j'edit après.

EDIT:

Voila le code:

function validate($name = null, $email = null, $message = null){

        $error = array();
        $name = str_replace(" ", "", $name);
        if(strlen($name) > 20){
            $error] = "Nom trop grand (20 caractères maximum)";
        }elseif(strlen($name) < 3){
            $error] = "Nom trop petit (3 caractères minimum)";
        }
        if(!filter_var($email, FILTER_VALIDATE_EMAIL)){
           $error]  = "Email incorect";
        }
        if(empty($message)){
            $error] = "Vous devez remplir le champs message !";
        }
        return $error;

    }

    if (isset($_POST) && !empty($_POST)){
        extract(array_map('addslashes', $_POST));
        $validation = validate($name, $email, $message);
        if(empty($validation)){
            echo "Enregistrer dans la bdd";
        }
        else{
            echo "afficher error";
        }
    }

J'ai juste un petit détails à réglé j'ai un select avec une valeur "autre" et je souhaite que lorsque le visiteur sélectionne cette valeur "autre" q'un champs apparaisse.

Déjà tes 5 premières lignes tu peux remplacer par: extract(array_map('addslashes', $_POST));

Ça va extraire les valeurs du tableau dans des valeurs portant le nom de la clé.

Par exemple si tu as un tableau comme ceci $a = array('name' => 'Nairolf'); faire extract($a) revient à $name = $a'name'].

Ensuite array_map permet d'appliquer une fonction à chaque valeur d'un tableau.

Bon bien sûr tu devras modifier la valeur url ensuite, d'ailleurs je trouve étrange que tu dois rajouter http:// devant, tu demandes quoi dans ton champ url?

Et après les str_replace(" ",""), je vois pas en quoi ça dérange d'avoir des espaces dans l'objet et le nom pour un formulaire de contact. Si c'est juste pour retirer les espaces en début et fin de chaine, il y a trim().

Puis ici: if(EMail($email) == true ) tu utiles une fonction email qui retourne true ou false, donc déjà pas besoin de mettre == true. Mais ensuite même pas besoin d'utiliser une fonction pour ça car juste faire if(preg_match('#^\w.-]+@\w.-]+.[a-zA-Z]{2,6}$#',$email)) revient à la même chose vu que ça retourne 1 s'il trouve quelque chose.

Mais le pire c'est que tu utilises le filter_var pour l'url alors qu'il existe la même chose pour l'email: FILTER_VALIDATE_EMAIL

Après pour tes conditions, elles sont bien, juste le problème si le nom et le mail sont pas bon, la personne verra le message l'un à la suite de l'autre, donc pour corriger ça risque d'être ennuyeux pour corriger les infos s'il faut toujours renvoyer pour vérifier.

Enfin je sais pas si tu veux que le message soit formuler comme le gars veux, genre s'il met <h1> mon titre </h1> que le h1 soit interprété, mais si tu ne veux pas, rajoute la fonction htmlentities

Un petit code pour le fun..

<?php
function validate($name = null, $adresse = null, $objet = null){
    $i = 0;
    $error = '';
    $p1 = '<p class="alert alert-error" >';
    $p2 = '</p>';
    if ($name == null || $adresse == null || $objet == null) {
        return $p1.'Veillez compléter tous les champs'.$p2;
    }
    $name = str_replace(" ", "", $name);
    $objet = str_replace(" ", "", $objet);
    if(strlen($name) > 20){
        ++$i;
        $error .= $p1.'Nom trop grand (20 caractères maximum)'.$p2;
    }elseif(strlen($name) < 2){
        ++$i;
        $error .= $p1.'Nom trop petit (2 caractères minimum)'.$p2;
    }
    if (!filter_var($url, FILTER_VALIDATE_URL)) {
        ++$i;
        $error .= $p1.'Cette URL a un format non adapté.'.$p2;
    }
    if(!filter_var($email, FILTER_VALIDATE_EMAIL)){
        ++$i;
        $error .= $p1.'Email incorect'.$p2;
    }
    if(strlen($objet) > 255){
        ++$i;
        $error .= $p1.'Objet trop grand'.$p2;
    }
    if($i == 0){
        return "Envoyer le message";
    }else{
        return $error;
    }
}
if (isset($_POST) && !empty($_POST)){
    extract(array_map('addslashes', $_POST));
    validate($name, $adresse, $objet);
}

Tu peux aller plus loin en créant une fonction error comme ceci:

function error($msg) {
  $i++;
  $error .= '<p class="alert alert-error" >'.$msg.'</p>';  
}

Comme ça il n'y plus qu'à faire error('Mon message super bien') dans les conditions, tu utilises comme ça moins de variables, et c'est plus compact et pratique.

Bien jouer!!

Je suis debutant en PHP j'ai réalise un formaulaire en PHP/mysql et je ne vois pas ou est l'erreur j'ai beau cherche depuis une semaine, je vois vraiment pas

La page Verif.php

<?php
//verifaction des champs
if (isset($_POST'submit']))
{
$login=htmlspecialchars((trim($_POST'login']));
$mail=htmlspecialchars((trim($_POST'mail']));
$password=htmlspecialchars((trim($_POST'password']));
$repetpassword=htmlspecialchars((trim($_POST'repetpassword']));
if($login&&$mail&&$password&&$repetpassword)
{

}else echo"Veuillez saisir tous les champs";

}?>

La page index.php

<form id="formulaire" action="verif.php" method="POST">
<fieldset>
<legend>Tchate</legend>
<p><label>Login</label><input type="text" name="login"size="60" placeholder="login" </p>
<p><label>Email</label><input type="email" name="mail"size="60" placeholder="email" /></p>
<p><label>motdepass</label><input type="password" name="pass"size="60" placeholder="mot de pass" /></p>
<p><label>Repete mot de pass</label><input type="password"size="60" name="repetpass" placeholder="motpass" /></p>
<input type="submit" values="Envoyer" name="submit" size="30"/>
</fieldset>
</form>

J'ai toujour la meme erreur sur $login

Parse error: syntax error, unexpected ';' in C:\wamp\www\test\formulaire\verif.php on line 6

SVP

Mets dans des balises codes parce qu'on voit rien. Ensuite cette erreur c'est que tu as oublié une parenthèse ou accolades quelques part au niveau de cette ligne ou au dessus ;) .

C'est parce que dans ton index, le nom du champ password est différent de ce lui de la vérif:

$password=htmlspecialchars((trim($_POST'password']));

et

<p><label>motdepasse</label><input type="password" name="pass" size="60" placeholder="mot de passe" /></p>

Corrige en:

<p><label>motdepasse</label><input type="password" name="password" size="60" placeholder="mot de passe" /></p>

idem pour le repetpassword.

Et t'as un soucis d'accolade:

<?php
//verifaction des champs
    if (isset($_POST'submit']))
    {
    $login=htmlspecialchars((trim($_POST'login']));
    $mail=htmlspecialchars((trim($_POST'mail']));
    $password=htmlspecialchars((trim($_POST'password']));
    $repetpassword=htmlspecialchars((trim($_POST'repetpassword']));
       if($login&&$mail&&$password&&$repetpassword){
        }
        else{
         echo"Veuillez saisir tous les champs";
        }
    }
?>

Moi je vois surtout ça:

$login=htmlspecialchars((trim($_POST'login']));
 $mail=htmlspecialchars((trim($_POST'mail']));
 $password=htmlspecialchars((trim($_POST'password']));
 $repetpassword=htmlspecialchars((trim($_POST'repetpassword']));

Pleins de parenthèses inutiles 3 parenthèses au débuts sur chaque ligne et deux à la fin.
Donc corrige en ça:

$login=htmlspecialchars(trim($_POST'login']));
$mail=htmlspecialchars(trim($_POST'mail']));
$password=htmlspecialchars(trim($_POST'pass']));
$repetpassword=htmlspecialchars(trim($_POST'repetpass']));
vavoir
Auteur

En attendant je ne sait toujours pas comme afficher un champs supplémentaire avec jquery ^^
Je sais juste qu'il faut récupéré la valeur du select pour la comparer et ainsi afficher le champs.

var select = //recuperer valeur du select
    if(select == "autre"){
        // ajouter un label + un champs
    }