我有一个带有可重复输入字段的动态表单。提交表单后,接收 PHP 脚本旨在将值对作为新行插入数据库中。问题在于
$_POST['submit']
元素正在执行额外/不需要的 INSERT 查询。
这是 foreach 循环,(不包括 sql secure)
if (isset($_POST['submit'])) {
$nearest = $db->prepare('insert into nearest set place=?, distance=?');
$i = 0;
foreach ($_POST as $val) {
$place = $_POST['place'][$i];
$distance = $_POST['distance'][$i];
$nearest->execute([$place, $distance]);
$i++;
}
}
此循环插入了“$_POST”值并插入了空行。
如果您想保留循环,可以使用 array_slice 不包含循环中的最后一项。
Array_slice 将从 0(不是字面量,而是第一项)到倒数第二个 (-1) 之间获取项目。
http://php.net/manual/en/function.array-slice.php
编辑;我认为你需要一个 for 循环来循环“地点”的计数。
if (isset($_POST['submit'])) {
$nearest= $db -> prepare('insert into nearest set place=?, distance=?');
for($i=0; $i< count($_POST['place']; $i++){
$place = $_POST['place'][$i];
$distance= $_POST['distance'][$i];
$nearest-> execute([$place , $distance]);
$i++;
}
}
您可以简单地从
submit
中删除 $_POST
键,然后再使用常规 unset()
进行循环。但这是不好的做法。我宁愿建议做的是“隔离”您的数据,而不是这样:
<input name="distance" ... >
将所有输入设置为这样:
<input name="data[distance]" ... >
然后你只需要循环遍历“data”(随意命名)数组:
foreach($_POST['data'] as val)
另外,不要删除盲注中的最后一个元素,因为它基于错误的假设,即这始终是您的“提交”元素。如果向表单添加更多提交按钮会怎样?或者顺序会改变?