Как показать несколько сообщений об ошибках, одновременно в форме?


Я пытаюсь сделать с моей странице регистрации показать все сообщения полей забыты вместе, как в этом примере:

erros

, Но она показывает только в части:

1 - "Username already exists" и "Email already exists" или -

2 - "Please insert username", "Please insert password", "Please insert email", или -

3 - "Username must have less than 16 characters" и "Password must have 8 or more characters"

Есть ли решение для этого?

<?php
$page = "Register";
include "header.php";

if(isset($_POST["register"])){

$username = $_POST['username'];
$password = $_POST['password'];
$email = $_POST['email'];

if(!empty($username) && !empty($password) && !empty($email)){

    if(strlen($username) < 17 && strlen($password) > 7){

        $checkusername = mysql_query("SELECT `id` FROM `database`.`user` WHERE `username` = '".$username."'");
        $checkemail = mysql_query("SELECT `id` FROM `database`.`user` WHERE `email` = '".$email."'");

        if(mysql_num_rows($checkusername) == 0 && mysql_num_rows($checkemail) == 0){

            $insert = mysql_query("INSERT INTO `database`.`user`(`username`,`password`,`email`) VALUES ('".$username."','".$password."','".$email."')") or die(mysql_error());
            ?><p><?php echo "You are Registered"; ?></p><?php
        }
        else{
            if(mysql_num_rows($checkusername) > 0){
                $error[] = "Username already exists";
            }
            if(mysql_num_rows($checkemail) > 0){
                $error[] = "Email already exists";
            }
            foreach($error as $value){
                ?><p><?php echo "'".$value."'<br>"; ?></p><?php
            }
        }
    }
    else{
        if(strlen($username) > 16){
            $error[] = "Username must have less than 16 characters";
        }
        if(strlen($password) < 8){
            $error[] = "Password must have 8 or more characters";
        }
        foreach($error as $value){
            ?><p><?php echo "'".$value."'<br>"; ?></p><?php
        }
    }
}
else{

    if(empty($username)){
        $error[] = "Please insert a username";
    }
    if(empty($password)){
        $error[] = "Please insert a password";
    }
    if(empty($email)){
        $error[] = "Please insert a email";
    }
    foreach ($error as $value) {
        ?><p><?php echo "'".$value."'<br>"; ?></p><?php
    }
}
}
?>

<div id="loginform">
    <form name="loginform" method="post">
        <table cellpadding="0" id="tb">
            <tr>
            <td colspan="2"><div class="loginheader"><h2>Register</h2></div></td>
            </tr>
        </table>
        <table cellpadding="0" id="REGOPTIONS">
            <tr>
            <td class="field">Username:</td>
            <td><input type="text" class="text" name="username"></td>
            </tr>
            <tr>
            <td class="field">Password:</td>
            <td><input type="password" class="text" name="password"></td>
            </tr>
            <tr>
            <td class="field">Email:</td>
            <td><input type="email" class="text" name="email"></td>
            </tr>
        </table>
        <table cellpadding="0">
            <tr>
            <td class="field"></td>
            <td><input type="submit" class="submitbutton" name="register" value="Register" /></td>
            </tr>
        </table>
    </form>
</div>

<?php
include "footer.php";
?>
Author: Maniero, 2014-05-23

2 answers

Вы можете использовать отдельные переменные для каждого типа ошибки, и указать их в соответствующих полях.

, Чтобы сообщения могли появиться одновременно, refatorei код, позволяющий обработки каждого поля в отдельности:

<?php
   $page = 'Register';
   include 'header.php';

   $user_error='';
   $mail_error='';
   $pass_error='';

   if( isset( $_POST['register'] ) ) {
      $username = $_POST['username'];
      $password = $_POST['password'];
      $email = $_POST['email'];

      // Tratamento de erros do username:

      if( empty( $username ) ) {
         $user_error = 'Please insert an username';
      } elseif ( strlen( $username ) ) > 16
         $user_error = 'Username must have less than 17 characters';
      } else {
         // Essa linha abaixo é sujeita a SQL Injection, cuidado!
         $checkusername = mysql_query("SELECT `id` FROM `database`.`user` WHERE `username` = '".$username."'");
         if(mysql_num_rows($checkusername) > 0) {
            $user_error = 'Username already exists';
         }
      }

      // Tratamento de erros da senha:

      if( empty( $password ) ) {
         $pass_error = 'Please insert a password';
      } elseif( strlen( $password ) < 8 ) {
         $pass_error = 'Password must have 8 or more characters';
      }

      // Tratamento de erros do email:

      if( empty( $email ) ) {
         $mail_error = 'Please insert an email';
      } else {
         // Essa linha abaixo é sujeita a SQL Injection, cuidado!
         $checkemail = mysql_query("SELECT `id` FROM `database`.`user` WHERE `email` = '".$email."'");
         if( mysql_num_rows( $checkemail ) > 0 ){
            $mail_error = 'Email already exists';
         }
      }
   }

   // Se não setamos nenhum erro, e o formulário foi enviado, podemos ir para o insert:
   if empty( $user_error )
   && empty( $mail_error )
   && empty( $pass_error )
   && isset( $_POST['register'] ) ) {
      $insert = mysql_query("INSERT INTO `database`.`user`(`username`,`password`,`email`) VALUES ('".$username."','".$password."','".$email."')") or die(mysql_error());
?>
<div id="sucesso">
   <h3>You are registered!</h3>
   <p>(aqui você pode por instruçoes, ou a mensagem que quiser, no caso do sucesso)</p>
</div>
<?php
   } else {
      // caso contrário, mostramos o form, e opcionalmente os erros encontrados:
      $user_error=empty($user_error)?'Username:' : '<b>'.htmlEntities($user_error).'</b>';
      $mail_error=empty($mail_error)?'Email:' : '<b>'.htmlEntities($email_error).'</b>';
      $pass_error=empty($pass_error)?'Password:' : '<b>'.htmlEntities($pass_error).'</b>';
      // O formulario está dentro deste else:
?>

<div id="loginform">
   <form name="loginform" method="post">
      <table cellpadding="0" id="tb">
         <tr>
            <td colspan="2"><div class="loginheader"><h2>Register</h2></div></td>
         </tr>
      </table>
      <table cellpadding="0" id="REGOPTIONS">
         <tr>
            <td class="field"><?php echo $user_error; ?></td>
            <td><input type="text" class="text" name="username"></td>
         </tr>
         <tr>
            <td class="field"><?php echo $pass_error; ?></td>
            <td><input type="password" class="text" name="password"></td>
         </tr>
         <tr>
            <td class="field"><?php echo $mail_error; ?></td>
            <td><input type="email" class="text" name="email"></td>
         </tr>
      </table>
      <table cellpadding="0">
         <tr>
            <td class="field"></td>
            <td><input type="submit" class="submitbutton" name="register" value="Register" /></td>
         </tr>
      </table>
   </form>
</div>

<?php
   } // Fechando o else acima

   include "footer.php";
?>

Таким образом, каждый ошибке, будет показано на своем поле. Это решение кажется подходящим для вашего случая, так как только ha ошибки каждого типа показано на рисунке в то же время в вашем коде (имя пользователя, пароль и адрес электронной почты).

, Если хотите, же ifмогут быть использованы и адаптированы для применения решения @Отто, что хорошо, если вы хотите, чтобы все ошибки отображаются в блоке только.

 3
Author: Bacco, 2014-05-23 17:15:24
<p><?php echo "'".$value."'<br>"; ?></p>

Торгуйте

$error =. "<p>".$value."<br></p>";

В конце цикла echo $error;

 1
Author: Otto, 2014-05-23 14:52:46