我正试图在表中多次插入值数组。
我有一个简单的数组,该数组是由用户选中一个框生成的,这就是添加到数组中的内容,然后我想将每个值插入表中,我想我可以通过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起作用只是需要弄清楚循环数组)
如果有人能指出我正确的方向,我将不胜感激。
答案 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
}
准备语句的概念是将其传递到数据库,进行编译,优化和保存,就像存储过程一样。
一旦准备好就可以反复使用。您要做的就是每次执行时都将新值放入参数中。