Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php foreach循环中的输出值仅一次_Php_Html_Registration - Fatal编程技术网

Php 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循环来保存由数组中无效用户输入导致的错误消息,将其更改为字符串并在另一页上输出。但是,虽然我能够成功地输出字符串,但该字符串正在重复多次

我的代码摘录:

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不需要一条错误消息,只需要输出每条错误消息一次。(例如,如果用户的电子邮件和密码不匹配