Php foreach循环中的输出值仅一次
我正在使用foreach循环来保存由数组中无效用户输入导致的错误消息,将其更改为字符串并在另一页上输出。但是,虽然我能够成功地输出字符串,但该字符串正在重复多次 我的代码摘录:Php foreach循环中的输出值仅一次,php,html,registration,Php,Html,Registration,我正在使用foreach循环来保存由数组中无效用户输入导致的错误消息,将其更改为字符串并在另一页上输出。但是,虽然我能够成功地输出字符串,但该字符串正在重复多次 我的代码摘录: foreach($_POST as $field=>$value) { if(!empty($value)) { if($_POST['Email']==$_POST['Verify_Email']) { $email=$_POST['Email']; $email=
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数组中的值(有多少个错误)。如果我的假设是错误的,有人能给我指出正确的方向吗
谢谢你这么做
$error[]="Invalid BizName entered.Please enter an alphanumerical username between 2 to 20 characters";
每次遇到$error数组时都要声明它,正确的方法是使用$error=array()在foreach部分之外定义该数组
然后在循环中,如果要在数组中追加值,则需要执行array_push($error,“error message”)代码>
您的数组将被很好地填充。通过执行
$error[]="Invalid BizName entered.Please enter an alphanumerical username between 2 to 20 characters";
每次遇到$error数组时都要声明它,正确的方法是使用$error=array()在foreach部分之外定义该数组
然后在循环中,如果要在数组中追加值,则需要执行array_push($error,“error message”)代码>
您的数组将被很好地填充。您使用的是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
,然后我就可以访问了。您使用的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
,然后我就可以访问了。问题是$\u POST
中的每个键值对都运行所有检查,并在$error
中添加错误消息。因此,基本上,只要$\u POST
中有键,就可以运行检查,并且对于每个循环,都会将相同的错误消息附加到$error
删除以下行:
foreach($_POST as $field=>$value)
{
if(!empty($value))
{
匹配的结束括号和所有内容都应该可以正常工作。问题在于,对于$\u POST
中的每个键值对,您运行所有检查并在$error
中添加错误消息。因此,基本上,只要$\u POST
中有键,就可以运行检查,并且对于每个循环,都会将相同的错误消息附加到$error
删除以下行:
foreach($_POST as $field=>$value)
{
if(!empty($value))
{
匹配的结束括号和所有内容都应该可以正常工作。这是因为第一个foreach($\u POST as$field=>$value)
循环
您告诉脚本在$\u POST
中提取一个键及其相应的值,将它们设置为$key
和$value
,然后在循环中执行代码。循环针对$\u POST
中的每个变量执行
如果您直接访问$\u POST
变量,则不需要循环$\u POST
中的所有变量
除去
foreach($_POST as $field=>$value)
{
if(!empty($value))
{
一切都会正常工作。这是因为第一个foreach($\u POST as$field=>$value)
循环
您告诉脚本在$\u POST
中提取一个键及其相应的值,将它们设置为$key
和$value
,然后在循环中执行代码。循环针对$\u POST
中的每个变量执行
如果您直接访问$\u POST
变量,则不需要循环$\u POST
中的所有变量
除去
foreach($_POST as $field=>$value)
{
if(!empty($value))
{
一切都会很好。你可以再开发一点错误数组!(以下是您对我的评论的回答):
下面是$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'
)
);
if(/*conditions for a wrong username */) $error['username']['hasError'] = true;
创建阵列
$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,而不是将所有错误消息串联到一个数组中:
验证示例
$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'
)
);
if(/*conditions for a wrong username */) $error['username']['hasError'] = true;
要检查最后(循环外)出现的所有错误,请按照以下步骤进行操作:
PHP
你可以开发你的错误数组多一点!(以下是您对我的评论的回答):
下面是$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'
)
);
if(/*conditions for a wrong username */) $error['username']['hasError'] = true;
创建阵列
$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,而不是将所有错误消息串联到一个数组中:
验证示例
$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'
)
);
if(/*conditions for a wrong username */) $error['username']['hasError'] = true;
要检查最后(循环外)出现的所有错误,请按照以下步骤进行操作:
PHP
你为什么在这里放一个foreach
循环?!?因此,基本上,您希望在循环检索到一条错误消息后立即退出循环?@bwoebi它是将$error中的值转换为字符串,我将在另一个html页面中输出该字符串?@Ken no,foreach($\u POST…
?这是完全不必要的。@G不需要一条错误消息,只需要输出每条错误消息一次。(例如,如果用户的电子邮件和密码不匹配