如何使用PHP在单个foreach循环中将三个值添加到数据库中?

时间:2016-07-28 00:57:30

标签: php mysql foreach

我有一个输入表单,其中两个值作为键,以这种方式构造:

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

因此,HTML看起来像是这样的:

<input name="verificarPago[4-10]" type="text">

除此之外,我还有用户可以键入的值,例如“Juan”。

输入是以编程方式创建的,我想将它们中的每三个值(例如:4,10,Juan)保存到数据库中。

因此,当用户提交表单时,我想使用foreach来访问该数组中的元素,但我的问题是:我如何分解键来分别访问这两个值?< / p>

我已经尝试过了(我现在没有考虑安全性,我正试图证明这个概念):

              $verificar = $_POST['verificarPago'];
              foreach ($verificar as $pago => $curso) {
//I'm pretty much stuck here. 
                  $verificar= array_flip(explode("-", $verificar));

//I want to insert the three items into the database
                  $verificarPago = "INSERT pagosVerificados SET userID = '$usuario', pagoID = '$pago', cursoID = '$curso'";
                  $cargarPago = mysqli_query($conectar, $verificarPago);

              }

我已经尝试在表单中添加另一个输入类型,因此值不会在一起,但是这样我应该在foreach中执行foreach并且会呈现重复的结果(并且还会出现错误)。

2 个答案:

答案 0 :(得分:2)

如果不解决任何体系结构问题,添加错误检查或解决安全问题,请按照以下步骤操作

$verificar = $_POST['verificarPago'];
foreach ($verificar as $ids => $text) {
    list($pagoID, $cursoID) = explode("-", $ids);

    $sql = "INSERT INTO pagosVerificados (userID, pagoID, cursoID, someVarcharField)
                      VALUES ($usuario, $pagoID, $cursoID, '$text');";
    $cargarPago = mysqli_query($conectar, $sql);

}

这有点低效 - 为每次迭代执行插入。由于mysql支持批量插入,因此您可以修改查询的生成以利用它。

$verificar = $_POST['verificarPago'];
$rows = array();

foreach ($verificar as $ids => $text) {
    list($pagoID, $cursoID) = explode("-", $ids);
    $rows[] = "($usuario, $pagoID, $cursoID, '$text')";
}

$sql = "INSERT INTO pagosVerificados (userID, pagoID, cursoID, someVarcharField) VALUES "
               . implode(',', $rows)
               . ";";
$cargarPago = mysqli_query($conectar, $sql);

现在它只是数据库的一次往返

答案 1 :(得分:1)

这是一种通过POST传递值的奇怪方法。但是,为了扩展Peter的答案并解决明显的安全问题,您还可以使用预准备语句。它们被设计为准备一次然后执行多次,因此非常适合这项工作。

$verificar = $_POST['verificarPago'];
$sql = "INSERT INTO pagosVerificados (userID, pagoID, cursoID, someVarcharField) VALUES (?, ?, ?, ?)"
$stmt = $conectar->prepare($sql);

foreach ($verificar as $ids => $text) {
    list($pagoID, $cursoID) = explode("-", $ids);
    $stmt->bindParam("iiis", $usuario, $pagoID, $cursoID, $text);
    $stmt->execute();
}

自从我使用mysqli以来,已经有好几年了,但这应该可以解决问题。你也想在那里加入一些错误检查。