Page 1 sur 2

Comment ne pas afficher le style d'une alerte php vide ?

Posté : 04 août 2015, 09:09
par pierrewebaster
Bonjour à tous

J'utilise un formulaire d'envoi de mail basique à partir de cet exemple :
http://a-pellegrini.developpez.com/tutoriels/php/mail/, Le récapitulatif complet du script est tout en bas de la page.

Dans lequel j'ai mis en forme cette alerte comme ceci :
<?php
if (!empty($alert))
{
    echo '<div class="col-sm-12"><div style="width:50%; margin:0 auto"><p style="color:#a69a91; background-color:#660000; text-align:center; font-size:16px; border-radius: 4px; margin: 10px 0; padding:10px;">'.$alert.'</p></div></div>';
}
?>
Ca fonctionne bien, mais quand on valide le formulaire et qu'il n'y pas eu d'erreur, la couleur rouge du fond du paragraphe :

Code : Tout sélectionner

<p... background-color:#660000; ...></p>
s'affiche quand même, vide.

Y aurai-il une syntaxe permettant que rien ne s'affiche quand il le message a bien été envoyé.
Je suis archi débutant en php, merci beaucoup pour votre aide

Re: Comment ne pas afficher le style d'une alerte php vide ?

Posté : 04 août 2015, 09:14
par xTG
Si le bloc s'affiche c'est que $alert n'est pas vide.
Si vous ne voyez pas de texte c'est que ce sont des caractères non imprimables.
Pour vérifier cela vous pouvez utiliser la commande suivante qui va afficher la chaîne et le nombre de caractères :
var_dump($alert);
Si $alert est bien vide c'est que vous avez ce code ailleurs dans votre page et ce n'est pas celui que vous nous montrez.
:)

Re: Comment ne pas afficher le style d'une alerte php vide ?

Posté : 04 août 2015, 09:53
par pierrewebaster
Bonjour et merci xTG de vous intéresser à mon problème

Ou devrais-je insérer la ligne
var_dump($alert);
Mais en effet, quand je regarde le source de ma page une fois que le message a été envoyé, j'ai bien un espace dans le <p>

Code : Tout sélectionner

<p style="color:#a69a91; background-color:#660000;...."> </p>
mais je ne vois pas d’où vient cet espace...
Je ne sais pas si ça peut venir de là, mais cette $alert doit servir à différents message : Email non valide, champs vide, Message envoyé...

J'ai vérifié tout mon code, je ne vois pas ou il pourrait y avoir un espace...
Voici ma page contact.php :
<?php
/* Si le formulaire est envoyé alors on fait les traitements */
if (isset($_POST['envoye']))
{
    /* Récupération des valeurs des champs du formulaire */
    if (get_magic_quotes_gpc())
    {
      $nom	     	= stripslashes(trim($_POST['nom']));
      $expediteur	= stripslashes(trim($_POST['email']));
      $message		= stripslashes(trim($_POST['message']));
    }
    else
    {
      $sujet 		= "Demande de contact depuis mon site";
      $nom		= trim($_POST['nom']);
      $expediteur	= trim($_POST['email']);
      $message		= trim($_POST['message']);
      $message 		= utf8_decode($message);
    }
 
    /* Expression régulière permettant de vérifier si le 
    * format d'une adresse e-mail est correct */
    $regex_mail = '/^[-+.\w]{1,64}@[-.\w]{1,64}\.[-.\w]{2,6}$/i';
 
    /* Expression régulière permettant de vérifier qu'aucun 
    * en-tête n'est inséré dans les champs */
    $regex_head = '/[\n\r]/';
 
    /* Si le formulaire n'est pas posté de notre site on renvoie 
    * vers la page d'accueil */
    if($_SERVER['HTTP_REFERER'] != 'http://www.monsite.com/contact.php')
    {
      header('Location: http://www.monsite.com'&#41;;
    }
    /* On vérifie que tous les champs sont remplis */
    elseif (empty($nom) 
           || empty($expediteur) 
           || empty($message))
    {
      $alert = 'Tous les champs doivent &eacute;tre renseign&eacute;s';
    }
    /* On vérifie que le format de l'e-mail est correct */
    elseif (!preg_match($regex_mail, $expediteur))
    {
      $alert = 'L\'adresse email : '.$expediteur.' n\'est pas valide';
    }
    /* On vérifie qu'il n'y a aucun header dans les champs */
    elseif (preg_match($regex_head, $expediteur) 
            || preg_match($regex_head, $nom) 
            || preg_match($regex_head, $sujet))
    {
        $alert = 'En-t&ecirc;tes interdites dans les champs du formulaire';
    }
    /* Si aucun problème et aucun cookie créé, on construit le message et on envoie l'e-mail */
    elseif (!isset($_COOKIE['sent']))
    {
        /* Destinataire (votre adresse e-mail) */
        $to = '[email protected]';
 
        /* Construction du message */
        $msg  = ''."\r";
        $msg .= 'Ce mail a été envoyé depuis http://www.wambaugh.us par :'."\r\n\r\n";
        $msg .= ''.$nom."\r\n\r\n";
        $msg .= 'Voici son message :'."\r\n";
        $msg .= ''."\r";
        $msg .= $message."\r\n";
 
        /* En-têtes de l'e-mail */
        $headers = 'From: '.$nom.' <'.$expediteur.'>'."\r\n\r\n";
 
        /* Envoi de l'e-mail */
        if (mail($to, $sujet, $msg, $headers))
        {
            $alert = '<p class="alert-success">Merci pour votre message, j\'y r&eacute;pondrai d&egrave;s que possible.</p>';
 
            /* On crée un cookie de courte durée (ici 120 secondes) pour éviter de 
            * renvoyer un mail en rafraichissant la page */
            setcookie("sent", "1", time() + 120);
 
            /* On détruit la variable $_POST */
            unset($_POST);
        }
        else
        {
            $alert = '<p class="alert-info">Erreur d\'envoi de l\'e-mail</p>';
        }
     }
    /* Cas ou le cookie est créé et que la page est rafraichie, on détruit la variable $_POST */
    else
    {
        unset($_POST);
    }
}
?>

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <!-- The above 3 meta tags *must* come first in the head; any other head content must come *after* these tags -->
    <meta name="description" content="">
    <meta name="author" content="">
    <link rel="icon" href="favicon.ico">

    <title>Contact</title>

    <!-- Bootstrap core CSS -->
    <link href="bootstrap/css/bootstrap.css" rel="stylesheet">

    <!-- Custom styles for this template -->
    <link href="bootstrap/css/navbar-fixed-top.css" rel="stylesheet">

    <!-- Just for debugging purposes. Don't actually copy these 2 lines! -->
    <!--[if lt IE 9]><script src="../../assets/js/ie8-responsive-file-warning.js"></script><![endif]-->
    <script src="../../assets/js/ie-emulation-modes-warning.js"></script>

    <!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->
    <!--[if lt IE 9]>
      <script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
      <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
    <![endif]-->
  </head>
<body>
    <!-- Fixed navbar -->
    <nav class="navbar navbar-default navbar-fixed-top">
      <div class="container">
        <div class="navbar-header">
          <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar" aria-expanded="false" aria-controls="navbar">
            <span class="sr-only">Toggle navigation</span>
            <span class="icon-bar"></span>
            <span class="icon-bar"></span>
            <span class="icon-bar"></span>
          </button>
          <a class="navbar-brand" href="index.html"><img src="images/logo.png" width="142" height="60"></a>
        </div>
        <div id="navbar" class="navbar-collapse collapse">
          <ul class="nav navbar-nav">
            <li><a class="Linknav" href="sculptures.html">Sculptures</a></li>
            <li><a class="Linknav" href="installations.html">Installations</a></li>
            <li><a class="Linknav" href="dessin.html">Dessins</a></li>
            <li><a class="Linknav" href="projets.html">Projets</a></li>
            <li><a class="Linknav" href="redidences.html">Résidences</a></li>
            <li><a class="Linknav" href="prix.html">Prix</a></li>
            <li><a class="Linknav" href="bio.html">Bio</a></li>
            <li><a class="Linknav" href="lien.html">Liens</a></li>
            <li class="active"><a class="Linknav" href="contact.php">Contact</a></li>
            </ul>    
        </div><!--/.nav-collapse -->
      </div>
    </nav>
    <div class="container">
        <div class="contenuContact">
<?php
if (!empty($alert))
{
    echo '<div class="col-sm-12"><div class="contact"><p style="color:#a69a91; background-color:#660000; text-align:center; font-size:16px; border-radius: 4px; margin: 10px 0; padding:10px;">'.$alert.'</p></div></div>';
}
?>
<form action="contact.php" method="post">
	<div class="col-sm-12"><div class="contact"><input type="text" id="nom" name="nom"  class="form-control" placeholder="Nom" 
        	value="<?php echo (isset($_POST['nom'])) ? $nom : '' ?>" 
        /></div></div>
	<div class="col-sm-12"><div class="contact"><input type="text" id="email" name="email"  class="form-control" placeholder="Adresse email"
        	value="<?php echo (isset($_POST['email'])) ? $expediteur : '' ?>"
        /></div></div>
	<div class="col-sm-12"><div class="contact"><textarea style="width:100%" id="message" name="message" class="textarea" placeholder="Message"><?php echo (isset($_POST['message'])) ? $message : '' ?></textarea></div></div> 
	<div class="col-sm-12"><div  class="contact" style="text-align:center"><input  class="btn btn-default" type="submit" name="envoye" value="Envoyer" /></div>
</div>
</form>
  </div> 
</div><!-- /container -->
    <!-- Bootstrap core JavaScript
    ================================================== -->
    <!-- Placed at the end of the document so the pages load faster -->
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
    <script src="bootstrap/js/bootstrap.min.js"></script>
    <!-- IE10 viewport hack for Surface/desktop Windows 8 bug -->
    <script src="../../assets/js/ie10-viewport-bug-workaround.js"></script>
</script>
  </body>
</html>
Merci encore

Re: Comment ne pas afficher le style d'une alerte php vide ?

Posté : 04 août 2015, 10:35
par xTG
Je n'ai rien vu dans votre code qui permettrai d'avoir cet espace.
Au pire elle n'est pas initialisée, vous pouvez donc rajouter en début de page :
$alert = '';
Histoire d'être plus propre.

Le var_dump est à mettre juste avant votre if de test pour afficher le contenu de cette variable à cet instant du script.

Ce qui peut arriver aussi c'est que vous ayez l'option du php.ini (dont je n'ai plus le nom en tête) qui permet d'appeler les globales par leur nom d'index ($_POST['test'] => $test).

Essayez ceci pour en être sûr :
var_dump($_POST['alert']);
var_dump($_GET['alert']);
var_dump($_COOKIE['alert']);
var_dump($_SESSION['alert']);
Si l'un de ces affichages renvoie une variable contenant un caractère vide c'est une piste.

Re: Comment ne pas afficher le style d'une alerte php vide ?

Posté : 04 août 2015, 10:58
par pierrewebaster
J'ai ajouté
$alert = '';
juste après le <?php

et j'ai testé ceci, Je ne sais pas si c'est le bon endroit pour insérer le var-dump :
/* Envoi de l'e-mail */
        var_dump($alert);
        if (mail($to, $sujet, $msg, $headers))
        {
Résultat, il s'affiche :
string(0) ""

Au même endroit, j'ai testé de mettre
var_dump($_POST['alert']);
var_dump($_GET['alert']);
var_dump($_COOKIE['alert']);
var_dump($_SESSION['alert']);
et j'obtiens
NULL NULL NULL NULL

Re: Comment ne pas afficher le style d'une alerte php vide ?

Posté : 04 août 2015, 11:34
par xTG
A priori la chaine est vide.
Donc votre balise ne doit plus s'afficher. ;)

Si elle s'affiche c'est que ce n'est pas cette portion de code qui s'exécute.
Vous pouvez utiliser la commande echo pour afficher des traces pour vérifier où vous vous trouvez et ce qui s'exécutes ou non.

Re: Comment ne pas afficher le style d'une alerte php vide ?

Posté : 04 août 2015, 12:09
par pierrewebaster
J'ai fait un nouvel essai en plaçant le var_dump ici :
<?php
var_dump($alert);
if (!empty($alert))
{
    echo '<div class="col-sm-12"><div class="contact"><p style="color:#a69a91; background-color:#660000; text-align:center; font-size:16px; border-radius: 4px; margin: 10px 0; padding:10px;">'.$alert.'</p></div></div>';
}
?>
Le formulaire me renvoi alors un
string(141) "
qui semble correspondre au message de validation d'envoi du mail, voir capture ci-dessous :
Image

Re: Comment ne pas afficher le style d'une alerte php vide ?

Posté : 04 août 2015, 12:12
par pierrewebaster

Re: Comment ne pas afficher le style d'une alerte php vide ?

Posté : 04 août 2015, 13:40
par xTG
Ah je viens de comprendre avec ça...
Tu utilises en fait la même variable pour afficher les erreurs et le succès de l'opération.
C'est possible, mais auquel cas il faut que tout le style soit contenu dans la variable.

Exemple de ce que tu fais :
if( ... )
{
   $alert = '<b>OK</b>'
}
else
{
   $alert = 'KO';
}

if( !empty($alert) )
{
   echo '<i>' . $alert . '</i>';
}
Ici le KO est bien en italique, mais le OK est en gras + italique. ;)

Il faut donc faire ainsi :
if( ... )
{
   $alert = '<b>OK</b>'
}
else
{
   $alert = '<i>KO</i>';
}

if( !empty($alert) )
{
   echo $alert;
}
Ainsi chaque message a son propre style.

Ou bien utiliser une variable pour chaque type de message :
if( ... )
{
   $success= 'OK'
}
else
{
   $error= 'KO';
}

if( !empty($error) )
{
   echo '<i>' . $error. '</i>';
}
if( !empty($success) )
{
   echo '<b>' . $success . '</b>';
}

Re: Comment ne pas afficher le style d'une alerte php vide ?

Posté : 04 août 2015, 13:59
par pierrewebaster
oui je pense aussi que c'est le problème... alors je vais faire des tests avec vos méthodes
Merci infiniment

Re: Comment ne pas afficher le style d'une alerte php vide ?

Posté : 04 août 2015, 15:49
par pierrewebaster
Yes ! J'ai testé la solution avec une variable pour chaque type de message qui me parait plus facilement maitrisable pour le simple designer que je suis, enfin j'ai tenté d'adapter cette solution à mon code...
Ça fonctionne presque bien, les erreurs (champs vides, pb sur format mail) apparaissent bien, le mail est bien envoyé mais le message success n'apparait pas :?
En fait j'ai remplacé les $alert par $error sur les messages d'erreurs et remplacé $alert par $success sur le message de validation, comme ceci
if (mail($to, $msg, $headers))
        {
            $success = 'Merci pour votre message';
je dois avoir un problème de logique que je ne comprend pas.
Voilà mon code, nettoyé de l'inutile :
<?php

if (isset($_POST['envoye']))
{
    if (get_magic_quotes_gpc())
    {
      $nom	     	= stripslashes(trim($_POST['nom']));
      $expediteur	= stripslashes(trim($_POST['email']));
      $message		= stripslashes(trim($_POST['message']));
    }
    else
    {
      $sujet 		= "Demande de contact depuis http://www.wambaugh.us";
      $nom		= trim($_POST['nom']);
      $expediteur	= trim($_POST['email']);
      $message		= trim($_POST['message']);
      $message 		= utf8_decode($message);
    }
 
    /* Expression régulière permettant de vérifier si le 
    * format d'une adresse e-mail est correct */
    $regex_mail = '/^[-+.\w]{1,64}@[-.\w]{1,64}\.[-.\w]{2,6}$/i';
 
    /* Expression régulière permettant de vérifier qu'aucun 
    * en-tête n'est inséré dans les champs */
    $regex_head = '/[\n\r]/';
 
    /* Si le formulaire n'est pas posté de notre site on renvoie 
    * vers la page d'accueil */
    if($_SERVER['HTTP_REFERER'] != 'http://www.monsite.com')
    {
      header('Location: http://www.monsite.com/'&#41;;
    }
    /* On vérifie que tous les champs sont remplis */
    elseif (empty($nom) 
           || empty($expediteur) 
           || empty($message))
    {
      [b]$error[/b] = 'Oups, vous avez du oublier quelque chose';
    }
    /* On vérifie que le format de l'e-mail est correct */
    elseif (!preg_match($regex_mail, $expediteur))
    {
      [b]$error[/b] = 'Oups, il doit y avoir une erreur sur l\'adresse : '.$expediteur.'';
    }
    /* On vérifie qu'il n'y a aucun header dans les champs */
    elseif (preg_match($regex_head, $expediteur) 
            || preg_match($regex_head, $nom) 
            || preg_match($regex_head, $sujet))
    {
        [b]$error[/b] = 'En-t&ecirc;tes interdites';
    }
    /* Si aucun problème et aucun cookie créé, on construit le message et on envoie l'e-mail */
    elseif (!isset($_COOKIE['sent']))
    {
        /* Destinataire (votre adresse e-mail) */
        $to = '[email protected]';
 
        /* Construction du message */
        $msg  = ''."\r";
        $msg .= 'Ce mail a été envoyé depuis http://www.monsite.com par :'."\r\n\r\n";
        $msg .= ''.$nom."\r\n\r\n";
        $msg .= 'Voici son message :'."\r\n";
        $msg .= ''."\r";
        $msg .= $message."\r\n";
 
        /* En-têtes de l'e-mail */
        $headers = 'From: '.$nom.' <'.$expediteur.'>'."\r\n\r\n";
 
        /* Envoi de l'e-mail */
        if (mail($to, $msg, $headers))
        {
            [b]$success[/b] = 'Merci pour votre message';
            /* On crée un cookie de courte durée (ici 120 secondes) pour éviter de 
            * renvoyer un mail en rafraichissant la page */
            setcookie("sent", "1", time() + 60);
 
            /* On détruit la variable $_POST */
            unset($_POST);
        }
        else
        {
            $error = 'Erreur d\'envoi de l\'e-mail';
        }
    }
    /* Cas ou le cookie est créé et que la page est rafraichie, on détruit la variable $_POST */
    else
    {
        unset($_POST);
    }
}
?>
<!DOCTYPE html>
<html lang="en">
  <head>
    <title>Contact</title>
  </head>
<body>
        <div class="contenuContact">
<form action="contact.php" method="post">
	<div class="col-sm-12"><div class="contact"><input type="text" id="nom" name="nom"  class="form-control" placeholder="Nom" 
        	value="<?php echo (isset($_POST['nom'])) ? $nom : '' ?>" 
        /></div></div>
	<div class="col-sm-12"><div class="contact"><input type="text" id="email" name="email"  class="form-control" placeholder="Adresse email"
        	value="<?php echo (isset($_POST['email'])) ? $expediteur : '' ?>"
        /></div></div>
	<div class="col-sm-12"><div class="contact"><textarea style="width:100%" id="message" name="message" class="textarea" placeholder="Message"><?php echo (isset($_POST['message'])) ? $message : '' ?></textarea></div></div> 
	<div class="col-sm-12"><div  class="contact" style="text-align:center"><input  class="btn btn-default" type="submit" name="envoye" value="Envoyer" /></div>
</div>
</form>
<?php
if (!empty([b]$error[/b]))
{
    echo '<div class="col-sm-12"><div class="contact"><p style="color:#a69a91; background-color:#660000; text-align:center; font-size:16px; border-radius: 4px; margin: 10px 0; padding:10px;">'.$error.'</p></div></div>';
}
?>
  </body>
</html>
Merci encore de votre aide

Re: Comment ne pas afficher le style d'une alerte php vide ?

Posté : 04 août 2015, 15:52
par xTG
Vous n'avez rien qui permet d'afficher la variable $success.
Il faut faire comme pour $error, anciennement $alert. ;)

Re: Comment ne pas afficher le style d'une alerte php vide ?

Posté : 04 août 2015, 16:42
par pierrewebaster
Je creuse le sujet dans tous les sens mais je ne vois pas ce qui diffère des $error du $success.
Et je ne sais vraiment pas comment faire...
Encore un petit coup de main, ce serait très sympa, merci

Re: Comment ne pas afficher le style d'une alerte php vide ?

Posté : 04 août 2015, 16:49
par xTG
Il y a ça pour afficher le $error :
if (!empty($error))
{
    echo '<div class="col-sm-12"><div class="contact"><p style="color:#a69a91; background-color:#660000; text-align:center; font-size:16px; border-radius: 4px; margin: 10px 0; padding:10px;">'.$error.'</p></div></div>';
}
Pourquoi n'y a-t-il rien pour le $success ? ;)

Re: Comment ne pas afficher le style d'une alerte php vide ?

Posté : 04 août 2015, 17:02
par pierrewebaster
Ben il y a ça
/* Envoi de l'e-mail */
        if (mail($to, $sujet, $msg, $headers))
        {
            $success = 'Merci pour votre message';
qui fonctionnait avec le $alert
Désolé pour mon ignorance :(