foreach循环中的输出值只有一次

时间:2013-06-05 14:07:05

标签: php html registration

我正在使用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数组中的值多少次(多少个错误)如果我的假设是错的,有人可以指出我正确的方向吗?

由于

5 个答案:

答案 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;

要检查最后得到的所有错误(在循环之外),请执行以下操作:

PHP

$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"); 你的阵列将被填好。