[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 / ...]时发生了异常]
加载数据本地文件...
作者
加载数据文件
本地选项:指定此开关后,将从运行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)
$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关键字,但这并不总是可能的。]
注意:这还要求在服务器上的MySQL配置中启用LOCAL:my.cnf
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。
加载数据本地文件...
$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::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。