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
我有一个 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