将行从成对的 html 表单元素插入到数据库表中

问题描述 投票:0回答:2

我有一个带有可重复输入字段的动态表单。提交表单后,接收 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”值并插入了空行。

php forms loops post sql-insert
2个回答
1
投票

如果您想保留循环,可以使用 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++;
  }
}

示例:https://3v4l.org/F47ui


0
投票

您可以简单地从

submit
中删除
$_POST
键,然后再使用常规
unset()
进行循环。但这是不好的做法。我宁愿建议做的是“隔离”您的数据,而不是这样:

<input name="distance" ... >

将所有输入设置为这样:

<input name="data[distance]" ... >

然后你只需要循环遍历“data”(随意命名)数组:

foreach($_POST['data'] as val)

另外,不要删除盲注中的最后一个元素,因为它基于错误的假设,即这始终是您的“提交”元素。如果向表单添加更多提交按钮会怎样?或者顺序会改变?

© www.soinside.com 2019 - 2024. All rights reserved.