Оператор if-else strlen не работает php

Я пытаюсь создать рабочую проверку регистрации, однако у меня есть проблема. Проверка работает, но возникает ошибка, даже если пользователь вводит правильную информацию, инструкция INSERT не выполняется. Однако, когда оператор "elseif" удаляется, ошибка отображается в интерфейсе, но данные по-прежнему ВСТАВЛЯЮТСЯ, даже если в пользовательской форме есть ошибка; например, пароль состоит только из букв. Буду признателен, если кто-нибудь исправит эту ошибку. Полная проверка ниже. Спасибо, Васим.

<?php include "connection2.php" ?>
<?php
session_start();
if (empty($errors)) { 
    if(isset($_POST['submitted'])) { 

        $firstname=$_POST['Firstname'];
        $lastname=$_POST['Lastname'];
        $username=$_POST['Username'];
        $password= $_POST['Password'];
        $email=$_POST['Email'];


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

            if (strlen($username)>10) {
                echo "Username is too long (Max 10 Characters)";
            }
            else {           

                //check password length
                if (strlen($password)>15||strlen($password)<5) {
                    echo "Password must be 5 to 15 characters<br>";
                }
                if (!preg_match("#[0-9]+#", $password)) {
                    echo "Password must include at least one number!<br>";
                }
                if (!preg_match("#[a-zA-Z]+#", $password)) {
                    echo "Password must include at least one letter!<br>";
                }

                elseif ((!strlen($username) >10) and

                        (!strlen($password)>15||!strlen($password)<5) and     
                        (preg_match("#[0-9]+#", $password)) and 
                        (preg_match("#[a-zA-Z]+#", $password))) {


                    $sql = mysql_query
                        ("INSERT INTO users(firstname, lastname,username, password, email)         

            VALUES ('$firstname','$lastname','$username',  

            '$password','$email')");

                    md5($password);
                    //register the user!

                    echo "Your Are Now a Member";




                }

            }
        }

        mysql_close(); 
    }}
else { ?>
    <?php }
?> 

person Wasim Patel    schedule 08.05.2015    source источник
comment
Первое, что вам нужно сделать, это стандартизировать ваши отступы, чтобы их было легче читать.   -  person developerwjk    schedule 09.05.2015
comment
Также прекратите использовать mysql_. используйте mysqli_ или PDO.   -  person Anant Kumar Singh    schedule 09.05.2015
comment
попробуйте, допустимо ли это имя пользователя: '); УДАЛИТЬ пользователей ТАБЛИЦЫ; --   -  person h3n    schedule 09.05.2015
comment
Можете ли вы упомянуть входную строку, которую вы тестируете, и при тестировании того, что она дает?   -  person user3653796    schedule 09.05.2015
comment
@Wasim Patel, пожалуйста, отметьте ответ, который даст вам решение.   -  person Anant Kumar Singh    schedule 31.08.2015


Ответы (3)


Ваш elseif привязан только к последнему if. И я не уверен, правильно ли вы поняли всю перевернутую логику. Но более простое решение состоит в том, чтобы просто установить переменную, указывающую, не прошла ли какая-либо из проверок, и протестировать ее.

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

    if (strlen($username)>10) {
        echo "Username is too long (Max 10 Characters)";
    }
    else {           
        $error = false;
        //check password length
        if (strlen($password)>15||strlen($password)<5) {
            echo "Password must be 5 to 15 characters<br>";
            $error = true;
        }
        if (!preg_match("#[0-9]+#", $password)) {
            echo "Password must include at least one number!<br>";
            $error = true;
        }
        if (!preg_match("#[a-zA-Z]+#", $password)) {
            echo "Password must include at least one letter!<br>";
            $error = true;
        }

        if (!$error) {
            // insert new users
        }
    }
}
person Barmar    schedule 08.05.2015

В PHP конструкциям elseif и else if может потребоваться больше фигурных скобок, см. примечание к http://php.net/manual/en/control-structures.elseif.php

Дополнительно проверьте приоритет оператора. Использование ключевых слов «и» и «или», чтобы иметь тот же вес, что и использование «||» или же '&&'. Я бы порекомендовал добавить дополнительные фигурные скобки и круглые скобки, чтобы сделать условные операторы еще более понятными.

person edoceo    schedule 08.05.2015
comment
Спасибо @anant kumar singh. Все валидации полностью рабочие. :) - person Wasim Patel; 09.05.2015

Эй, я думаю, что ваша структура немного неверна.

<?php include "connection2.php" ?>
 <?php
 session_start();
    if (empty($errors)) { 
     if(isset($_POST['submitted'])) { 


    $firstname=$_POST['Firstname'];
    $lastname=$_POST['Lastname'];
    $username=$_POST['Username'];
    $password= $_POST['Password'];
    $email=$_POST['Email'];


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

          if (strlen($username)>10)
          {
             echo "Username is too long (Max 10 Characters)";
          }
          elseif(strlen($password)>15||strlen($password)<5)
          {           
             echo "Password must be 5 to 15 characters<br>";
          }
       elseif (!preg_match("#[0-9]+#", $password)) {
          echo "Password must include at least one number!<br>";
        }
        elseif (!preg_match("#[a-zA-Z]+#", $password)) {
          echo "Password must include at least one letter!<br>";
       }

          else ((!strlen($username) >10) and

            (!strlen($password)>15||!strlen($password)<5) and     
            (preg_match("#[0-9]+#", $password)) and 
           (preg_match("#[a-zA-Z]+#", $password)))
              {


      $sql = mysql_query
       ("INSERT INTO users(firstname, lastname,username, password, email)         

        VALUES ('$firstname','$lastname','$username',  

        '$password','$email')");

           md5($password);
           //register the user!

               echo "Your Are Now a Member";




      }

        }
      }




      mysql_close(); 
           }}
            else { ?>
             <?php }
                ?> 

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

person Max    schedule 08.05.2015