2

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

谢谢

4

5 回答 5

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访问。

于 2013-06-05T14:13:44.153 回答
1

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

删除这些行:

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

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

于 2013-06-05T14:14:10.243 回答
1

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

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

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

消除

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

一切都会好起来的。

于 2013-06-05T14:19:25.513 回答
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 !
于 2013-06-05T14:23:25.567 回答
0

通过做

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

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

于 2013-06-05T14:13:22.330 回答