Проверка PHP с функциями и список()


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

// Declare regex variables

   $regex_email = "/^[a-zA-Z0-9._-]+@[a-zA-Z0-9-]+\.[a-zA-Z.]{2,5}$/";
   $regex_password = "/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*\W).*$/";

// Declare validation functions

    function checkEmail($regex, $email) {

        if (!preg_match($regex, $email)) {

            $error = "The format of that Email Address is invalid";
            $solution = "Please go back and <a href=\"javascript:history.go(-1)\">try again</a>";

        }

        return array($error, $solution);

    }

    function checkPassword($regex, $password) {

        if (!preg_match($regex, $password)) {

            $error = "Your Passwords does not meet our requirements";
            $solution = "Please go back and <a href=\"javascript:history.go(-1)\">try again</a>";

        }

        return array($error, $solution);

    }

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

// Values for $email and $password are fetched from `$_POST` before hand...

// Validate form

    list ($error, $solution) = checkEmail($regex_email, $email);
    list ($error, $solution) = checkPassword($regex_password, $password);

// Display error

    echo("Error:<br />".$error."<br />Solution:<br />".$solution."");

Но увы, оно не работает и отображается без ошибок на все и я делаю проверку ошибок после каждой из них такой:

// Validate form

    list ($error, $solution) = checkEmail($regex_email, $email);

    if (!$error) {

        list ($error, $solution) = checkPassword($regex_password, $password);

    }

// Display error

    echo("Error:<br />".$error."<br />Solution:<br />".$solution."");

Я не возражаю делать это, как это, но когда у меня допустим 10+ проверить*значение* функции вызова, каждый завернутый в Оператор if внутри оператора if и так далее, это выглядит немного грязный, я не уверен, если есть другой подход, который будет работать больше нравится первый способ я пробовал без всего , если заявлениес.



301
3
задан 6 ноября 2011 в 11:11 Источник Поделиться
Комментарии
2 ответа

Я бы сделал следующее:

function checkEmail($errors, $email) {
$regex_email = "/^[a-zA-Z0-9._-]+@[a-zA-Z0-9-]+\.[a-zA-Z.]{2,5}$/";
if (!preg_match($regex_email, $email)) {
array_push($errors, "The format of that Email Address is invalid");
array_push($solutions, "Please go back and <a ...>try again</a>");
}
return array($errors, $solution);
}

$errors = array();
$solutions = array();
list ($errors, $solutions) = checkEmail($errors, $solutions, $email);
// ...

if (count($errors) > 0) {
// TODO: print the errors
}

Рассмотреть вопрос об объявлении $regex_mail переменной внутри checkEmail функции.

1
ответ дан 6 ноября 2011 в 10:11 Источник Поделиться

Это не может быть то, что вы ищете, но я недавно написал этот код, чтобы проверить мои формы.

Как вы могли заметить, я определите данные, которые будут проверены в $проверить массив. Затем некоторые циклы проходят через них и показать ошибки. Если ошибки не найдены, он отправляет форму.

С некоторыми изменениями, вы могли, вероятно, использовать что-то подобное. Надеюсь, что это помогает.

<?php

# post data collection
$name = "Full name";
$email = "a@b.c";
$age = "193";
$x = "s";
$y = "s";

# select data that needs validation
$validate = array(
'required' => array($name, $email, $x, $y),
'validEmail' => array($email),
'validNumber' => array($age),
'validAlpha' => array($name)
);

# error messages
$errorsMsgs = array(
'required' => 'Please fill out all required fields.',
'validEmail' => 'is an invalid email address.',
'validNumber' => 'is an invalid number.',
'validAlpha' => 'contains invalid characters. This field only accepts letters and spaces.'
);

$errorMarkup = "<h1>We found a few errors :-(</h1><h2>Please fix these errors and try again</h2><ol>";
$successMarkup = "<h1>Success!</h1><h2>Your form was sent successfully.</h2>";
$backMarkup = "<a href=\"" . $_SERVER['HTTP_REFERER'] . "\">Back to form</a>";

# begin state
$valid = true;

# loop through fields of error types
foreach ($validate as $type => $fields) {
# loop through values of fields to be tested
foreach ($fields as $value) {
# throw error if value is required and not entered
if ($type === 'required' && strlen($value) === 0) {
$errorMarkup .= "<li>$errorsMsgs[$type]</li>";
$valid = false;
break;
}
else if (
$type === 'validEmail' && !filter_var($value, FILTER_VALIDATE_EMAIL) ||
$type === 'validNumber' && !preg_match('/^[0-9 ]+$/', $value) ||
$type === 'validAlpha' && !preg_match('/^[a-zA-Z ]+$/', $value)
) {
if (strlen($value) === 0) {break;} # skip check if value is not entered
$errorMarkup .= "<li>\"$value\" $errorsMsgs[$type]</li>";
$valid = false;
continue;
}
}
}

if ($valid) {
# email form
$body = $successMarkup . $backMarkup;
$title = "Form sent";
} else {
$body = $errorMarkup . "</ol>" . $backMarkup;
$title = "Form errors";
}

# write html ouput
echo "<!DOCTYPE html><head><title>$title</title><style type=\"text/css\">body{margin:100px;font:16px/1.5 sans-serif;color:#111}h1{font-size:32px;margin:0;font-weight:bold}h2{font-size:18px;margin:0 0 20px 0}ol,li{list-style-position:inside;padding-left:0;margin-left:0}</style></head><body>$body</body></html>";
?>

3
ответ дан 6 ноября 2011 в 04:11 Источник Поделиться