gpt4 book ai didi

php - PDO 用 FK 数据插入到两个表中

转载 作者:行者123 更新时间:2023-11-29 06:36:03 26 4
gpt4 key购买 nike

我有两个表

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com