递归错误显示错误函数php


Recurring Error Display error function php

我的网站上有一个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.';
}

它将设置一次错误消息,而不是多个