我有两张桌子
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.
发生了什么?
答案 0 :(得分:2)
默认情况下,您只能使用PDOStatement::execute()
方法一次执行一个查询。如果您想使用交易,请查看PDO
的{{3}},PDO::beginTransaction()
和PDO::commit()
方法。并创建两个独立的查询。
但是,正如PHP告诉您的那样,您可以设置属性PDO::MYSQL_ATTR_USE_BUFFERED_QUERY
以在一个预准备语句中运行多个查询。但是,如果您更改PDO驱动程序,则可以运行介绍故障,例如从MySQL到PostgreSQL。因为PostgreSQL不支持上面提到的属性。所以我建议你每个准备好的声明只使用一个语句。这使得准备好的语句也比指定的语句结构更具可重用性。