【问题标题】:Laravel - PDO Prepared Statement - Cannot execute queries while other unbuffered queries are activeLaravel - PDO Prepared Statement - 在其他无缓冲查询处于活动状态时无法执行查询
【发布时间】:2017-11-09 15:07:58
【问题描述】:

我在 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]: General error: 2014 在其他无缓冲查询处于活动状态时无法执行查询。考虑使用 PDOStatement::fetchAll()。或者,如果您的代码只针对 mysql 运行,您可以通过设置 PDO::MYSQL_ATTR_USE_BUFFERED_QUERY 属性来启用查询缓冲。

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

做什么?

谢谢

【问题讨论】:

    标签: php mysql laravel pdo


    【解决方案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);
    

    【讨论】:

      【解决方案2】:

      我可以让它工作的唯一方法是用'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 准备好的语句。

      【讨论】:

      • 你真的应该避免抓住 PDO 句柄,而是使用像 DB::insert 这样的东西来处理原始查询。
      • 一种方法是尝试一下。据我所知,这些处理程序非常通用。
      • @tadman 对于它的价值,DB::insert 在这种情况下似乎对我不起作用。不过感谢您的建议!
      • PDO::exec(): LOAD DATA LOCAL INFILE 禁止
      猜你喜欢
      • 2011-01-05
      • 2015-03-28
      • 2014-09-18
      • 2015-03-19
      • 1970-01-01
      • 1970-01-01
      • 2014-05-13
      相关资源
      最近更新 更多