2016-07-27 127 views
1

我有一個項目列表:userID,pagoID,cursoID。 (注:目前我正在測試這個概念,沒有添加任何安全檢查)。PHP:如何避免在foreach內的foreach重複結果?

通過編程生成列表,在這裏我從數據庫中的用戶ID 檢索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 
+1

使用GROUP BY pagoID,cursoID在你的SELECT查詢 – num8er

+1

你也可以使用DISTINCT。然而,你沒有包括你在SELECT中的位置,所以我們不知道你是否在使用這些選項。 –

+1

**警告**:使用'mysqli'時,您應該使用[參數化查詢](http://php.net/manual/en/mysqli.quickstart.prepared-statements.php)和['bind_param']( http://php.net/manual/en/mysqli-stmt.bind-param.php)將用戶數據添加到您的查詢中。 **不要**使用字符串插值或連接來完成此操作,因爲您創建了嚴重的[SQL注入漏洞](http://bobby-tables.com/)。 **絕不**將'$ _POST'或'$ _GET'數據直接放入查詢中,如果有人試圖利用您的錯誤,這會非常有害。 – tadman

回答

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消毒到數據庫(爲了不受bug的影響d因爲你的SQL注射代碼evelopers)(:

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

首先,你可以把用戶ID在一個隱藏的輸入,如果你不想顯示它(這是你的第一個設計選擇)

<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'"; 

(未測試)

好運