执行'LOAD DATA LOCAL INFILE时发生异常>> [

问题描述 投票:0回答:5
我对数据库的mysql用户拥有所有特权,但仍然低于错误

[Doctrine \ DBAL \ DBALException] 执行'LOAD DATA LOCAL INFILE'/tmp/uk_insiders/tfo.uktrades_transaction_code.out'时发生异常IGNORE INTO TABLE uktrades_transaction_codes FIELDS BY'|' (id,description)':

警告:PDOStatement :: execute():在/Symfony/vendor/doctrine/dbal/lib/Doctrine/DBAL/Statement.php第138行中禁止加载数据本地文件

[[Symfony \ Component \ Debug \ Exception \ ContextErrorException] 警告:PDOStatement :: execute():在/Symfony/vendor/doctrine/dbal/lib/Doctrine/DBAL/Statement.php第138行中禁止加载数据本地文件

我对数据库的mysql用户具有所有特权,但仍然低于错误[Doctrine \ DBAL \ DBALException]执行'LOAD DATA LOCAL INFILE'/ tmp / ...]时发生了异常]

获得了相同的异常消息。我能够通过污垢地使用PDO来执行此操作。

我有同样的问题...我通过替换来解决它:

加载数据本地文件...

作者

加载数据文件

本地选项:指定此开关后,将从运行MySQL客户端而不是MySQL服务器的主机读取输入文件。如果未指定此开关,将从MySQL主机上的数据目录读取输入文件。要在没有LOCAL开关的情况下使用LOAD DATA,连接的用户必须具有“ FILE”特权。(http://geekology.co.za/article/2010/02/how-to-import-or-export-csv-or-text-files-to-from-mysql-databases

我曾尝试通过教义配置选项参数传递PDO :: MYSQL_ATTR_LOCAL_INFILE参数,但是没有用,这是最终对我有用的解决方案。

$dbhost = $this->getContainer()->getParameter('database_host'); $dbuser = $this->getContainer()->getParameter('database_user'); $dbpass = $this->getContainer()->getParameter('database_password'); $connParams = $em->getConnection()->getParams(); $pdoConn = new \PDO('mysql:host=' . $dbhost . ';dbname=' . $connParams['dbname'], $dbuser, $dbpass, array( \PDO::MYSQL_ATTR_LOCAL_INFILE => true )); $sql = "SET FOREIGN_KEY_CHECKS=0"; $stmt = $pdoConn->prepare($sql); $stmt->execute(); $sql = "LOAD DATA LOCAL INFILE '$file' IGNORE INTO TABLE $tablename FIELDS TERMINATED BY '|' $columns"; $stmt = $pdoConn->prepare($sql); $stmt->execute();

两个有效答案是解决方法:

    接受的答案建议使用PDO连接
  • 另一个答案建议删除LOCAL关键字,但这并不总是可能的。]
  • 第三个干净的解决方案是在Doctrine中启用LOCAL选项,但这有点棘手:

    https://stackoverflow.com/a/24759583/425204

  • 注意:这还要求在服务器上的MySQL配置中启用LOCAL:my.cnf

    要在Symfony中为PDO对象启用PDO::MYSQL_ATTR_LOCAL_INFILE选项,我们可以将其添加到yml配置中:

    # Doctrine Configuration doctrine: dbal: driver: pdo_mysql options: !php/const PDO::MYSQL_ATTR_LOCAL_INFILE: true # Skip the rest

    [还要注意如何在yml文件中引用PHP常量,并且此格式用于Symfony 3.4。对于旧版本,请查看Symfony doc
    mysql symfony doctrine-orm load-data-infile
    5个回答
    1
    投票
    获得了相同的异常消息。我能够通过污垢地使用PDO来执行此操作。

    2
    投票
    我有同样的问题...我通过替换来解决它:

    加载数据本地文件...

    1
    投票
    我曾尝试通过教义配置选项参数传递PDO :: MYSQL_ATTR_LOCAL_INFILE参数,但是没有用,这是最终对我有用的解决方案。

    $dbhost = $this->getContainer()->getParameter('database_host'); $dbuser = $this->getContainer()->getParameter('database_user'); $dbpass = $this->getContainer()->getParameter('database_password'); $connParams = $em->getConnection()->getParams(); $pdoConn = new \PDO('mysql:host=' . $dbhost . ';dbname=' . $connParams['dbname'], $dbuser, $dbpass, array( \PDO::MYSQL_ATTR_LOCAL_INFILE => true )); $sql = "SET FOREIGN_KEY_CHECKS=0"; $stmt = $pdoConn->prepare($sql); $stmt->execute(); $sql = "LOAD DATA LOCAL INFILE '$file' IGNORE INTO TABLE $tablename FIELDS TERMINATED BY '|' $columns"; $stmt = $pdoConn->prepare($sql); $stmt->execute();


    0
    投票
    两个有效答案是解决方法:

      接受的答案建议使用PDO连接

    0
    投票
    要在Symfony中为PDO对象启用PDO::MYSQL_ATTR_LOCAL_INFILE选项,我们可以将其添加到yml配置中:

    # Doctrine Configuration doctrine: dbal: driver: pdo_mysql options: !php/const PDO::MYSQL_ATTR_LOCAL_INFILE: true # Skip the rest

    [还要注意如何在yml文件中引用PHP常量,并且此格式用于Symfony 3.4。对于旧版本,请查看Symfony doc
    © www.soinside.com 2019 - 2024. All rights reserved.