[英]How would you improve this form validation code?
我需要验证表格。 这是一些服务器端验证,用于检查是否填写了必填字段,电子邮件是否有效,数字和字母数字字段不包含流氓字符。
我想要一些有关如何改进代码以使其更可靠和简洁的反馈。
<?php
// current state
$valid = true;
// post data collection
$name = "John Doe";
$email = "user@gmail.com";
$age = "19";
// select data that needs validation
$required = array($name, $email);
$validEmail = array($email);
$validNumber = array($age);
$validAlpha = array($name);
// check required fields
for ($i=0; $i<count($required); $i++) {
if (strlen($required[$i]) == 0) {
echo "Please fill out all required fields";
$valid = false;
break;
}
}
// check for valid email field
for ($i=0; $i<count($validEmail); $i++) {
if (preg_match('/^([A-Za-z0-9_\-\.])+\@([A-Za-z0-9_\-\.])+\.([A-Za-z]{2,4})$/', $validEmail[$i])) {
} else {
echo '"' . $validEmail[$i] . '"' . ' is an invalid email address <br />';
$valid = false;
}
}
// check numeric fields
for ($i=0; $i<count($validNumber); $i++) {
if (preg_match('/^[0-9 ]+$/', $validNumber[$i])) {
} else {
echo '"' . $validNumber[$i] . '"' . ' is an invalid number <br />';
$valid = false;
}
}
// check alpha
for ($i=0; $i<count($validAlpha); $i++) {
if (preg_match('/^[a-zA-Z ]+$/', $validAlpha[$i])) {
} else {
echo '"' . $validAlpha[$i] . '"' . ' contains invalid characters. This field only accepts letters. <br />';
$valid = false;
}
}
// return "Your form was successfully sent"
if ($valid) {
echo 'Your form was successfully sent. <br />Back to the site <form><input type="button" value="back" onclick="history.go(-1);return true;"></form>';
}
?>
通常可以通过以下方法来减少重复代码:
foreach
代替人工for
计数) 在您的情况下,您需要采用更好的输入变量处理方式,以保留名称并允许如下过滤:
$rules = array(
"email" => FILTER_VALIDATE_EMAIL,
"number1" => '/^[0-9 ]+$/',
"alpha2" => '/^[a-zA-Z ]+$/',
);
foreach ($rules as $varname => $verify) {
if (is_int($verify) ? !filter_var($_REQUEST[$varname], $verify)
: !preg_match($verify, $_REQUEST[$varname]))
{
echo "The field '$varname' contains invalid whatevers...";
$valid = false;
}
}
当然,通过从验证规则到变量名称的间接访问,您还可以得到更好的错误消息。 但这是这里的基本方法。 同样,使用一些自定义功能可以进一步提高可读性并减少代码。
要验证电子邮件(和其他一些字段),您可以(必须?)使用filter_var而不是regex,例如:
filter_var('bob@example.com', FILTER_VALIDATE_EMAIL)
将返回TRUE。
这是用于验证的过滤器列表http://www.php.net/manual/zh/filter.filters.validate.php
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.