【发布时间】:2015-04-04 04:37:14
【问题描述】:
我已经尝试了其他答案的解决方案,但到目前为止都没有解决:
PDOException 42000 SQLSTATE[42000]: Syntax error or access violation:
1148 The used command is not allowed with this MySQL version
我正在使用PropelPDO 准备查询。我试过了:
$cnct = \Propel::getConnection();
$cnct->setAttribute(\PDO::MYSQL_ATTR_LOCAL_INFILE, true);
但这并没有阻止错误,所以我也尝试了:
$prepare = $cnct->prepare($sql, array(
\PDO::MYSQL_ATTR_LOCAL_INFILE => true,
));
$prepare->execute();
最后,我在 Propel 的 runtime-conf.xml 中设置:
<options>
<option id="MYSQL_ATTR_LOCAL_INFILE">true</option>
</options>
我也尝试将其定义为属性:
<attributes>
<option id="MYSQL_ATTR_LOCAL_INFILE">true</option>
</attributes>
这是尝试使用此命令的代码块:
foreach ($files as $filename => $file) {
error_log('[' . date('Y-m-d h:i:s') . '] Importing ' . $filename . '... ');
$sql = <<<SQL
LOAD DATA LOCAL INFILE '$filename' REPLACE
INTO TABLE `my_table`
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\"'
LINES TERMINATED BY '\n'
(...);
SQL;
error_log($sql);
$prepare = $cnct->prepare($sql, array(
\PDO::MYSQL_ATTR_LOCAL_INFILE => true,
));
$prepare->execute();
}
$files 是通过从 Amazon S3 下载文件而创建的临时 PHP 文件列表。文件名如下所示:/tmp/php7U5bgd
我无权访问 my.cnf。相同的数据库和用户允许LOAD DATA LOCAL INFILE 在Java 中运行。我还使用了 MySQL CLI,它允许我运行这个命令。
这可以防止 PDOException 被抛出,但它不会将任何数据保存到我的数据库中:\
$conf = include 'runtime-conf.php';
$cnct = new \PDO(
$conf['datasources']['my_database']['connection']['dsn'],
$conf['datasources']['my_database']['connection']['user'],
$conf['datasources']['my_database']['connection']['password'],
array(
\PDO::MYSQL_ATTR_LOCAL_INFILE => true,
)
);
最有帮助的相关问题:
【问题讨论】:
-
可以修改php.ini吗?还有
mysql.allow_local_infile -
现在试试@RoyalBg。不,没用。
-
$filename的值是多少?你用什么主机来运行你的 php 脚本?什么主机正在运行您的 MySQL 服务器? -
@OllieJones
$filename是从 Amazon S3 下载 CSV 后创建的临时文件的路径。因此,PHP 服务器在 EC2 之外运行,而 MySQL 服务器在 RDS 之外运行。
标签: php mysql amazon-s3 propel load-data-infile