我的网站上有一个output_errors
函数,它输出变量中的所有"set"错误。
除了一件事之外,它几乎完全按照它应该的方式工作;特别是对于一个错误,它会多次输出该错误(不应该)。
它的工作原理是:如果正在注册的用户没有向表单的某个部分输入任何信息,则需要输出(一次)错误Fields marked with an asterisk(*) must be filled in.
,以及用户遇到的任何其他错误。所有这些都显示在一个无序的列表中。
这是我创建的功能:
function output_errors($errors){
return '<ul><li>' . implode('</li><li>', $errors) . '</li></ul>';
}
这是我指定何时输出错误的代码:
$required = array('fname', 'username', 'password', 'password_again', 'email');
$reqCCNo = array('ccno');
// validation
foreach($_POST as $key=>$value){
if(empty($value) && in_array($key, $required) === true){
$errors[] = 'Fields marked with an asterisk(*) must be filled in.';
}
if(empty($value) && in_array($key, $reqCCNo) === true){
$errors[] = 'Please select a country.';
}
}
if(empty($errors)){
// credentials
if(preg_match('/[^a-z_'-0-9]/i', $fnp) || preg_match('/[^a-z_'-0-9]/i', $lnp)){
$errors[] = 'Credentials must only contain letters and numbers.';
}
// username
$result = mysqli_query($conn, "SELECT username FROM users WHERE username = '$user'");
$count = mysqli_num_rows($result);
if($count !== 0) {
$errors[] = 'That username is already taken.';
}
if(strlen($user) < 4){
$errors[] = 'Your username must be more than 4 characters long.';
}
if(strlen($user) > 16){
$errors[] = 'Your username must not be more than 16 characters long.';
}
if(preg_match('/[^a-z_'-0-9]/i', $user)){
$errors[] = 'Your username can only contain Alphanumeric characters.';
}
// email
if(filter_var($emailNex, FILTER_VALIDATE_EMAIL) === false){
$errors[] = 'That is not a valid email type.';
}
$email_result = mysqli_query($conn, "SELECT email FROM users WHERE email = '$emailNex'");
$email_count = mysqli_num_rows($email_result);
if($email_count !== 0) {
$errors[] = 'That email is already in use.';
}
// password
if(strlen($pass) < 6){
$errors[] = 'Your password must be more than 6 characters long.';
}
if($pass !== $_POST['password_again']){
$errors[] = 'Those passwords do not match!';
}
}
这是我用来输出所有这些错误的代码:
if(!empty($errors)){
echo output_errors($errors);
}
假设我将所有字段留空,并输入一个长度小于4个字符的用户名,这就是它的输出方式:
必须填写标有星号(*)的字段。
您的用户名长度必须超过4个字符
这就是它现在的输出方式:
必须填写标有星号(*)的字段。
必须填写标有星号(*)的字段。
必须填写标有星号(*)的字段。
请选择一个国家/地区
您的用户名长度必须超过4个字符
感谢所有的帮助!
感谢
问题出在foreach loop
上。它为每个Required文件插入错误消息。
你需要在foreach循环外创建一个标志,当它作为进入你的条件时,将其设置为true
$flag=FALSE;// set it false
foreach($_POST as $key=>$value){
if(empty($value) && in_array($key, $required) === true){
$flag=TRUE;// set true if fulfill your condition
}
}
if($flag){// set your message
$errors[] = 'Fields marked with an asterisk(*) must be filled in.';
}
它将设置一次错误消息,而不是多个