重复错误显示错误功能php

时间:2016-05-04 07:03:29

标签: php error-handling

我的网站上有一个output_errors功能,可输出所有" set"变量中的错误。

除了一件事之外,它几乎可以完全发挥作用;特别是对于一个错误,它将不止一次输出该错误(它不应该这样)。

如何工作是:如果正在注册的用户没有在表单的某个部分输入任何信息,则需要输出(一次)错误{{1} },以及用户遇到的任何其他错误。所有这些都显示在无序列表中。

这是我创建的功能:

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!';
}

}

假设我将所有字段留空并输入少于4个字符的用户名,这就是它应该输出的方式:

必须填写标有星号(*)的字段。

您的用户名长度不得超过4个字符。

这就是现在输出的方式:

必须填写标有星号(*)的字段。

必须填写标有星号(*)的字段。

必须填写标有星号(*)的字段。

请选择一个国家/地区。

您的用户名长度不得超过4个字符。

感谢所有帮助!

由于

1 个答案:

答案 0 :(得分:1)

问题在于您的foreach loop。它为每个必需文件插入错误消息。

你需要在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.';
}

它会将您的错误消息设置为一次而不是多次