我正在使用foreach循环来保存数组中无效用户输入所导致的错误消息,将其更改为一个字符串并将其输出到另一个页面上。但是,虽然我能够成功输出字符串,但字符串是被重复多次。
我的代码摘录:
foreach($_POST as $field=>$value)
{
if(!empty($value))
{
if($_POST['Email']==$_POST['Verify_Email'])
{
$email=$_POST['Email'];
$email=mysqli_real_escape_string($cxn,$email);//Saves the input data & preps it for insertion into database.
}
else
{
$error[]="Mismatched Email Addresses";
}
if(preg_match('/^[a-z\d_]{2,20}$/i',$_POST['Username']))
{
$user=$_POST['Username'];
$user=mysqli_real_escape_string($cxn,$user);
}
else
{
$error[]="Invalid Username entered.Please enter an alphanumerical username between 2 to 20 characters";
}
if($_POST['Password']==$_POST['Verify_Password'])
{
$pass=$_POST['Password'];
$pass=mysqli_real_escape_string($cxn,$pass);
}
else
{
$error[]="Your passwords do not match";
}
if(preg_match('/^[a-z\d_]{2,20}$/i',$_POST['BizName']))
{
$biz=$_POST['BizName'];
$biz=mysqli_real_escape_string($cxn,$biz);
}
else
{
$error[]="Invalid BizName entered.Please enter an alphanumerical username between 2 to 20 characters";
}
}
if(!empty($_POST['Desc']))
{
$desc=$_POST['Desc'];
$desc=mysqli_real_escape_string($cxn,$desc);
}
else
{
$desc="NULL";
$desc=mysqli_real_escape_string($cxn,$desc);
}
}
foreach($_POST as $field => $value)
{
$$field = strip_tags(trim($value));
}
if(!empty($error))
{
$errormsg="";
foreach($error as $value)
{
$errormsg.= "$value";
}
include("RegForm.php");
exit();
}
include("RegForm.php");
我怀疑$ errormsg重复多次的原因是由$ error []
中的值引起的(E.g $error[]="Invalid BizName entered.Please enter an alphanumerical username between 2 to 20 characters";)
这是因为重复$ error的次数与用户输入字段的数量以及我有的$ error []的数量一致。
问题 如果我错误的$ error是多次重复$ errormsg的原因,有人可以指出为什么会发生这种情况,因为foreach循环应该只运行$ error数组中的值多少次(多少个错误)如果我的假设是错的,有人可以指出我正确的方向吗?
由于
答案 0 :(得分:1)
您使用foreach
循环错误。请查看以下
<?php
foreach($_POST as $field=>$value)
{
if(!empty($value))
{
/*
this code block is executed for every POSTed var with a value.
So once for Email
So once for Verify_Email
So once for Username
So once for Password
So once for Verify_Password
So once for BizName
So once for Desc
etc..
*/
}
}
?>
我想你只想在没有foreach的情况下使用代码块。
你也是这样做的。
<?
foreach($_POST as $field => $value)
{
$$field = strip_tags(trim($value));
}
?>
这样我可以将脚本中的任何变量设置为任何值。如果您使用$login = true
之类的变量来跟踪登录的用户,我只需POST
login=1
即可访问。
答案 1 :(得分:1)
问题是,对于$_POST
中的每个键值对,您运行所有检查并在$error
中添加错误消息。因此,基本上,您运行检查的次数与$_POST
中的密钥一样多,并且对于每个循环,您将相同的错误消息附加到$error
。
删除以下行:
foreach($_POST as $field=>$value)
{
if(!empty($value))
{
匹配的右括号和一切都应该可以正常工作。
答案 2 :(得分:1)
这是因为第一个foreach($_POST as $field=>$value)
循环。
您告诉脚本在$_POST
中提取密钥及其各自的值,将它们设置为$key
和$value
,然后在循环内执行代码。对$_POST
中的每个变量执行循环。
如果您直接访问$_POST
变量,则无需循环$_POST
中的所有变量。
删除
foreach($_POST as $field=>$value)
{
if(!empty($value))
{
一切都会正常。
答案 3 :(得分:1)
哟可能会更多地开发你的错误数组! (根据你的评论回答):
这是$error
结构:
数组结构
$error = array(
'email'=>array(
'hasError'=>'0',
'message'=>'My error Message'
),
'username'=>array(
'hasError'=>'0',
'message'=>'My error Message'
),
...=>array(
'hasError'=>'0',
'message'=>'My error Message'
)
);
创建数组
$errorMessages= array(
'email'=>'Wrong email!',
'username'=>'Wrong username!',
'password=>'Wrong password!',
'desc'=>'Wrong description!');
$elementsToBeValidated = array('email','username','password','desc');
$error = '';
foreach($elementsToBeValidated as $inputElem):
$error[$inputElem]['hasError'] = false;
$error[$inputElem]['message'] = $errorMessages[$inputElem];
所以在验证时将数组中的所有错误消息连接起来,只需将标志更改为true:
验证示例
if(/*conditions for a wrong username */) $error['username']['hasError'] = true;
要检查最后得到的所有错误(在循环之外),请执行以下操作:
$errorMessage = '';
foreach($error as $e):
if($e['hasError']) #if the hasError flag is true
$errorMessage.=$e['message'];
endforeach;
if(strlen($errorMessage)>0) return $errorMessage; #or echo, whatever you want !
答案 4 :(得分:0)
通过
$error[]="Invalid BizName entered.Please enter an alphanumerical username between 2 to 20 characters";
每次遇到$ error数组时都会声明$ error数组,正确的方法是使用$error = array();
在foreach部分之外定义此数组,然后在你的循环中想要在数组中追加一个值,你需要做array_push($error, "error message");
你的阵列将被填好。