【发布时间】:2016-12-02 01:20:36
【问题描述】:
我有一个项目列表: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
【问题讨论】:
-
在您的 SELECT 查询中使用 GROUP BY pagoID, cursoID
-
您也可以使用 DISTINCT。但是,您没有包括您在哪里执行 SELECT,所以我们不知道您是否使用了其中任何一个。
-
警告:使用
mysqli时,您应该使用parameterized queries 和bind_param将用户数据添加到您的查询中。 请勿使用字符串插值或连接来完成此操作,因为您创建了一个严重的SQL injection bug。 切勿将$_POST或$_GET数据直接放入查询中,如果有人试图利用您的错误,这可能会非常有害。