如何通过PDO迭代$_POST来更新DB中的多个记录集


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){}

并像以前一样在每次迭代上执行CCD_ 3。

更新

我也要小心你的代码,因为它非常容易受到SQL注入的攻击。。在将每个$key的值直接打成一个语句之前,您应该根据已知的列来检查它的值。否则,用户可以提交自己的$key并打开您的数据库。

更新2

从数据库中提取列,或者将它们硬编码到用作数组的任何PHP模型类中(可以省去一次旅行,但如果您更改了模式,则需要这样做)。

在运行SQL之前,我可能会将值从$_POST数组分配给模型类中的键控数组,因为您稍后可能需要这些值。

N.B.

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