【问题标题】:Foreach undefined offset error with $_POST and multiple arrays使用 $_POST 和多个数组的 Foreach 未定义偏移错误
【发布时间】:2015-10-09 01:45:42
【问题描述】:

这是我的代码:

if (isset($_POST['editbutton']))
        {
            UNSET ($_POST['editbutton']);
        foreach ($_POST as list ($id, $payment,$date)){
        echo $id;
        echo $payment;
        echo $date;}
        // $sqlupdate = ("UPDATE payments SET payment=:payment,payment_date=:date WHERE pay_id=:id");
        // $preparedStatement = $db->prepare($sqlupdate);
        }

我现在已将我的 UPDATE 注释掉,只是试图克服这个错误。回声现在也只是用于测试。这是我的 $_POST 的 var_dump:

 array (size=3)
  'id' => 
    array (size=2)
      0 => string '66' (length=2)
      1 => string '61' (length=2)
  'payment' => 
    array (size=2)
      0 => string '67.00' (length=5)
      1 => string '125.00' (length=6)
  'date' => 
    array (size=2)
      0 => string '2015-07-19' (length=10)
      1 => string '2015-07-15' (length=10)

所以,我在 $_POST 中得到了我想要的东西,但它的 foreach 并没有按照我期望的方式运行。这是我得到的错误:

Notice: Undefined offset: 2 in C:\foo on line 98

当然第 98 行是:

foreach ($_POST as list ($id, $payment,$date))

那么,我对 foreach 有什么不了解的地方?由于是foreach,一旦到达终点,它应该停止,但似乎它是foreaching 一个额外的时间。想法?有什么建议吗?

而且我认为我想做的事情很简单(至少对我来说),但我会解释一下。我有一个表单,允许我一次更新多行。它将它们作为 $_POST['ID']、$_POST['payment'] 和 $_POST['pay_date'] 提交。我的 var_dump 显示我从表单中得到了我需要的东西。但是,当我尝试构建查询时,我在从数组中获取正确值时遇到问题。我想要做的是从每个数组中获取 [0] 位置,并将它们放入我准备好的查询中,运行更新查询,然后从每个数组的 [1] 值重新开始,运行更新,冲洗重复。


编辑:我的问题得到了完美的答案,这是我的工作代码。

 if (isset($_POST['editbutton']))
    {
      UNSET ($_POST['editbutton']);
      $sqlupdate = ("UPDATE payments SET payment=:payment, payment_date=:date WHERE pay_id=:id");
      $preparedStatement = $db->prepare($sqlupdate);
      list($id, $payment, $date) = array_values($_POST);
      foreach ($id as $key => $items)
         {
           $preparedStatement->execute(array(':payment' => $payment[$key], ':date' => $date[$key], ':id' => $items));
         }
    }

【问题讨论】:

    标签: php arrays foreach


    【解决方案1】:

    不幸的是,list() 不能像我们期望的那样与关联数组和多维数组一起使用。你可以在这里参考:PHP list issue ( Undefined offset: )

    但是,如果你想使用 list() 无论如何你可以这样使用它:

    list($id, $payment, $date) = array_values($_POST);
    foreach ($id as $key => $items) {
        echo $items;
        echo $payment[$key];
        echo $date[$key];
    }
    

    您可以根据需要使用其他变体代替 foreach。

    【讨论】:

    • 从我在您的链接中读到的内容,list() 尝试在数值数组上工作,并且在关联数组上效果不佳,就像您说的那样。我在其他地方读过,所以我使用了 foreach ($P_POST as $editinfo[]) {},当我 var_dumped $editinfo 时,它取出了“名称”,而是创建了一个数字数组。但是当我运行 foreach ($editinfo as list($id,$payment,$pay_date)) 时我仍然遇到同样的错误。因此,我将尝试使用您上面的建议,看看我能用它做什么。谢谢!
    • 我已经阅读了上面显示的有关使用 foreach 的信息,但我不能 100% 理解它是如何工作的,我将把它扔到我的代码中并转储变量,直到我这样做.我还用我写完问题后意识到的一些东西更新了我的问题,并澄清了我想做的事情。非常感谢到目前为止的建议!
    • 完美!这完全符合我的要求!我不确定它到底在做什么 :(,我会盯着它看,希望它开始对我更有意义。但它确实满足了我的需要,而无需使用 for 循环和计数迭代等等那个。非常感谢!我什至不知道你可以使用这种格式的 LIST,我以前从未在任何地方见过它。这是很棒的信息!
    • 好吧,我花了一整夜转储变量并查看这段代码,但我仍然不明白这是如何工作的。我不知道列表如何,foreach 也没有得到它的结果。它有效,但我就是不明白。任何人都有任何可以解释假人在这里发生的事情的链接?谢谢!!
    【解决方案2】:

    UNSET 将重置您的 $_POST 值。所以在你的工作完成后使用它

    Example is here

    <?php
        $xyz='w3resource.com';
        echo 'Before using unset() the value of $xys is : '. $xyz.'<br>';
        unset($xyz);
        echo 'After using unset() the value of $xys is : '. $xyz;
    ?> 
    

    输出

    Before using unset() the value of $xys is : w3resource.com
    After using unset() the value of $xys is :
    

    所以最终的井形代码是

    <?php
    if (isset($_POST['editbutton']))
    {
        foreach ($_POST as list ($id, $payment,$date))
        {
            echo $id;
            echo $payment;
            echo $date;
        }
        //unset after doing the job
        UNSET ($_POST['editbutton']);
    }
    

    【讨论】:

    • 我正在取消设置数组的 [editbutton] 部分,而不是所有 $_POST。直到我这样做,它试图将编辑按钮的输入标签的名称放入 foreach 的输出中。通过取消设置,它至少解决了这个问题。
    • 它解决了我的 [editbutton] 数组值进入我的 foreach 的问题,这就是我没有设置的原因,它解决了我添加它来修复的问题。我发布的问题尚未解决,但我还没有机会尝试以下建议。我很快就会。
    【解决方案3】:

    您没有得到正确的值。

    尝试添加:

    echo 'id is ' .$id;
    echo 'payment is '.$payment;
    echo 'date is..well not valid ' .$date;
    

    也许你也会通过理解上一个答案告诉你的内容来学习一些东西。

    【讨论】:

    • 是的,在我写完我的问题后,我洗了个澡,并有一个很棒的淋浴时间认识。我的大部分好主意都发生在淋浴间!大声笑我没有得到我期望的输出,我把所有的 [id] 都转储到了 $id 中,然后所有的 [payment] 都转储到了 $payment 中,依此类推。不仅仅是每个数组的第一个值。 foreach 只是没有按照我的预期行事。谢谢。
    • 好吧:我已经使用 php 大约 3 年了,我在循环数据时从不使用列表。我认为如果你不使用 list() foreach 似乎会更容易理解
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-17
    • 2015-11-24
    • 1970-01-01
    • 1970-01-01
    • 2021-09-08
    相关资源
    最近更新 更多