php - 如何通过 PDO 迭代 $_POST 以更新数据库中的多个记录集

标签 php html mysql 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 注入(inject)的攻击。在将每个 $key 的值直接写入语句之前,你应该真正根据已知列检查它的值。否则,用户可以提交自己的 $key 并打开您的数据库。

更新2

要么从数据库中提取列,要么将它们硬编码到您用作数组的任何 PHP 模型类中(节省了时间,但如果更改架构则需要这样做)。

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

注意

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

关于php - 如何通过 PDO 迭代 $_POST 以更新数据库中的多个记录集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29253765/

相关文章:

LAN 中的 PHP 和服务器到服务器通信

php - 使用 PHP 在 MySql 数据库中插入数据时遇到问题

html - 垂直居中模态,滚动大内容

html - 列表项中的 CSS 边框

mysql - 如何在MySQL中实现 "read then write lock"?

php - Laravel 插入数据库

php - 无法将类实例传递给构造函数

javascript - $scope.someVariable 无法触及

php - 更改列编码 mysql 以显示为阿拉伯语言

mysql - 使用 Nodejs for MySQL 编写 Breezejs 数据源提供程序