PHP Syntax & Echo not working...

Geishin Messages postés 9 Statut Membre -  
Pitet Messages postés 2845 Statut Membre -
Salut !

Alors, j'apprends le PHP et actuellement je réalise une page d'inscription. Mon but : lorsque l'on envois le formulaire, soit il y est une redirection vers la page index.html, soit que les messages d'erreurs (dans les echo) s'affichent, en fonction de l'erreur.
Problème : les echo ne renvois rien et la redirection ne marche pas !
Au début, j'ai essayé de faire marché l'ensemble sur 2 pages différentes : 1 page HTML avec le formulaire renvoyant vers la page PHP de traitement de données, et 1 page traitement de données. Mais ça n'a pas fonctionné. Absolument pas. Donc maintenant j'essai encore en mettant le code PHP dans la même page que le formulaire, le tout sans oublier d'enregistrer la page unique en .php. Mais cela ne fonctionne toujours pas...

Plus précisement, j'aimerai que les message d'erreur s'affiche juste au dessus du formulaire, dans le "regdiv".
Egalement, la page "index.html" n'a pas encore été créée, serait-ce un début d'explication ?

Merci !

Voici le code de la page d'inscription register.php :

<?php
 if(isset($_POST['submit'])){ 
  if(!empty($_POST['pseudo']) && !empty($_POST['password']) && !empty($_POST['email'])){
   $pseudo = htmlspecialchars(stripslashes($_POST['pseudo']));
   if(strlen($pseudo >= 4) && strlen($pseudo <= 15)){
    $password = htmlspecialchars(sha1('gz'.$_POST['password']));
    if(strlen($password >= 6)){
     $email = htmlspecialchars(stripslashes($_POST['email']));
     if(preg_match('#^[\w._-]{2,}+@[\w._-]{2,}+\.[a-z]{2,6}$#i', $email)){
      try{
       $bdd = new PDO('mysql:host=localhost;dbname=member', 'root', '');
      }
      catch(Exception $e){
       die('Error: '.$e->getMessage());
      }
      $req = $bdd->prepare('INSERT INTO members(pseudo, password, email) VALUES(:pseudo, :password, :email)');
      $req->execute(array(
       'pseudo' => $pseudo,
       'password' => $password,
       'email' => $email
       ));
      header('Location: index.html');
     }else{
      echo '<p class="error"><b>Error:</b> Invalide Email</p>';
     }
    }else{
     echo '<p class="error"><b>Error:</b> Invalide password (Min: 4)</p>';
    }
   }else{
    echo '<p class="error"><b>Error:</b> Invalide ID (Min: 4, Max: 15)</p>';
   }
  }else{
   echo '<p class="error"><b>Error:</b> Informations missing</p>';
  }
 }
?>


Suivit à la ligne du html : (le form renvoi donc vers sa prope page source(celle-ci même))

<html>
    <head>
        <title>Test</title>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, height=device-height, initial-scale=1.0">
        <link rel="stylesheet" href="register.css">
    </head>
    <body>
  <div id="main">
   <div id="regdiv">
    <form id="register" action="register.php" method="post">
     <input class="input" type="text" name="pseudo" placeholder="Character name" style="position: absolute; top: 25px"/>
     <input class="input" type="password" name="password" placeholder="Password" style="position: absolute; top: 62px"/>
     <input class="input" type="email" name="email" placeholder="E-mail" style="position: absolute; top: 99px"/>
     <input id="reg" type="submit" value="Register"/>
     <a href="home.php">Skip now...</a>
    </form>
   </div>
  </div>
  <script src="jquery-2.1.0.js"></script>
  <script src="jquery-ui-1.10.4.custom.js"></script>
  <script src="index.js"></script>
    </body>
</html>


Et enfin, voici le CSS, si jamais ça pourrai aider...

body{
    margin: 0;
    background-color: whitesmoke;
}
#main{
 position: relative;
 width: 1200px;
 height: 100%;
 margin: auto;
}
#regdiv{
 position: absolute;
 top: 75px;
 left: 456.5px;
 width: 285px;
 height: 400px;
 border: 1px solid black;
 border-radius: 2px;
 box-shadow: -1px -1px 5px #848484, 1px 1px 5px #848484;
 background: black url("regdiv.png");
}
#register{
 position: absolute;
 top: 185px;
 left: 7.5px;
 width: 270px;
 height: 200px;
 z-index: 1;
}
.error{
 position: relative;
 top: 180px;
 width: 245px;
 margin: 5px auto;
 background: linear-gradient(90deg, transparent, white, transparent);
 box-shadow: 0px 1px 4px #BDBDBD;
 text-align: center;
 color: #DF0101;
 font-family: "Calibri";
 font-size: 13px;
 z-index: 2;
}
.input{
 width:224px;
 height: 32px;
 margin: 0px 23px 5px 23px;
 padding: 2px;
 text-indent: 20px;
 font-size: 16px;
 border-radius: 2px;
 border: 1px solid black;
 background-color: #F2F2F2;
 color: #1C1C1C;
 font-family: "Corbel";
}
input:focus{
 outline-style: none;
}
::-webkit-input-placeholder{
 font-style: italic;
 color: #637863;
}
#reg{
 position: absolute;
 margin: 0;
 padding: 0;
 width: 80px;
 bottom: 15px;
 left: 50px;
 cursor: pointer;
 border-radius: 2px;
 background-color: #1C1C1C;
 color: #FAFAFA;
 border: 1px solid #000000;
 font-family: "Century Gothic";
}
#reg:hover{
 background-color: #2E2E2E;
}
#register a{
 position: absolute;
 bottom: 15px;
 left: 150px;
 font-size: 13px;
 text-decoration: none;
 color: #D8D8D8;
}
#register a:hover{
 color: #E6E6E6;
}
A voir également:

6 réponses

Utilisateur anonyme
 
Bonjour

Aucun de tes "echo" n'affiche quoi que ce soit parce qu'aucun n'est exécuté.
En effet, ton premier test
if(isset($_POST['submit']))
est FALSE car $_POST['submit'] n'est pas défini.
Tu n'as aucun champ avec name="submit" dans ton formulaire.
Tu as bien type="submit", mais c'est le name qui compte.
0
Geishin Messages postés 9 Statut Membre
 
Je vous remercie !

Cependant mon problème persiste, maintenant avec la condition du $pseudo... Il renvoi l'else echo de la condition $pseudo à chaque fois. Apparemment ça coince mais j'arrive pas à voir mon problème. Serait-ce à la définition de la variable ?

Merci. :)
0
Utilisateur anonyme
 
Je ne sais pas quelles modifications tu as faites. Comment veux-tu que je devine quoi que ce soit ? Je ne suis pas devin.
0
Utilisateur anonyme
 
Non, j'ai vu

   if(strlen($pseudo >= 4) && strlen($pseudo <= 15)){

Tu as mal placé les parenthèses :
   if(strlen($pseudo) >= 4 && strlen($pseudo) <= 15){
0
Geishin Messages postés 9 Statut Membre
 
Oui, merci, je venais de voir cette erreur et je l'ai corrigée...

Tout est en règle, également du coté du HTML, mais maintenant c'est la condition $email qui me fait des misère... :'( Elle me renvoi toujours l'echo Invalid Email.
Si je provoque une erreur à la condition du $submit, celà renvoi bien "Information missing", de même que pour $pseudo renvoi bien "Invalid ID", mais quand je provoque un erreur avec $password, ça ne le compte pas et affiche l'erreur de $mail, soit "Invalid Email" (et biensûr idem pour l'email). Ce problème est également valable quand je rempli le formulaire sans erreurs... (echo "Invalid Email" et aucun traitement de données ni de redirection)
Donc là je suis un peu pomé, je ne saurait même pas dire si cela vient de $password ou $email, ou les 2 ! o.o

htmlspecialchars et sha1 sont-ils incompatibles ?
$password = htmlspecialchars(sha1($_POST['password']));


Voici mon code PHP mis à jour :

<?php
 if(isset($_POST['submit'])){ 
  if(!empty($_POST['pseudo']) && !empty($_POST['password']) && !empty($_POST['email'])){
   $pseudo = htmlspecialchars(stripslashes($_POST['pseudo']));
   if(strlen($pseudo) >= 4 && strlen($pseudo) <= 15){
    $password = htmlspecialchars(sha1($_POST['password']));
    if(strlen($password) >= 6){
     $email = htmlspecialchars(stripslashes($_POST['email']));
     if(preg_match('#^[\w._-]{2,}+@[\w._-]{2,}+\.[a-z]{2,6}$#i', $email)){
      try{
       $bdd = new PDO('mysql:host=localhost;dbname=member', 'root', '');
      }
      catch(Exception $e){
       die('Error: '.$e->getMessage());
      }
      $req = $bdd->prepare('INSERT INTO members(pseudo, password, email) VALUES(:pseudo, :password, :email)');
      $req->execute(array(
       'pseudo' => $pseudo,
       'password' => $password,
       'email' => $email
       ));
      header('Location: register.html');
     }else{
      echo '<p class="error"><b>Error:</b> Invalide Email</p>';
     }
    }else{
     echo '<p class="error"><b>Error:</b> Invalide password (Min: 4)</p>';
    }
   }else{
    echo '<p class="error"><b>Error:</b> Invalide ID (Min: 4, Max: 15)</p>';
   }
  }else{
   echo '<p class="error"><b>Error:</b> Informations missing</p>';
  }
 }
?>
0

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

Posez votre question
Utilisateur anonyme
 
Pour ton erreur sur le password, c'est que ton test de longueur est bidon.
Tu testes la longueur de sha1(ton password), pas celle de ton password. Le résultat de sha1 faisant toujours plus de 6 caractères, ce test est toujours ok.
En ce qui concerne ton expression régulière, j'ai testé et j'ai trouvé effectivement qu'il refusait de adresses ok. Je ne m'y connais pas en expressions régulières, mais il suffit de regarder dans la doc pour voir ce qui cloche, non ?
0
Pitet Messages postés 2845 Statut Membre 527
 
Salut,

Si tu veux vérifier la validité d'une adresse mail, tu peux utiliser la fonction filter_var() avec le filtre FILTER_VALIDATE_EMAIL (nécessite php >= 5.2).

Faire un htmlspecialchars dès la réception des données n'est pas une bonne pratique puisque tu altères tes données avant de les traiter. Comme son nom l'indique, htmlspecialchars doit être utilisé uniquement lors de l'affichage en html.

La bonne logique pourrait être la suivante :
// si le formulaire est soumis
if(isset($_POST['submit'])){
    // je récupère les données
    $pseuso = $_POST['pseudo'];
    $password = $_POST['password'];
    $email = $_POST['email'];

    // je vérifie les données
    if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
        echo '<p class="error"><b>Error:</b> Invalide Email</p>';
        exit();
    }

    if (strlen($pseudo) >= 4 && strlen($pseudo) <= 15) {
        echo '<p class="error"><b>Error:</b> Invalide ID (Min: 4, Max: 15)</p>';
        exit();
    }
    // ... etc, suite le de la validation des données ...

    // les données sont vérifiées, on insère en bdd
    try{
       $bdd = new PDO('...');
    }
    catch(Exception $e){
        die('Error: '.$e->getMessage());
    }
    $req = $bdd->prepare('...');
    $req->execute(array('pseudo' => $pseudo, 'password' => $password, 'email' => $email));

    // on redirige
    header('Location: register.html');
    // si au lieu de rediriger on voulait afficher les données à la suite, c'est ici qu'il faudrait utiliser htmlspecialchars
}


Bonne journée
0