PDO插入foreach

时间:2018-10-09 11:23:39

标签: php pdo sql-insert

我正试图在表中多次插入值数组。

我有一个简单的数组,该数组是由用户选中一个框生成的,这就是添加到数组中的内容,然后我想将每个值插入表中,我想我可以通过foreach循环来实现它并迭代$我,但看来我做不到,我不必担心安全性或其他任何问题,因为这是两个人在内部使用的。

这是我所拥有的:

foreach($detailsinvoice as $desc){ 
  $conn3 = new PDO( DB_DSN, DB_USERNAME, DB_PASSWORD );
  $sql3 = "INSERT INTO 
             xero_invoices (ContactName, Description)
             VALUES (:ContactName, :Description)";  
  $st3 = $conn3->prepare ( $sql3 );
  $st3->bindValue( ":ContactName", $this->ContactName, PDO::PARAM_STR );
  $st3->bindValue( ":Description", $desc, PDO::PARAM_STR );
  $st3->execute();
  $this->InvoiceNumber = $conn3->lastInsertId();
  $conn3 = null;
}

这是我的第一次尝试,但是收集到该连接只能使用一次然后退出,因此我尝试了一次迭代,但是我再次得知您无法使用PDO语句来做到这一点。

$i = 3;
foreach($detailsinvoice as $desc){ 
  $conn[$i] = new PDO( DB_DSN, DB_USERNAME, DB_PASSWORD );
  $sql[$i] = "INSERT INTO 
             xero_invoices (ContactName, Description)
             VALUES (:ContactName, :Description)";  
  $st[$i] = $conn[$i]->prepare ( $sql[$i] );
  $st[$i]->bindValue( ":ContactName", $this->ContactName, PDO::PARAM_STR );
  $st[$i]->bindValue( ":Description", $desc, PDO::PARAM_STR );
  $st[$i]->execute();
  $this->InvoiceNumber = $conn[$i]->lastInsertId();
  $conn[$i] = null;
  $i++;
}

detailsinvoice是数组,每次的ContactName都相同(Contactname起作用只是需要弄清楚循环数组)

如果有人能指出我正确的方向,我将不胜感激。

2 个答案:

答案 0 :(得分:2)

准备好的语句的特征在于,您可以准备一次 一条语句,然后多次执行它,因此您的代码可以重写为:

// Create a connection
$conn = new PDO( DB_DSN, DB_USERNAME, DB_PASSWORD );
$sql = "INSERT INTO 
        xero_invoices (ContactName, Description)
        VALUES (:ContactName, :Description)";  
// Create a statement
$st = $conn->prepare ($sql);
foreach ($detailsinvoice as $desc) { 
    // bind values and execute statement in a loop:
    $st->bindValue( ":ContactName", $this->ContactName, PDO::PARAM_STR );
    $st->bindValue( ":Description", $desc, PDO::PARAM_STR );
    $st->execute();
    $this->InvoiceNumber = $conn->lastInsertId();
}
// this is optional
$conn = null;

答案 1 :(得分:1)

我不知道您从何处得知连接只能从中使用一次。您只能在脚本中连接一次。然后,只要您存储$conn变量并将其传递给您可以使用的任何函数(当然,范围在这里是相关的),您就可以随意使用它多次。

// connect ONCE per script
$conn = new PDO( DB_DSN, DB_USERNAME, DB_PASSWORD );

// write the query once
$sql = "INSERT INTO xero_invoices (ContactName, Description)
             VALUES (:ContactName, :Description)";  

// and prepare it once.
$st = $conn->prepare ( $sql );

// now loop over the array of parameters any number of times you like
foreach($detailsinvoice as $desc){ 

    $st->bindValue( ":ContactName", $this->ContactName, PDO::PARAM_STR );
    $st->bindValue( ":Description", $desc, PDO::PARAM_STR );
    $st->execute();

    // this line looks wrong, as $this->InvoiceNumber will get overwritten
    // each time round the loop
    //$this->InvoiceNumber = $conn->lastInsertId();

    // maybe you ment this, so at least you would have them all???? 
    $this->InvoiceNumber[] = $conn->lastInsertId();

    // or I have to assume you are going to add another query HERE
    // that will use that ID
}

准备语句的概念是将其传递到数据库,进行编译,优化和保存,就像存储过程一样。

一旦准备好就可以反复使用。您要做的就是每次执行时都将新值放入参数中。