【问题标题】:Output values in foreach loop only onceforeach 循环中的输出值仅一次
【发布时间】:2013-06-05 14:07:05
【问题描述】:

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

谢谢

【问题讨论】:

  • 你为什么要在这里放一个foreach循环?!?
  • 所以基本上,您想在循环检索到一条错误消息后立即退出?
  • @bwoebi 就是把$error里面的值转换成一个字符串,然后输出到另一个html页面?
  • @Ken 不,foreach ($_POST ...)?完全没有必要。
  • @Ghillied 不是一条错误消息,而是每条错误消息只输出一次。 (例如,如果用户的电子邮件和密码不匹配,它将显示两条消息一次。)

标签: php html registration


【解决方案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 并且我可以访问。

【讨论】:

  • 感谢您的帮助,我的代码现在可以工作了。我在用户成功登录后将 $_SESSION 变量设置为 true。如果是这样,您所说的 POST login= 是否仍然成立?
  • 不,不直接。我不能那样设置会话变量。但是我可以更改任何常规变量,如果处理不当,这仍然可能是安全风险。例如,您在 regform.php 中使用的任何未在该文件中明确设置的变量都可以更改。
【解决方案2】:

问题在于,对于$_POST 中的每个 键值对,您运行所有 检查并在$error 中添加错误消息。因此,基本上,您运行检查的次数与 $_POST 中的键数一样多,并且对于每个循环,您都将相同的错误消息附加到 $error

删除这些行:

foreach($_POST as $field=>$value)
{
if(!empty($value))
{

和匹配的右括号,一切都应该正常。

【讨论】:

    【解决方案3】:

    这是因为第一个 foreach($_POST as $field=&gt;$value) 循环。

    您告诉脚本在$_POST 中提取一个键及其各自的值,将它们设置为$key$value,然后执行循环内的代码。针对$_POST中的每个变量执行循环。

    如果你直接访问$_POST变量,那么你不需要循环$_POST中的所有变量。

    删除

    foreach($_POST as $field=>$value)
    {
    if(!empty($value))
    {
    

    一切都会好起来的。

    【讨论】:

      【解决方案4】:

      然后你可以多开发你的错误数组! (根据您对我的评论的回答):

      这将是$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 !
      

      【讨论】:

        【解决方案5】:

        通过做

        $error[]="Invalid BizName entered.Please enter an alphanumerical username between 2 to 20 characters";
        

        每次遇到 $error 数组时,您都在声明它,正确的方法是使用 $error = array(); 在 foreach 部分之外定义此数组,然后在循环中您想在数组中附加一个值,您需要这样做array_push($error, "error message"); 你的数组将被很好地填充。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2023-04-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-10-30
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多