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

标签 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.

这是怎么回事?

最佳答案

默认情况下,您一次只能执行一个查询 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/

相关文章:

php - 动态创建IN运算符SQL php的内容

php - 从表中检索到的条目是否重复? PHP

php - 在 android 中创建一个 http 请求,它会停止并且应用程序强制关闭

php - 未定义索引 PHP 错误/警告

mysql - 联合主键顺序有什么区别吗?

php - SQL查询难度

php - 哈希字符串在插入数据库时​​被截断

php - 正则表达式用于匹配类似 bbcode 的标签之间的内容

php - 在 SSH2 上通过 root 运行命令

php - 链接下拉选项不会将以前的值拉入查询