我有一个输入表单,其中两个值作为键,以这种方式构造:
<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并且会呈现重复的结果(并且还会出现错误)。
答案 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以来,已经有好几年了,但这应该可以解决问题。你也想在那里加入一些错误检查。