Newsletter PHP

Newsletter PHP - PHP - Programmation

Marsh Posté le 25-11-2009 à 12:58:27    

Bonjour,
 
J'ai un formulaire d'inscription dans lequel j'ai un champ de type checkbox nommé "newsletter" à cocher pour recevoir une newsletter.
Seulement l'inscription ne fonctionne que si le champ checkbox est coché, dans le cas contraire l'inscription ne fonctionne pas.
 
Voici mon code :
 
                                               $pseudo=strip_tags(trim($_POST['pseudo']));
      $mail=strip_tags(trim($_POST['mail']));
      $pass=strip_tags(trim($_POST['pass']));
      $newsletter=$_POST['newsletter'];
      if($newsletter!=NULL) {
       $newsletter=1;
      }
       
      mysql_connect("localhost", "root", "" ) or die ("erreur de connexion" );
                     mysql_select_db("espace_membre" );
       
      $pseudo=mysql_real_escape_string($pseudo);
      $mail=mysql_real_escape_string($mail);
      $pass=mysql_real_escape_string($pass);
 
$pass=sha1($pass);                                                                                               mysql_query("SET NAMES UTF8" );
       mysql_query("INSERT INTO membres VALUES ('','$pseudo', '$mail','$pass', '$newsletter')" );
       
       mysql_close();
 
Quelqu'un aurait-il une idée pour que l'inscription fonctionne lorsque le champ newsletter du formulaire n'est pas coché?
Merci pour vos réponses.

Reply

Marsh Posté le 25-11-2009 à 12:58:27   

Reply

Marsh Posté le 25-11-2009 à 13:33:55    


 
ya rien qui empêche d'exécuter la requête dans ton code.
 
if($newsletter==1){
mysql_query("INSERT INTO membres VALUES ('','$pseudo', '$mail','$pass', '$newsletter')" );  
}else{
echo "pas d'inscription";  
}

Reply

Marsh Posté le 25-11-2009 à 13:44:24    

Bonjour darknico, merci pour ta réponse,  
En fait ce que je souhaite c'est que l'inscription puisse se faire dans les deux cas, coché ou pas coché, et le code que tu me donnes sauf erreur de ma part, ne permet l'inscription que dans le cas ou la case est cochée.
Ce que je n'arrive pas à comprendre c'est ce qui ne va pas dans mon code qui empêche l'inscription quand la case n'est pas cochée.

Reply

Marsh Posté le 25-11-2009 à 13:49:16    

if($newsletter!=NULL) {
       $newsletter=1;
      }else{
$newletter = 0;
}
 
mais ca devrai te generer une erreur ton $_POST['newletter']

Reply

Marsh Posté le 25-11-2009 à 13:53:32    

Bonjour stealth35, j'avais déjà essayé ce code mais ça ne marche toujours pas, impossible de s'inscrire sans avoir coché la case newsletter.

Reply

Marsh Posté le 25-11-2009 à 13:57:51    

Quand la case n'est pas cochée, ton $_POST['newsletter'] n'existe pas il me semble, donc ta variable $newsletter doit valoir null et donc le test d'inscription ne passe pas.
 
Si tu veux que l'inscription se fasse dans tous les cas, tu n'as qu'à faire directement $newsletter = 1, sans t'occuper de $_POST.
 
Maintenant moi ce que je me demande :
Quel est l'intérêt de la case à cocher si dans tous les cas l'inscription est effectuée ?
 
De plus, il me semble que c'est contraire aux lois de nombreux pays, tu risque de t'attirer des ennuis à mon avis.

Reply

Marsh Posté le 25-11-2009 à 14:02:53    

Bonjour Tirkyth, pourquoi cela serait contraire aux lois de nombreux pays?  
L'utilisateur a le choix lors de son inscription de s'abonner à la newsletter du site ou non, cela se fait sur la plupart des sites internet comme sur celui ci d'ailleurs.... Je ne comprends pas ce que tu veux dire.

Reply

Marsh Posté le 25-11-2009 à 14:11:15    

J'en ai oublié de répondre à ta proposition, le problème est que si je fais directement :  
$newsletter=1; le champ newsletter de ma base de données prendra pour valeur 1, et donc quand j'enverrai la newsletter aux membres du site, elle sera envoyée à tous les membres même à ceux qui ne désiraient pas la recevoir.
Il y' a surement plusieurs façon de procéder pour envoyer une newsletter à ses membres et surement meilleures que la mienne, mais dans la mienne il faut que le champs de la base de donnée ait pour valeur 1 pour la recevoir et 0 si l'utilisateur ne le souhaite pas.

Reply

Marsh Posté le 25-11-2009 à 14:16:30    

fab1105 a écrit :

En fait ce que je souhaite c'est que l'inscription puisse se faire dans les deux cas, coché ou pas coché, et le code que tu me donnes sauf erreur de ma part, ne permet l'inscription que dans le cas ou la case est cochée.
Ce que je n'arrive pas à comprendre c'est ce qui ne va pas dans mon code qui empêche l'inscription quand la case n'est pas cochée.


Citation :

Quelqu'un aurait-il une idée pour que l'inscription fonctionne lorsque le champ newsletter du formulaire n'est pas coché?


Quand je lis ça, moi je vois que tu souhaites que l'inscription se fasse peu importe si la case est cochée ou non.

Reply

Marsh Posté le 25-11-2009 à 14:19:27    

Bon en fait je crois que j'ai compris ce que tu veux dire:
 
C'est l'inscription du membre entier qui ne se fait pas si il ne coche pas la case newsletter c'est ça ?

Reply

Marsh Posté le 25-11-2009 à 14:19:27   

Reply

Marsh Posté le 25-11-2009 à 14:32:40    

Oui c'est bien ce que je veux, que l'inscription se fasse que la case soit cochée ou non. Et oui c'est l'inscription du membre qui ne se fait pas s'il ne coche pas la case, car le script s'arrête avant.
T'as une idée?
 
Ah oui j'oubliais, le plus bizarre c'est que le script fonctionnait bien hier soir, et ce matin ça ne marchait plus. Pourtant je n'y ai pas retouché, ça me rend dingue...

Reply

Marsh Posté le 25-11-2009 à 14:39:58    

J'ai bien une idée oui, c'est sensiblement la même que stealth35 cela dit :

 
Code :
  1. $pseudo=strip_tags(trim($_POST['pseudo']));
  2. $mail=strip_tags(trim($_POST['mail']));
  3. $pass=strip_tags(trim($_POST['pass']));
  4.  
  5. $newsletter= isset($_POST['newsletter']) ? 1 : 0;
  6.  
  7. mysql_connect("localhost", "root", "" ) or die ("erreur de connexion" );
  8. mysql_select_db("espace_membre" );
  9.  
  10. $pseudo=mysql_real_escape_string($pseudo);
  11.  
  12. $pass=sha1($pass);
  13. mysql_query("SET NAMES UTF8" );
  14. mysql_query("INSERT INTO membres VALUES ('','$pseudo', '$mail','$pass', '$newsletter')" ) or die(mysql_error());
  15.  
 

J'ai rajouté un affichage d'erreur MySQL au cas où il y en ait une qui survienne, copie colle la et donne la nous ici ça aidera.


Message édité par Tirkyth le 25-11-2009 à 14:41:10
Reply

Marsh Posté le 25-11-2009 à 14:42:08    

Merci je vais essayer, mais je débute un peu et je ne comprends pas cette ligne :
$newsletter= isset($_POST['newsletter']) ? 1 : 0;  
enfin le ? 1 : 0;
Peux tu m'expliquer ce que ça veux dire ?

Reply

Marsh Posté le 25-11-2009 à 14:44:34    

J'ai essayé mais cela donne toujours le même résultat, lorsque l'on ne coche pas la case, l'inscription ne se fait pas.

Reply

Marsh Posté le 25-11-2009 à 14:48:24    

le "?" est l'opérateur ternaire. Ce n'est ni plus ni moins un "if".
 
Ca s'utilise très simplement: Devant le "?", c'est un test à vérifier. Dans notre cas, c'est isset($_POST['newsletter']). Après le "?" c'est la valeur ou l'expression que l'on souhaite utiliser. Et le ":" sert à donner une autre valeur dans le cas où le test n'est pas vérifié.
 
Pour être plus claire, j'aurais pu très bien écrire, à la place de cette ligne :

Code :
  1. if (isset($_POST['newsletter']))
  2. {
  3.    $newsletter = 1;
  4. }
  5. else
  6. {
  7.    $newsletter = 0;
  8. }


 
N'hésite pas si tu ne comprends toujours pas. Je te mets le lien vers la documentation au cas où : http://php.net/manual/fr/language. [...] arison.php (fais une recherche sur le mot "ternaire" dans la page, sans les guillemets)

Reply

Marsh Posté le 25-11-2009 à 14:49:26    

fab1105 a écrit :

J'ai essayé mais cela donne toujours le même résultat, lorsque l'on ne coche pas la case, l'inscription ne se fait pas.


As-tu un message d'erreur qui est affiché ?
 
Sinon peux-tu ajouter tout en haut de ton script

Code :
  1. var_dump($_POST);

Reply

Marsh Posté le 25-11-2009 à 14:57:37    

Merci pour l'explication, j'ai bien compris c'est assez clair.
Sinon non je n'ai pas de message d'erreur, c'est juste que lorsque la page inscription.php se recharge elle même après avoir cliqué sur envoyer, le script s'arrête avant d'insérer les données dans la base, avant d'envoyer le mail de confirmation et bien sûr avant la redirection en fin de script.
Alors que quand la case est cochée, tout le script s'exécute entièrement, j'ai bien un mail de confirmation, les données sont insérées dans ma table et la redirection est bien effectuée.

Reply

Marsh Posté le 25-11-2009 à 14:59:04    

Mais avec    1.
      var_dump($_POST);
   2.
      die;
là il y'a une erreur de parse

Reply

Marsh Posté le 25-11-2009 à 15:00:02    

Non c'est moi qui ai fait n'importe quoi j'ai :
array(0) { }

Reply

Marsh Posté le 25-11-2009 à 15:01:29    

Est-ce que tu peux afficher ton formulaire, ajouter le petit bout de code que j'ai mis dans ma réponse précédente tout au début de ton traitement en PHP et poster le résultat ?

 

Et sinon, est-ce que tu pourrais donner l'intégralité du code de ta page d'inscription ? (PHP + HTML)

 

Edit : Oui il faut que tu ajoutes ce petit bout de code juste avant d'envoyer le formulaire, il faut que tu le mettes en commentaire le temps d'afficher le formulaire.


Message édité par Tirkyth le 25-11-2009 à 15:03:00
Reply

Marsh Posté le 25-11-2009 à 15:13:40    

Oui je vais te donner le code mais il y'a 3 fichiers et c'est un peu long

Citation :


inscription.php :
 
<?php
 
session_start();
 
require_once("fonctions/valid_inscription.php" );
 
 
?>
 
 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<link rel="stylesheet" type="text/css" href="style.css" media="screen" />
<title>Page d'inscription</title>
</head>
 
<body>
 
 
<?php
 
if(isset($_SESSION['membre'])) {
       
       echo'Vous êtes déja connecté en tant que '.$_SESSION['membre'].'<br />';
       echo'<a href="deconnexion.php">Déconnectez vous</a> pour ouvrir une nouvelle session';
       }
       else {
         
        echo '<h2>Inscription</h2>';
        echo 'Inscrivez vous ou <a href="connexion.php">connectez vous<a/><br /><br />';
       
 
require("fonctions/invalide_form.php" );
 
?>
 
 
<form name="inscription" method="post" action="inscription.php">
<label for="pseudo">Pseudo : </label><input type="text" name="pseudo" id="pseudo" value="<?php if(isset($_POST['pseudo']))echo $_POST['pseudo'] ?>" /><br />
<label for="mail"> E-mail : </label><input type="text" name="mail" id="mail" value="<?php if(isset($_POST['mail']))echo $_POST['mail'] ?>" /><br />
<label for="mail2">Confirmez votre e-mail : </label><input type="text" name="mail2" id="mail2" value="<?php if(isset($_POST['mail2']))echo $_POST['mail2'] ?>" /><br />
<label for="pass">Choisissez un mot de passe : </label><input type="password" name="pass" id="pass" <?php if(isset($_POST['pass']))echo $_POST['pass'] ?> /><br />
<label for="pass2">Confirmez votre mot de passe : </label><input type="password" name="pass2" id="pass2" <?php if(isset($_POST['pass2']))echo $_POST['pass2'] ?> /><br />
<label for="newsletter">Recevoir par mail les nouvelles recettes(1 mail/semaine)</label><input type="checkbox" name="newsletter" id="newsletter" /><br />
<input type="submit" name="envoyer" value="Inscription" />
</form>
<?php
       }
       ?>
</body>
</html>
 
ensuite valid_inscription.php :
 
<?php
   
 
if(isset($_POST['pseudo']) and isset($_POST['mail']) and isset($_POST['mail2']) and isset($_POST['pass']) and isset($_POST['pass2']) and isset($_POST['newsletter'])) {
 
 if($_POST['pseudo'] != NULL and $_POST['mail'] != NULL and $_POST['mail2'] != NULL and $_POST['pass'] != NULL and $_POST['pass2'] != NULL) {
   
   if(preg_match("#^[a-z0-9._-]+@[a-z0-9._-]{2,}\.[a-z]{2,4}$#", $_POST['mail'])) {
     
            if($_POST['mail'] == $_POST['mail2']) {
     
            if($_POST['pass'] == $_POST['pass2']) {
           
           
          if ($_SERVER['HTTP_REFERER'] == 'http://localhost/code/espace_membre/inscription.php') {
           
           
       
      $pseudo=strip_tags(trim($_POST['pseudo']));
      $mail=strip_tags(trim($_POST['mail']));
      $pass=strip_tags(trim($_POST['pass']));
      $newsletter= isset($_POST['newsletter']) ? 1 : 0;  
       
       
     
       
      mysql_connect("localhost", "root", "" ) or die ("erreur de connexion" );
                     mysql_select_db("espace_membre" );
       
      $pseudo=mysql_real_escape_string($pseudo);
      $mail=mysql_real_escape_string($mail);
      $pass=mysql_real_escape_string($pass);
       
      $sql="SELECT id FROM membres WHERE pseudo='$pseudo'";
      $req = mysql_query($sql) or die(mysql_error());
      if(mysql_num_rows($req)==0) {
       
       $sql2="SELECT id FROM membres WHERE mail='$mail'";
          $req2 = mysql_query($sql2) or die(mysql_error());
          if(mysql_num_rows($req2)==0) {
       
       
       
        $to = $mail;
                 $sujet = 'Inscription !';
       
        $msg = '<html>
           <head>
        <title></title>
           </head>
     
           <body>
        <div style="background-color:#f3e7d1;">
        <h2 style="color:#274E9C; text-decoration:underline">Inscription</h2>
        <p>Bonjour,<br />
        Vous êtes maintenant membre de monsite.com</p>
        <p>Voici vos identifiants : <br />
        Pseudo : &nbsp; <strong>'.$pseudo.'</strong> <br />
        Mot de passe : <strong>'.$pass.'</strong>.<br/>
        Vous pouvez maintenant vous connecter à l\'espace membre du site.<br/><br/>
         
        <p>Cliquez sur le lien suivant pour vous connecter à votre espace membre.</p>
        <a href="#">Connexion à votre espace membre</a><br />
       
       
        En vous remerciant.<br/><br/>
        Wembaster de monsite.com
          </body>
             </html>';
       
       
       $headers  = 'MIME-Version: 1.0' . "\r\n";
                         $headers .= 'Content-type: text/html; charset=utf-8' . "\r\n";
                         $headers .= 'From: "Mon site" <fabiloute@gmail.com>' . "\r\n";
                         $headers .= 'Reply-To: "Webmaster" <fabiloute@gmail.com>' . "\r\n";
 
 
                                                                                          mail($to, $sujet, $msg, $headers);
                                                                                     
                                                                                     
       $pass=sha1($pass);                                                                                                         mysql_query("SET NAMES UTF8" );
       mysql_query("INSERT INTO membres VALUES ('','$pseudo', '$mail','$pass', '$newsletter')" );
       
       mysql_close();
       
       header("Location: inscription_reussie.php" );
       
       
       
       }
      }
          }
         }
      }
   }
 }
}
 
       
       
 
                                                                               
 
?>
 
invalid_form.php :
 
<?php
 
if(isset($_POST['pseudo']) && isset($_POST['mail']) && isset($_POST['mail2']) && isset($_POST['pass']) && isset($_POST['pass2'])) {
 extract($_POST);
 
 if($pseudo == NULL) {
  echo 'Vous devez choisir un pseudo<br />';
 }
   
  if($pseudo != NULL && strlen($pseudo)<3) {
   echo 'Le pseudo est trop court<br />';
  }
   
  if($mail != NUll && !preg_match("#^[a-z0-9._-]+@[a-z0-9._-]{2,}\.[a-z]{2,4}$#", $mail)) {
   echo 'Cette adresse e-mail n\'est pas valide<br />';
  }
   
  if($mail == NULL) {
   echo 'Vous devez choisir un adresse e-mail<br />';
  }
   
  if( $mail != NULL && $mail != $mail2) {
   echo 'Les adresses e-mail sont différentes<br />';
  }
   
  if($mail != NULL && $mail2 == NULL) {
   echo'Vous devez confirmer votre adresse e-mail<br />';
  }
   
  if($pass != NULL && strlen($pass)<5) {
   echo 'Mot de passe trop court<br />';
  }
   
  if($pass == NULL) {
   echo 'Vous devez choisir un mot de passe<br />';
  }
   
  if($pass != NULL && $pass2 == NULL) {
   echo 'Vous devez confirmez votre mot de passe<br />';
  }
   
  if($pass != NULL && $pass != $pass2) {
   echo 'Les mots de passe sont différents<br />';
  }
   
  mysql_connect("localhost", "root", "" ) or die ("erreur de connexion" );
  mysql_select_db("espace_membre" );
   
  $pseudo=mysql_real_escape_string($pseudo);
     $mail=mysql_real_escape_string($mail);
  $passo=mysql_real_escape_string($pass);
   
  $sql="SELECT id FROM membres WHERE pseudo='$pseudo'";
     $req = mysql_query($sql) or die(mysql_error());
  if(mysql_num_rows($req)>0) {
   echo'Ce pseudo est déjà utilisé<br />';
  }
   
  $sql2="SELECT id FROM membres WHERE mail='$mail'";
     $req2 = mysql_query($sql2) or die(mysql_error());
     if(mysql_num_rows($req2)>0) {
   echo'Cette adresse e-mail est déja utilisée<br />';
  }
}
   
     
?>

Reply

Marsh Posté le 25-11-2009 à 15:22:10    

Le problème se situe je pense au début de valid_inscription.php
 
Tu as mis le test suivant :

Code :
  1. if(isset($_POST['pseudo']) and isset($_POST['mail']) and isset($_POST['mail2']) and isset($_POST['pass']) and isset($_POST['pass2']) and isset($_POST['newsletter'])) {


Tu testes donc $_POST['newsletter'] afin d'exécuter la suite du code. Or dans le cas où la case n'est pas cochée, cette valeur n'existe pas, et donc le test ne passera pas. Donc pas d'inscription.
 
Il faut donc que tu remplaces par  

Code :
  1. if(isset($_POST['pseudo']) and isset($_POST['mail']) and isset($_POST['mail2']) and isset($_POST['pass']) and isset($_POST['pass2'])) {

Reply

Marsh Posté le 25-11-2009 à 15:31:01    

Super ça marche nickel! Merci pour ton aide précieuse Tirkyth.
En fait je croyais que $_POST['newsletter'] servait juste à tester si le formulaire avait été posté avec cette variable qu'elle ait une valeur ou non, et en fait je vois que ce n'est pas le cas... Merci encore.

Reply

Marsh Posté le 25-11-2009 à 15:34:22    

Exactement, les checkbox qui ne sont pas cochées ne sont pas du tout présentes dans les tableaux $_GET, $_POST, ou $_REQUEST :)
 
On se fait tous avoir au moins une fois au début je pense. Bonne continuation à toi.

Reply

Marsh Posté le 25-11-2009 à 15:36:31    

Merci, à toi aussi Tirkyth.

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed