【问题标题】:PHP: How to avoid duplicated results in a foreach inside a foreach?PHP:如何避免在 foreach 中的 foreach 中出现重复的结果?
【发布时间】:2016-12-02 01:20:36
【问题描述】:

我有一个项目列表:userIDpagoIDcursoID

(注意:我目前正在测试这个概念,还没有添加任何安全检查)。

该列表以编程方式生成,我从数据库中检索 userIDpagoID。我在每行旁边添加了一个文本输入字段,供管理员手动添加 cursoID

我做了一个while循环来制作列表:

while($x=mysqli_fetch_array($mostrarPagos)){
echo $x['pagoID'];
echo $x['userID'];
echo '<input name="verificarPago['.$x['pagoID'].']" type="text">';
};

我添加了一个提交按钮,当它被提交时,循环应该在数据库中插入一条包含这三个信息的新记录。问题是我不知道如何检索 userID,因为 $x['userID'] 将只存在于创建表的 while 循环中。

所以我尝试将 userId 放入输入文本中,并将其设置为只读字段。然后在另一个 foreach 循环中执行一个 foreach 循环。

while($x=mysqli_fetch_array($mostrarPagos)){
echo $x['pagoID'];
echo '<input name="userID['.$x['userID'].']" value="'.$x['userID'].'" type="text">';
echo '<input name="verificarPago['.$x['pagoID'].']" type="text">';
};

  if(isset($_POST['submit'])) { 
      $verificar = $_POST['verificarPago'];
      foreach ($verificar as $pago => $curso) {
          $userID = $_POST['userID'];
          foreach ($userID as $usuario) {
          $verificarPago = "INSERT pagosVerificados SET userID = '$usuario', pagoID = '$pago', cursoID = '$curso'";
          $cargarPago = mysqli_query($conectar, $verificarPago);
        }
        if ($verificarPago && $cargarPago) {

        }
      }

表格中有两行包含此信息(cursoID 取自我在输入字段中键入的内容):

userID. 17 pagoID. 4 cursoID. 18
userID. 18 pagoID. 5 cursoID. 15

我点击提交的结果是这样的:

userID. 17 pagoID. 4 cursoID. 18
userID. 18 pagoID. 4 cursoID. 18
userID. 17 pagoID. 5 cursoID. 15
userID. 18 pagoID. 5 cursoID. 15

这是我的查询:

SELECT DISTINCT pagos.pagoID, pagos.userID,  pagos.pagoMonto, pagos.pagoFecha, 
                pagos.pagoMedioUtilizado, pagos.pagoCuentaOrigen, pagos.pagoSucursal, 
                pagos.pagoCodigo,
                usuarios.userID, usuarios.userEmail,
                GROUP_CONCAT(DISTINCT cursos.nombreCurso, ' cid:', cursosUsuarios.cursoID ORDER BY cursosUsuarios.cursoID SEPARATOR '<br>') AS 'cursos'

                FROM pagos LEFT JOIN usuarios
                ON pagos.userID = usuarios.userID
                LEFT JOIN cursosUsuarios
                ON usuarios.userID = cursosUsuarios.userID

                LEFT JOIN cursos
                ON cursosUsuarios.cursoID = cursos.cursoID
                AND cursos.estadoCurso = 'abierto'

                JOIN pagosVerificados
                WHERE pagos.pagoID NOT IN (SELECT pagoID FROM pagosVerificados)

                GROUP BY pagos.pagoID

【问题讨论】:

  • 在您的 SELECT 查询中使用 GROUP BY pagoID, cursoID
  • 您也可以使用 DISTINCT。但是,您没有包括您在哪里执行 SELECT,所以我们不知道您是否使用了其中任何一个。
  • 警告:使用mysqli 时,您应该使用parameterized queriesbind_param 将用户数据添加到您的查询中。 请勿使用字符串插值或连接来完成此操作,因为您创建了一个严重的SQL injection bug切勿$_POST$_GET 数据直接放入查询中,如果有人试图利用您的错误,这可能会非常有害。

标签: php mysql loops foreach


【解决方案1】:

如果您需要回答问题,请这样做:

$alreadyHave = array();
while($x=mysqli_fetch_array($mostrarPagos)){
  if(in_array($x['pagoID'].'-'.$x['cursoID'], $alreadyHave)) {
    continue;
  }

  echo $x['pagoID'];
  echo '<input name="userID['.$x['userID'].']" value="'.$x['userID'].'"type="text">';
  echo '<input name="verificarPago['.$x['pagoID'].']" type="text">';
};


但是从技术上讲,最好在迭代之前拥有唯一的数据,因此只需将您的 SELECT 查询放在末尾:GROUP BY pagoID, cursoID

ALSO 将您的 INSERT 清理到数据库中(以免由于您的 sql 可注入代码而被对错误敏感的开发人员投反对票)(:

$verificarPago = "INSERT pagosVerificados SET ";
$verificarPago.= "  userID = ".(int)$usuario;
$verificarPago.= ", pagoID = ".(int)$pago;
$verificarPago.= ", cursoID = ".(int)$curso;

【讨论】:

    【解决方案2】:

    首先,如果您不想显示 userID(这是您的第一个设计选择),可以将 userID 放在隐藏的输入中

    <input type="hidden" id='userID' value="<? echo $x['pagoID'];?>"/>
    

    我不确定双重输入,但为什么不只使用一个 foreach 并为每个输入使用索引,就像你对 verificarPago 所做的那样 也许你可以替换

    echo '<input name="userID['.$x['userID'].']" value="'.$x['userID'].'" type="text">
    

    通过

    echo '<input name="userID['.$x['pagoID'].']" value="'.$x['userID'].'" type="text">
    

    然后

      $userID = $_POST['userID'];
      //foreach ($userID as $usuario) {
      $verificarPago = "INSERT pagosVerificados SET userID = '$userID[$pago]', pagoID = '$pago', cursoID = '$curso'";
    

    (未测试)

    祝你好运

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-27
      • 2018-08-20
      • 2018-02-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多