Несколько if-операторов в php? - PullRequest
0 голосов
/ 06 марта 2012

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

Я пытался придумать следующую логику, но должен быть более логичный и эффективный способ сделать это (извините, я знаю, это выглядит примитивно):

if ( preg_match("/^[A-Za-z0-9]+(?:[ _-][A-Za-z0-9]+)*$/", $username) ) {
    if ((preg_match("^([0-9a-zA-Z]+[-._+&])*[0-9a-zA-Z]+@([-0-9a-zA-Z]+[.])+[a-zA-Z]{2,6}$", $email)) {
        if (/*password is ok*/) {
            //create user entry in the db
            //and save success message in the session variable
        } else {
            //error message for password
        }
    } else {
        //error message for email
    }
} else {
    //error message for username
}

Ответы [ 4 ]

4 голосов
/ 06 марта 2012

В идеале вы хотели бы иметь возможность показывать несколько сообщений об ошибках, если было несколько ошибок.Как то так:

$errors = array();
if( !preg_match("/^[A-Za-z0-9]+(?:[ _-][A-Za-z0-9]+)*$/", $username) )
{
    $errors[] = 'Username was invalid';
}
if ((preg_match("^([0-9a-zA-Z]+[-._+&])*[0-9a-zA-Z]+@([-0-9a-zA-Z]+[.])+[a-zA-Z]{2,6}$", $email))
{
    $errors[] = 'Email was invalid';
}
if( /* Password is bad */ )
{
    $errors[] = 'Password is bad somehow';
}

if( sizeof($errors) == 0 )
{
    // write to db
}
else
{
    // Display all error messages
}
1 голос
/ 06 марта 2012

Прежде всего, существует множество фреймворков и сценариев проверки, которые позволяют вам сделать это. С другой стороны, хорошо, что вы сделали это сами, так что вы знаете, что на самом деле происходит, если позже решите переключиться на фреймворк.

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

Реализация может выглядеть примерно так

$errors = array();

if (!preg_match("/^[A-Za-z0-9]+(?:[ _-][A-Za-z0-9]+)*$/", $username))
    array_push($errors, "Invalid username");

if (!preg_match("^([0-9a-zA-Z]+[-._+&])*[0-9a-zA-Z]+@([-0-9a-zA-Z]+[.])+[a-zA-Z]{2,6}$", $email))
    array_push($errors, "Invalid password");

if (otherValidationRule())
    array_push($errors, "Something else went wrong");

После этого вы проверяете, возникли ли какие-либо ошибки, и печатаете их, если это так

if (sizeof($errors) > 0) {
    print("<ul>\n");
    foreach($errors as $error)
        printf("<li>%s</li>\n", $error);
    print("</ul>\n");
}
else {
    // Proceed with registration
}
0 голосов
/ 06 марта 2012

Вы можете использовать die для завершения скрипта

if (/*User name in NOT ok*/)
{
die("Bad username");
}

if(/*Password is not ok*/)
{
die("Bad Pass");
}

Или использовать переменные

$usernameOk = false;
$passwordOk = false;

if(/*Username is ok*/)
{
$username = true;
}

if(/*Password is ok*/)
{
$passwordOk = true;
}

if(/*username true and password true*/)
{
//Execute statement
}
0 голосов
/ 06 марта 2012

Я думаю, что более короткий и более читаемый способ был бы:

if (!preg_match("/^[A-Za-z0-9]+(?:[ _-][A-Za-z0-9]+)*$/", $username))
    die("username error");

if (!preg_match("^([0-9a-zA-Z]+[-._+&])*[0-9a-zA-Z]+@([-0-9a-zA-Z]+[.])+[a-zA-Z]{2,6}$", $email))
    die("email error");

if (/*password is NOT ok*/)
    die("password error");

//create user entry in the db
//and save success message in the session variable

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...