Проверка пустых переменных PHP с помощью логического оператора работает только в том случае, если обе переменные не пусты

Я пытаюсь проверить свою таблицу базы данных.

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

Проблема: Однако по какой-то причине моя проверка работает только в том случае, если для записи присутствуют и пароль, и адрес электронной почты (он не отображает сообщение об ошибке, если адрес электронной почты пуст, а пароль — нет). Ниже мой код:

require ('core/dbcon.php');
$user = mysqli_real_escape_string($con, $_GET['user']);
$acc_status = mysqli_real_escape_string($con, $_GET['status']);
if(empty($_POST['form']) === false){
    $usr_email = mysqli_real_escape_string($con, $_POST['email']);
    $pwd = mysqli_real_escape_string($con, $_POST['password']);
    $rpwd = mysqli_real_escape_string($con, $_POST['rpwd']);
    $qry = mysqli_query($con, "SELECT * FROM users WHERE email='$usr_email'") or die(mysqli_error($con));
    $usr_details = mysqli_fetch_assoc($qry);
    if(empty($usr_details['email'])=== true && empty($usr_details['password'])=== true){
        if(mysqli_num_rows($qry) == 0){
            if($pwd && $rpwd && $usr_email){
                if($pwd === $rpwd){
                    $pwd = md5($pwd);

                       $query = mysqli_query($con, "SELECT * FROM users WHERE username='$user' AND email='$usr_email'") or die(mysqli_error($con));
                       if (mysqli_num_rows($query)== 1){
                           //update database table
                       }else{
                            $errors[] = 'Error! Your details were not added to the system due to a technical error. Please contact the Admin.';
                        }           
                    }else{
                        $errors[] = 'Please make sure that the password entered in both fields are the same.';
                    }
                }else{
                    $errors[] = 'Please complete all fields marked with a red asterisk';
                }
            }else{
                $errors[] = 'Error! <b>'.$usr_email.'</b> already existis in our system.';
            }
        }else{
            $errors[] = 'Error! It looks like the username you have entered has been assigned an email address and password already.';
        }
    }

У меня есть запись с именем пользователя «testuser», электронной почтой «[email protected]» и паролем «password». Моя проверка работает нормально, она отображает ошибку "Ошибка! Похоже, введенному вами имени пользователя уже назначены адрес электронной почты и пароль." Однако, когда я удаляю форму адреса электронной почты база данных каким-то образом предполагает, что были выполнены следующие условия: if(empty($usr_details['email'])=== true && empty($usr_details['password'])=== true){, когда empty($usr_details['password'])===false.

Я попытался изменить логический оператор с && на ||, но у меня возникла та же проблема (поскольку ИЛИ в первую очередь должен принимать одну пустую и одну непустую переменную). Ваша помощь будет принята с благодарностью.


person Rumesh    schedule 03.07.2015    source источник
comment
Вы используете электронную почту пользователя ($usr_email) для запроса сведений о пользователе ($usr_details), так как же получить $usr_details, когда электронная почта была удалена? Кстати, у вас есть серьезные проблемы с безопасностью в вашем коде.   -  person Lukas Hajdu    schedule 04.07.2015
comment
Я просматриваю таблицу пользователей, чтобы найти, существует ли уже ($usr_email). Если это не так, система позволит пользователю добавить его. Таким образом, удаление адреса электронной почты должно по-прежнему работать. Я опубликовал только часть своего кода. У меня есть проверки для снижения рисков безопасности. Однако я не чувствовал, что они имеют отношение к вопросу.   -  person Rumesh    schedule 04.07.2015


Ответы (2)


Вместо :

if(empty($usr_details['email'])=== true && empty($usr_details['password'])=== true){

Попробуй это :

if($usr_details['email'] === NULL || $usr_details['password'] === NULL){

Для значения пустой базы данных лучше использовать NULL.

Изменить:

Ваш запрос будет пустым, потому что вы проверяете только $usr_details['email'], которого нет в базе данных. Так что условие будет выполнено.

Если вы хотите получить это правильно, попробуйте запросить с помощью username или unique id

$qry = mysqli_query($con,"select * from user where id=1");

or

$qry = mysqli_query($con,"select * from user where username='username'");

или, в качестве альтернативы, вы должны проверить как username, так и password в запросе:

$qry = mysqli_query($con,"select * from user where email='email' OR password='password'");
person Imran Abdur Rahim    schedule 03.07.2015
comment
У меня почему-то проверка NULL не работает. Мне пришлось вернуться к «пустому» чеку. - person Rumesh; 04.07.2015
comment
empty или null оба возвращают одно и то же. Но $var ="" пусто, а не равно нулю. Итак, я предложил вам использовать это. однако ваш запрос if(empty($usr_details['email'])=== true && empty($usr_details['password'])=== true){ Этот запрос вернет пустой результат. Потому что вы просто проверяете email - person Imran Abdur Rahim; 04.07.2015

Я только что обнаружил, что проблема связана с моим запросом, как намекнул Лукас Хайду:

$qry_email = mysqli_query($con, "SELECT email FROM users WHERE email='$usr_email'") or die(mysqli_error($con));

По какой-то причине проверка if(empty($usr_details['email'])=== true && empty($usr_details['password'])=== true){ выполнялась только в том случае, если адрес электронной почты уже существовал в базе данных.

Чтобы решить эту проблему, мне пришлось сформировать еще один запрос:

$qry_user = mysqli_query($con, "SELECT * FROM users WHERE username='$user'") or die(mysqli_error($con));
$usr_details = mysqli_fetch_assoc($qry_user);

Я не знаю, почему это так и как я могу улучшить свой код. Поэтому, пожалуйста, не стесняйтесь вносить предложения :)

person Rumesh    schedule 04.07.2015