PDO使用FK数据插入两个表中

时间:2014-07-11 11:20:25

标签: php mysql pdo

我有两张桌子

CREATE TABLE angos 
    (
        id int NOT NULL AUTO_INCREMENT PRIMARY KEY, 
        angos varchar(255) not null, 
        grammar varchar(3) not null, 
        updated TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
        CONSTRAINT unique_input UNIQUE (angos)
    ) engine=InnoDB;

CREATE TABLE english 
    (
        id int primary key,
        angos_id int,
        english varchar(255),
        grammar_note varchar(500),
        CONSTRAINT fk_angos_source FOREIGN KEY (angos_id) REFERENCES angos(id)
    ) engine=InnoDB;

...以及我存储在php数组中的一些csv数据。我试图将数组数据插入到两个mysql表中,其中一个表有另一个的fk。我使用php PDO进行插入。这就是我的......

$sql = <<<'EOD'

BEGIN;

INSERT INTO angos
(angos, grammar)
VALUES
(:angos, :grammar);

INSERT INTO english
(angos_id, english)
VALUES
(:angos_id, :english);

COMMIT;

EOD;

try 
{
    $q = $handler->prepare($sql);

    foreach($csv as $value)
    {
        $q->execute(
            array(
                ':angos' => $value[0], 
                ':grammar' => 'con', 
                ':english' => $value[1], 
                ':angos_id' => 'LAST_INSERT_ID()'
            )
        );
    }
} 
catch(PDOException $e) 
{ 
    die( "Error: \n" . $e->getMessage() ); 
}

...数据无法插入,我目前收到的错误消息是

Error: SQLSTATE[HY000]: General error: 2014 Cannot execute queries while other unbuffered queries are active. Consider using PDOStatement::fetchAll(). 
Alternatively, if your code is only ever going to run against mysql, you may enable query buffering by setting the PDO::MYSQL_ATTR_USE_BUFFERED_QUERY attribute.

发生了什么?

1 个答案:

答案 0 :(得分:2)

默认情况下,您只能使用PDOStatement::execute()方法一次执行一个查询。如果您想使用交易,请查看PDO的{​​{3}},PDO::beginTransaction()PDO::commit()方法。并创建两个独立的查询。

但是,正如PHP告诉您的那样,您可以设置属性PDO::MYSQL_ATTR_USE_BUFFERED_QUERY以在一个预准备语句中运行多个查询。但是,如果您更改PDO驱动程序,则可以运行介绍故障,例如从MySQL到PostgreSQL。因为PostgreSQL不支持上面提到的属性。所以我建议你每个准备好的声明只使用一个语句。这使得准备好的语句也比指定的语句结构更具可重用性。