Laravel - PDO准备语句 - 在其他未缓冲的查询处于活动状态时无法执行查询

时间:2017-06-08 04:23:58

标签: php mysql laravel pdo

我在Laravel中运行以下准备好的声明时遇到了麻烦:

$pdo = DB::connection()->getPdo();
$ps_TempTable_PushCsv = $pdo->prepare(
    "LOAD DATA LOCAL INFILE '123'
    INTO TABLE `123`
    CHARACTER SET utf8mb4
    FIELDS TERMINATED BY ','
    OPTIONALLY ENCLOSED BY '\"'
    LINES TERMINATED BY '\\n'"
);
$ps_TempTable_PushCsv->execute();
$ps_TempTable_PushCsv->closeCursor();
$rowCount = $ps_TempTable_PushCsv->rowCount();

我收到以下错误:

  

[2017-06-08 03:41:35] local.ERROR:PDOException:SQLSTATE [HY000]:常规错误:2014在其他未缓冲的查询处于活动状态时无法执行查询。考虑使用PDOStatement :: fetchAll()。或者,如果您的代码只是针对mysql运行,则可以通过设置PDO :: MYSQL_ATTR_USE_BUFFERED_QUERY属性来启用查询缓冲。

这是我的控制器的入口点,所以肯定没有先前的查询在运行。

怎么办?

由于

2 个答案:

答案 0 :(得分:4)

我能让它发挥作用的唯一方法就是用一个' exec'来替换准备好的声明。拨打:

$rowCount = DB::connection()->getpdo()->exec(
            "LOAD DATA LOCAL INFILE '$fileName'
            INTO TABLE $tableName
            CHARACTER SET utf8mb4
            FIELDS TERMINATED BY ','
            OPTIONALLY ENCLOSED BY '\"'
            LINES TERMINATED BY '\\n'"
        );

我不知道为什么它不能在Laravel中使用预先准备好的语句 - 它绝对适用于纯PDO准备语句。

答案 1 :(得分:1)

如果继续使用the accepted answer,请确保在创建连接时添加以下代码:

PDO::MYSQL_ATTR_LOCAL_INFILE => true

例如:

$options = [
    PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
    PDO::ATTR_EMULATE_PREPARES   => false,
    PDO::MYSQL_ATTR_LOCAL_INFILE => true
];
$pdo = new PDO("mysql:host=" . MYSQL_HOST . ";dbname=" . MYSQL_DB, MYSQL_USER, MYSQL_PASSWORD, $options);