PHP:如何在foreach内部避免重复的结果?

时间:2016-07-27 20:52:55

标签: php mysql loops foreach

我有一个项目列表: userID pagoID cursoID

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

列表以编程方式生成,我从数据库中检索 userID pagoID 。我在每行旁边添加了一个文本输入字段,以便管理员手动添加 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

2 个答案:

答案 0 :(得分: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;

答案 1 :(得分:1)

首先,如果您不想显示它(这是您的第一个设计选择),您可以将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'";

(未测试)

祝你好运