如何遍历 $_POST 以通过 PDO 更新数据库中的多个记录集

How to iterate through $_POST to update multiple recordsets in DB via PDO

我是 PDO 和关联数组的新手,但进展顺利。我已设置此代码以将 html 表单保存到单个记录集:

$str_sql = "UPDATE tbl_benutzer SET ";
    foreach($_POST as $key=>$value){
        if($key=='id'){continue;}
        $str_sql .= $key." = :".$key.", ";
    }
    $str_sql = substr($str_sql,0,-2)." WHERE id = :id";

    ///////SAVE DATA TO DB///////
    $stmt = $conn->prepare($str_sql);
    $stmt->execute($_POST);

现在我想修改相同的代码以将 html 表单的内容保存到多个记录集中。这是 HTML:

<input name="id[]" value="1">
<input name="tarif[]" value="A">
<input name="mitgliedschaft[]" value="X">
<input name="gebuehr[]" value="100">

<input name="id[]" value="2">
<input name="tarif[]" value="B">
<input name="mitgliedschaft[]" value="Y">
<input name="gebuehr[]" value="200">

<input name="id[]" value="3">
<input name="tarif[]" value="C">
<input name="mitgliedschaft[]" value="Z">
<input name="gebuehr[]" value="300">

这里是 $_POST 数组:

Array ( [id] => Array ( [0] => 1 [1] => 2 [2] => 3 ) 
[tarif] => Array ( [0] => A [1] => B [2] => C ) 
[mitgliedschaft] => Array ( [0] => X [1] => Y [2] => Z ) 
[gebuehr] => Array ( [0] => 100 [1] => 200 [2] => 300 ) )

这是我迄今为止尝试过的方法,但我的头脑就是无法解决它!:

$str_sql = "UPDATE tbl_stamm_tarif SET ";
    foreach($_POST as $key=>$value){
        if($key=='id'){continue;}
        $str_sql .= $key." = :".$key.", ";
    }
    $str_sql = substr($str_sql,0,-2)." WHERE id = :id";
    echo $str_sql;

    ///////SAVE DATEN TO DB///////
    $stmt = $conn->prepare($str_sql);
    foreach($_POST as $key=>$value){
        foreach($value as $key2=>$value2){
            $stmt->execute(array($key=>$value2));
        }
    }

在此先感谢您的帮助!

我会考虑将您的 HTML 结构更改为:

<input name="**model_name**[**id1**][tarif]" value="A">
<input name="**model_name**[**id1**][mitgliedschaft]" value="X">
<input name="**model_name**[**id1**][gebuehr]" value="100">

<input name="**model_name**[**id2**][tarif]" value="B">
<input name="**model_name**[**id2**][mitgliedschaft]" value="Y">
<input name="**model_name**[**id2**][gebuehr]" value="200">

(对于 UPDATE 页面,您实际上不应被允许更改 id

这样您就可以像这样迭代模型:

foreach($_POST['**model_name**'] as $id=>$model){}

并像以前一样在每次迭代中执行 UPDATE

更新

我也会对你的代码保持警惕,因为它极易受到 SQL 注入的攻击。你应该在直接将其直接插入之前根据已知列检查每个 $key 的值一份声明。否则,用户可以提交他们自己的 $key 并打开您的数据库。

更新 2

要么从数据库中提取列,要么将它们硬编码到您用作数组的任何 PHP 模型 class 中(节省行程,但如果更改模式则需要这样做) .

我可能会将 运行 和 SQL 之前的 $_POST 数组中的值分配给模型 class 中的键控数组,因为您可能需要它们稍后。

N.B.

其中很多问题已经在各种框架中得到解决;不知道你的项目是什么(可能是写一个框架)但是对于任何绊倒这个框架的人来说都可以节省大量的工作和安全漏洞!