PHP 重置 lastInsertId 的 foreach 打破循环

PHP foreach with resetting lastInsertId breaks the loop

我有一个 JSON 数据被发送到 php 脚本。如果数组中有多个项目,则希望将它们 link 放在父字段中。为此应取第一个项目的 id 并填写以下所有项目。

Table定义:

id parent quantity html
2 1 3 Product 2
1 null 2 Product 44

Json 输入:

[{"count":"3","item":"Product 1"},{"count":"1","item":"Product 5"},{"count":"1","item":"Product 7"},{"count":"1","item":"Product 44"}]

Php代码:

$items = json_decode($_POST["json"]); 
$parent =  null;
$sql = "INSERT INTO orders (parent,quantity,html) VALUES (?,?,?)"; 
if(is_array($items)) {
    foreach ($items as $key=>$i) {
        $pdo->prepare($sql)->execute([$parent,$i->count,$i->item]);
        if (count($items) > 1 && $key == 0) {
            $parent = $pdo->lastInsertId(); 
        };
    };
};

我对这段代码的问题是插入代码在循环运行 2 次后中断。无论 JSON 中的项目数量如何,代码仅插入前两项。我相信它与循环中的 if 语句有关。如果我删除它,所有项目都会被插入,但所有项目的父列都是空的。这应该仅适用于组中的第一项。以下所有的都应该采用第一个 id 并在父列中重用它。有什么想法吗?

最后,当打开错误模式时,我看到抛出:

未捕获的 PDOException:SQLSTATE[23000]:违反完整性约束:1062 键 'parent'

的重复条目“1753”

最后,我发现该列打开了唯一标志,并拒绝在此 table 中重复。因此只插入了 2 个项目。

我将我的 PDO 详细信息更改为此以发现错误:

array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION)

您没有在每个循环开始时将 $parent 重置为 null,或者如果不需要,您给它的 ID 是错误的。

您的线路最初在这里工作 $pdo->prepare($sql)->execute([$parent,$i->count,$i->item]); 因为 $parent 为空。

但下一次它 运行 是你的 $parent = $pdo->lastInsertId();

您的 $sql 在循环外构建的查询现在得到错误的 ID。

此外,您的 $key == 0 只会在第一个循环中 运行,因此它实际上并没有 lastInsertId。

我正在阅读此内容以了解更多信息:LAST_INSERT_ID() MySQL