【问题标题】:prepared statement within for loop only executes oncefor循环中的预处理语句只执行一次
【发布时间】:2014-03-11 04:18:23
【问题描述】:

也许你们中的一个可以在这里快速启动我......

我尝试使用准备好的语句将表单值存储在带有 php.ini 的 mySQL 数据库中。我已经启动并运行了$stmt1 来存储我的助手的信息。

现在我想存储其他信息,例如帮助者能够提供帮助的日子。我的理解是,我只准备了一次 $stmt2,然后使用 for 循环查找参数值并执行该语句几次。

准备声明:

$stmt2 = $dbh->prepare('INSERT INTO '.$tbl_pre . $tbl_event .'
                                (helper_ID,
                                day_date,
                                needCabin)
                              VALUES
                                (:helper_ID,
                                :day_date,
                                :needCabin)');
$stmt2->bindParam(':helper_ID', $helperID);
$stmt2->bindParam(':day_date', $day_date);
$stmt2->bindParam(':needCabin', $night_ID);

然后只获取最后一个插入语句的 ID,因为它对于所有即将到来的插入都是相同的。

$helperID = $dbh->lastInsertId('ID');

现在从 for 循环开始:

for ($i = 0; $i < 3; $i++) {

  $insert = false;
  $night_ID = 0;
  $day_date = 0;

  if ($night[$i] != null) {

    $night_ID = 1;
    $day_date = $night[$i];
    $insert = true;


  } elseif ($day[$i] != null){

    $day_date = $day[$i];
    $night_ID = 0;
    $insert = true;

  }

  if ($insert) {

    $stmt2->execute();

  }
}
}

但它只是在第一次迭代后停止。如果我取消执行语句,它会在所有三个迭代中运行。

我错过了什么?

【问题讨论】:

标签: php mysql sql prepared-statement


【解决方案1】:

您的代码允许 两种情况都不会 导致插入。也就是说,如果 $day[$i] 和 $night[$i] 都没有设置。

所以测试一下是否有一些循环迭代通过而不进行插入:

if ($insert) {
    $stmt2->execute();
} else {
    echo "No insert executed for i=$i";
}

此外,您应该始终检查 prepare() 和 execute() 是否返回 false,这表明发生了错误。

您不必检查是否启用了 PDO 例外。

【讨论】:

  • else 语句是一个有效点。虽然这不是问题:-D 但你让我看到了。所以我把它作为正确的答案。我在上面粘贴的代码实际上是正确的,但是我发现内置循环时出错,为了清楚起见,我在上面省略了。但与往常一样,我以某种方式使用 $i 作为该错误循环的计数器。所以它实际上在第一次迭代中完成了我的主要 for 循环。所以谢谢你把我带到那里:-D
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-12-03
  • 2020-07-17
  • 1970-01-01
  • 1970-01-01
  • 2016-11-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多