【发布时间】:2014-02-28 18:27:17
【问题描述】:
我有一个带有动态(用户确定)行数的 html 表单,每行都有几个输入;我正在尝试实现将插入行的 MySQL 查询 到 db 表中,或多或少是逐行的(尽管在这个表之外有一个值 $_POSTing,我也会添加到 INSERT 中)。
我正在像这样检索这些值:
<?php
if (isset($_POST['submit'])) {
$lineItems = array();
foreach ($_POST['date'] as $i => $value) {
$customer = $_POST['customer'][$i]; // this value is from *outside* the line items table
$date = $_POST['date'][$i];
$time = $_POST['time'][$i];
$fee = $_POST['fee'][$i];
$lineItems[] = "('$customer', '$date', '$time', '$fee')";
// I realize the query should be outside the loop, but what I'm trying to do is something like this (pseudo-code):
$query = "INSERT INTO Line_Items (CUSTOMER, DATE, TIME, FEE) VALUES ". implode(", ", $lineItems)
. "ON DUPLICATE KEY UPDATE
CUSTOMER = VALUES(CUSTOMER),
DATE = VALUES(DATE),
TIME = VALUES(TIME),
FEE = VALUES(FEE)
";
}
}
?>
使用此查询 - 在循环内部或外部 - 我只插入来自最后一行输入的值;有人可以举例说明如何 构造一个查询以插入多个行项目和适当的查询?非常感谢。
【问题讨论】:
-
拜托,在您编写 任何 更多 SQL 接口代码之前,您必须阅读 proper SQL escaping 以避免像您在这里遇到的那样严重的 SQL injection bugs。 从不将
$_POST数据直接放入查询中。 -
如果将插入语句放在循环之外似乎可以正常工作...
-
谢谢@tadman。我只是想解决这个问题,我向你保证我会重新审视注射预防。
-
您应该在忘记之前解决这个问题,因为当您忘记terrible things can happen。如果您使用的是 PDO 等数据库层,请使用 占位符值。字符串插值是一个非常糟糕的主意。