为什么语句1按预期工作,这意味着它将在每一行中插入不同的值。但是语句2总是为每个父循环插入相同的内容,因此对于执行语句2的每个子foreach,都会有重复的行?
function insert($db, $data)
{
$stmt1 = $db->prepare("
INSERT INTO table1(
`order`, `parent_id`, `caption`, `caption2`
) VALUES(
:order, :parent_id, :caption, :caption2,
)
");
$stmt2 = $db->prepare("
INSERT INTO table2(
`id`, `order`, `caption`
) VALUES(
:id, :order, :caption
)
");
$count = 1;
foreach ($data as $foo => $value) {
$stmt1->bindValue(':order', $count, PDO::PARAM_INT);
$stmt1->bindValue(':parent_id', 0, PDO::PARAM_INT);
$stmt1->bindValue(':caption', !array_key_exists('caption', $value) || is_null($value['caption']) ? '' : $value['caption'], PDO::PARAM_STR);
$stmt1->bindValue(':caption2', !array_key_exists('caption2', $value) || is_null($value['caption2']) ? '' : $value['caption2'], PDO::PARAM_STR);
$stmt1->execute();
$parentId = $db->lastInsertId();
if (array_key_exists('bar', $value)) {
$tabCount = 1;
foreach ($value['bar'] as $bez) {
$stmt2->bindValue(':order', $tabCount, PDO::PARAM_INT);
$stmt2->bindValue(':id', $parentId, PDO::PARAM_INT);
$stmt2->bindValue(':caption', $bez, PDO::PARAM_STR);
$stmt2->execute();
$tabCount++;
}
}
if (array_key_exists('sub', $value)) {
$subcount = 1;
foreach ($value['sub'] as $sub => $subval) {
$stmt1->bindValue(':order', $subcount, PDO::PARAM_INT);
$stmt1->bindValue(':parent_id', $parentId, PDO::PARAM_INT);
$stmt1->bindValue(':caption', !array_key_exists('caption', $subval) || is_null($subval['caption']) ? '' : $subval['caption'], PDO::PARAM_STR);
$stmt1->bindValue(':caption2', !array_key_exists('caption2', $subval) || is_null($subval['caption2']) ? '' : $subval['caption2'], PDO::PARAM_STR);
$stmt1->execute();
$subParentId = $db->lastInsertId();
$subcount++;
if (array_key_exists('bar', $value)) {
$tabSubCount = 1;
foreach ($value['bar'] as $bezSub) {
$stmt2->bindValue(':order', $tabSubCount, PDO::PARAM_INT);
$stmt2->bindValue(':id', $subParentId, PDO::PARAM_INT);
$stmt2->bindValue(':caption', $bezSub, PDO::PARAM_STR);
$stmt2->execute();
$tabSubCount++;
}
}
}
}
$count++;
}
}
答案 0 :(得分:0)
这只是一个错字。 在第二个子foreach中,我写了“foreach($ value ...)”而不是“foreach($ subval ...)”。 我现在讨厌自己-.-