PDO / mySQL如何绑定多个值来存储多行

时间:2016-04-17 09:59:02

标签: php mysql pdo

要通过form method="post"从网站存储6个invoce项目,我使用了几个像这样的输入元素

    <input name="item[]" value="6 hour service"/>
    <input name="item[]" value="1 days travel"/>
....

Serverside我将$ _POST ['Item']复制到这样的数组

item[]= $_POST['Item'];

然后我可以访问item [],它看起来像这样

[item] => Array
    ( 
       [0] => 6 hour service
       [1] => 1 days travel
       [2] => ....
    )

然后这个SQL语句遵循

try {
    $obj = $this->dbcon->prepare('INSERT INTO invoice_item 
                 ( ID, item) 
           VALUES(:ID,:item)');

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

            if (!empty($item[0][$i])) {
                $obj->bindValue(':ID', $this->dbcon->lastInsertId(), PDO::PARAM_INT);
                $obj->bindValue(':item', $item[0][$i], PDO::PARAM_STR);
                $succ = $obj->execute();
                }
            }
    }

    catch(PDOException $e)  {
        echo "Error: " . $e->getMessage();
    }

这适用于固定数量的物品 但是,当项目数量未知时,访问$ _POST,绑定它并存储它的正确方法是什么?

编辑:

如何直接迭代$ _POST [“Item”]?

2 个答案:

答案 0 :(得分:0)

检查$i是否小于项目数而不是小于固定值。

        for ($i=0;$i<count($item[0]);$i++) {

        if (!empty($item[0][$i])) {

或者您可以使用foreach

        foreach ($item[0] as $value) {

        if (!empty($value)) {

答案 1 :(得分:0)

首先,您不需要绑定ID,因为它来自数据库本身。然后,您可以使用唯一的查询。

获取ID:

$id = $this->dbcon->lastInsertId();

过滤$_POST['Item']以丢弃空值:

$items = array_values( array_filter( $_POST['Item'] ) );

使用您的查询创建一个字符串:

$query = substr( "INSERT INTO invoice_item (ID, item) VALUES " . str_repeat( "($id, ?),", count($items) ), 0, -1);

假设$_POST['Items']有三个非空​​值且id = 3,则现在$query为:

INSERT INTO invoice_item (ID, item) VALUES (3, ?),(3, ?),(3, ?)

现在您可以准备查询并执行它一次绑定所有参数(使用数组作为->execute参数,参数绑定为字符串):

$obj = $this->dbcon->prepare( $query );
$obj->execute( $items );