我有两个表
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.
这是怎么回事?
最佳答案
默认情况下,您一次只能执行一个查询 PDOStatement::execute()
方法。如果你喜欢使用事务,请查看 PDO::beginTransaction()
, PDO::commit()
和 PDO::rollBack()
PDO
的方法。并创建两个单独的查询。
但是正如 PHP 告诉您的那样,您可以设置属性 PDO::MYSQL_ATTR_USE_BUFFERED_QUERY
以在一个准备好的语句中运行多个查询。但是如果你改变 PDO 驱动程序,你可能会遇到麻烦,例如从 MySQL 到 PostgreSQL。因为 PostgreSQL 不支持上面提到的属性。所以我建议你每个准备好的语句只使用一个语句。这使得准备好的语句也比语句的特定构造更具可重用性。
关于php - PDO 用 FK 数据插入到两个表中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24696501/