php - 具有多个功能的 PHP 表单验证
问题描述
为了安全起见,我创建了一个注册表单,我想验证用户输入。
我创建了一些函数,如下所示。
我只是不确定如何正确实施它们。我嵌套if
语句吗?我只是像现在一样保留它吗?
当出现问题时如何停止我的脚本?以防止在出现问题时尝试插入。
任何帮助是极大的赞赏。
function validateLength($stringToValidate, $minimumLength) {
if(strlen($stringToValidate) < $minimumLength) {
return [
'error' => 'Minimum length is 8 charachters',
'class' => 'alert alert-danger',
];
} else {
return true;
}
}
function validateEmail($emailToVerify) {
if(filter_var($emailToVerify, FILTER_VALIDATE_EMAIL)) {
return true
} else {
return [
'error' => '<strong>Error:</strong> That is not a valid email address',
'class' => 'alert alert-danger'
];
}
}
function formIsFilledIn(array $formInputs = []) {
foreach ($formInput as $inputField) {
if(empty($inputField)) {
return [
'error' => '<strong>Error: </strong> Fill in all fields.',
'class' => 'alert alert-danger',
];
}
}
return null;
}
现在,我正在使用每个功能。
$formErrors = formIsFilledIn($_POST);
if($formErrors !== null) {
// Something is not filled in
}
$formErrors = validateLength($_POST['username'], 8);
if($formErrors !== true) {
// Username doesn't have enough characters
}
$formErrors = validateLength($_POST['password'], 8);
if($formErrors !== true) {
// Password doesn't have enough characters
}
为了完整起见,这是插入部分(它可以正常工作)
$stmt = $connect->prepare('INSERT INTO `users` (user_name, user_password, user_email, user_perms, user_created_at) VALUES (?, ?, ?, ?, ?)');
if($stmt) {
$username = $_POST['username'];
$password = hashPassword($_POST['password']);
$email = $_POST['email'];
$date = date('Y-m-d H:i:s');
$perms = "Gebruiker";
$stmt->bind_param('sssss', $username, $password, $email, $perms, $date);
if($stmt->execute()) {
$err = "<strong>Success: </strong> The account has been created";
$class = "alert alert-success";
} else {
$err = "<strong>Error:</strong> Something went wrong";
$class = "alert alert-danger";
}
}
解决方案
您确实可以使用 elseif 将 if 链接在一起。但是,我建议对功能进行一些更改。而不是让他们验证并返回一个包含一些错误的数组,您只需要让他们验证并返回一个true
或false
它看起来有点像这样:
function validateLength($stringToValidate, $minimumLength) {
if(strlen($stringToValidate) < $minimumLength) {
return false;
} else {
return true;
}
}
function validateEmail($emailToVerify) {
if(filter_var($emailToVerify, FILTER_VALIDATE_EMAIL)) {
return true;
} else {
return false;
}
}
function formIsFilledIn(array $formInputs = []) {
foreach ($formInputs as $inputField) {
if(empty($inputField)) {
return false;
}
}
return true;
}
这意味着您可以执行以下操作:
if(!formIsFilledIn($_POST)) {
$error = [
'error' => '<strong>Error: </strong> Fill in all fields.',
'class' => 'alert alert-danger',
];
} elseif(!validateLength($_POST['username'], 8) || !validateLength($_POST['password'], 8)) {
$error = [
'error' => 'Minimum length is 8 charachters',
'class' => 'alert alert-danger',
];
}
elseif(!validateEmail($_POST['email'])) {
$error = [
'error' => '<strong>Error:</strong> That is not a valid email address',
'class' => 'alert alert-danger'
];
}
else {
// now you can call a function that starts to insert stuff, everything has been validated
}
当然,表格越长,它就会越长。另一种选择是遍历帖子并检查所有字段是否具有有效长度。完成后,您可以检查电子邮件和所有其他特殊字段
推荐阅读
- java - 避免多次检查 != null
- ruby - 计算实例变量的映射
- reactjs - React TypeScript:如何传播嵌套状态对象的其他值
- python - 使用特定列在 scikit-learn 中估算分类缺失值
- angularjs - 在 HTML 输入/文本区域中的指定位置插入文本
- django - 使用 makemigrations 命令不会发生 Django 2.1.5 迁移
- python - 在 Windows 上使用 pgmagick 的 jpg2000 到 jpg 以灰度显示
- typescript - Typescript full-qualify namespace vs import 有什么区别
- c# - 急切地加载多个级别
- memory - 并行性:内存系统给人一种大、便宜和快速的错觉