我的网站上有一个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个字符。
感谢所有帮助!
由于
答案 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.';
}
它会将您的错误消息设置为一次而不是多次