【问题标题】:PDO INSERT statement not working inside counter loopPDO INSERT 语句在计数器循环内不起作用
【发布时间】:2014-09-15 20:24:41
【问题描述】:

谁能告诉我为什么这个 PDO 语句在 for 循环中不起作用?我正在尝试为数据库中的每个新条目添加一个位置。出于某种原因,这正在打破。关于为什么的任何想法?

编辑

请忽略下一个位置等。由于其他原因,gp_position 不能是AUTO_INCREMENT,并且下一个位置不会总是从 1 开始。请关注为什么这个 PDO 语句在循环中不起作用。

    $nextPosition = 1;
    $imgID = 1;
    $indb_gridID = 1;
    $timesToRepeat = 33;
    $indb_mem_id  = ($this->user->is_logged_in()) ? $this->user->info['id'] : 1;
    for($i=1; $i<=$timesToRepeat; $i++) {

        // now add the image to the grid positions
        $stmt = dbpdo::$conn->prepare("INSERT INTO grid_positions SET
                                       gp_mem_id   = :memID,
                                       gp_g_id     = :gridID,
                                       gp_img_id   = :imgID,
                                       gp_position = :position");
        $stmt->bindParam(':memID', $indb_mem_id, PDO::PARAM_INT);
        $stmt->bindParam(':gridID', $indb_gridID, PDO::PARAM_INT);
        $stmt->bindParam(':imgID', $imgID, PDO::PARAM_INT);
        $stmt->bindParam(':position', $nextPosition, PDO::PARAM_INT);
        $stmt->execute();

        $nextPosition++;    
    }

【问题讨论】:

  • 为什么你还需要你的 $nextPosition 变量,你可以只使用 $i,它在每个循环中都有相同的值和增量。
  • 下一个位置不会总是从 1 开始...可能从 145769 开始
  • 逻辑错误。您准备好您的语句并绑定您的参数ONCE。循环中唯一的内容应该是$stmt-&gt;execute(); $nextPosition++1;。在循环中重新准备和重新绑定否定了使用准备好的语句的主要目的之一。
  • 但是您在循环外将其初始化为 1,因此它将从 1 开始?
  • 为什么不让 gp_position 成为 auto_increment 列,然后不为其指定值。

标签: php mysql for-loop pdo


【解决方案1】:

试试这个重构的代码:

$nextPosition = 1;
$imgID = 1;
$indb_gridID = 1;
$timesToRepeat = 33;
$indb_mem_id  = ($this->user->is_logged_in()) ? $this->user->info['id'] : 1;

// prepare the statement once:
$stmt = dbpdo::$conn->prepare("INSERT INTO grid_positions SET
                                   gp_mem_id   = :memID,
                                   gp_g_id     = :gridID,
                                   gp_img_id   = :imgID,
                                   gp_position = :position");
$stmt->bindParam(':memID', $indb_mem_id, PDO::PARAM_INT);
$stmt->bindParam(':gridID', $indb_gridID, PDO::PARAM_INT);
$stmt->bindParam(':imgID', $imgID, PDO::PARAM_INT);
$stmt->bindParam(':position', $nextPosition, PDO::PARAM_INT);

for($i=1; $i<=$timesToRepeat; $i++) {

    // exec statement with current values:
    $stmt->execute();

    $nextPosition++;    
}

【讨论】:

    猜你喜欢
    • 2020-09-05
    • 2016-06-10
    • 2012-11-03
    • 1970-01-01
    • 2014-02-02
    • 1970-01-01
    • 2011-05-09
    • 1970-01-01
    相关资源
    最近更新 更多