【问题标题】:How to update several fields in a single foreach loop?如何在单个 foreach 循环中更新多个字段?
【发布时间】:2016-08-23 03:04:02
【问题描述】:

我有一张包含用户列表的表格。每个人都分配了一个复选框。当管理员选择一些复选框时,我的脚本会将一些信息保存到所选用户的数据库中。

现在,我的问题是,在该复选框旁边,我想要一个文本输入类型,以便管理员也可以为该用户留下评论。所以,当复选框被选中并且输入类型有一些数据时,数据也会被保存。

这是我到目前为止所做的(除了明显的安全问题,我还没有考虑到):

我的列表是为每个用户循环生成的:

<input type=text name="infoAdicional" value="'.$x['infoAdicional'].'">
<input name="enviar['.$x['userID'].']" type="checkbox" value="'.$x['userEmail'].'">

我已获取信息并为复选框生成了一个 foreach 循环,但无法从文本字段中获取附加信息以进行保存(它确实会更新其他值:

        $userID = $_POST['enviar']; 
        $infoAdicional = $_POST['infoAdicional'];
        foreach ($userID as $id => $email) {
            $sql = "UPDATE cursosUsuarios 
                    SET estadoCertificado = 'pending', 
                    infoAdicional='$infoAdicional'
                    WHERE userID = '$id'
                    AND email = '$email'
                    ";
            ... 
        }

我认为这是因为 $infoAdicional = $_POST['infoAdicional']; 应该在循环内,但只是将其插入其中,让每个选中复选框的用户都拥有相同的附加信息,它确实会重复自己。

【问题讨论】:

  • html 代码中 type=text 周围没有引号
  • 即使你把变量放在里面,你得到的结果就像变量放在外面一样。您需要使注释文本输入与复选框infoAdicional['.$x['userID'].'] 相同,然后在循环中执行$infoAdicional = $_POST['infoAdicional'][$id]
  • 如果你没有准备好报表,你不害怕吗?不过,您的 php 变量在单引号内不起作用。
  • @jaro1989 变量用双引号括起来,因此会被评估。
  • 您的代码容易受到SQL-Injections 的攻击。请开始使用准备好的参数化查询。

标签: php loops checkbox foreach


【解决方案1】:

是否将变量$infoAdicional 放入循环中并不重要。问题是带有名称的最后一个输入字段会覆盖所有,因此您将只有最后一个用户的注释。您需要更改的是,像使用复选框一样使用 [] 名称语法。

因此,notes 字段的 name 属性将如下所示 name="infoAdicional['.$x['userID'].']" 并且在循环中您将分配 infoAdicional[USERID]$infoAdicional

所以你的代码看起来像这样

$userID = $_POST['enviar']; 
foreach ($userID as $id => $email) {
      $infoAdicional = $_POST['infoAdicional'][$id];
      $sql = "UPDATE cursosUsuarios 
                SET estadoCertificado = 'pending', 
                infoAdicional='$infoAdicional'
                WHERE userID = '$id'
                AND email = '$email'
                ";
      ... 
}

还有你的 HTML 代码

<input type=text name="infoAdicional['.$x['userID'].']" value="'.$x['infoAdicional'].'">
<input name="enviar['.$x['userID'].']" type="checkbox" value="'.$x['userEmail'].'">

【讨论】:

    【解决方案2】:

    将输入参数更改为:

    <input type=text name="enviar['.$x['userID'].']['infoAdicional']" value="'.$x['infoAdicional'].'"> 
    <input name="enviar['.$x['userID'].']['email']" type="checkbox" value="'.$x['userEmail'].'">
    

    因此,您的数据将保留给特定用户。那么你的循环会是这样的:

    $userInfo = $_POST['enviar']; //Info here, right?
    foreach ($userInfo as $userId => $info) {
    $sql = "UPDATE cursosUsuarios 
            SET estadoCertificado = 'pending', 
            infoAdicional='$info['infoAdicional']'
            WHERE userID = '$userId '
            AND email = '$info['email']'
            ";
       ... 
    }
    

    我已经保存了你的语法,因为你的工作是用准备好的语句等填充它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-11
      • 2015-03-16
      • 1970-01-01
      • 1970-01-01
      • 2021-02-09
      • 2012-05-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多