我发布了这个决议,因为它让我疯狂了几天——原来是AppArmor设置。这个线索终于让我解决了:如何使用SELECT INTO OUTFILE绕过MySQL错误代码13?
我看到这被标记为重复,但所有其他建议似乎都指向编辑my.cnf,这对我不起作用。
我无法使加载数据本地Infile工作。我的MySQL服务器版本是5.5.41,我的Ubuntu版本是14.04.2。My.cnf在mysql、mysqld和client下都有"localinfile"。下面我在Stackoverflow上的另一篇文章中指定连接字符串中的标志128。当我在客户端上运行它时,下面的代码工作得很好,但现在它位于服务器上,它不断抛出
"此MySQL版本不允许使用所使用的命令。
EDIT,从命令行运行此操作成功:
mysql> LOAD DATA LOCAL INFILE '/home/aa/ER.csv'
-> INTO TABLE ER_import
-> FIELDS TERMINATED BY ','
-> LINES TERMINATED BY 'rn'
-> IGNORE 1 LINES
-> (Paid_Amount,
-> Pro_Number,
-> Invoice,
-> Ship_Date,
-> BL,
-> Carrier_Name,
-> Check_Number,
-> Paid_Date,
-> Shipper_City,
-> Shipper_State,
-> Shipper_Name_1,
-> Recipient_City,
-> Recipient_State,
-> Recipient_Name_1,
-> Batch_Number,
-> Actual_Weight,
-> Billed_Amount
-> );
Query OK, 8585 rows affected, 4 warnings (0.21 sec)
Records: 8585 Deleted: 0 Skipped: 0 Warnings: 4
然而,这一直在重新调整文件没有找到:"文件'/home/aa/ER.csv'没有找到(错误代码:13)"文件肯定在那里,权限是正确的:
$delete = "DELETE FROM ER_import";
if (!mysqli_query($conn,$delete))
{
echo("Error description: " . mysqli_error($conn));
}
$query = <<<eof
LOAD DATA INFILE '/home/aa/ER.csv'
INTO TABLE ER_import
FIELDS TERMINATED BY ','
LINES TERMINATED BY 'rn'
IGNORE 1 LINES
(Paid_Amount,
Pro_Number,
Invoice,
Ship_Date,
BL,
Carrier_Name,
Check_Number,
Paid_Date,
Shipper_City,
Shipper_State,
Shipper_Name_1,
Recipient_City,
Recipient_State,
Recipient_Name_1,
Batch_Number,
Actual_Weight,
Billed_Amount
);
eof;
if($results = mysqli_query($conn, $query)){
echo $file. " has been imported!";
} else die(mysqli_error($conn));
这是明显的吗??
尝试这种方式
$query = <<<eof
LOAD DATA LOCAL INFILE DIR_FILE
INTO TABLE ER_import
FIELDS TERMINATED BY ','
LINES TERMINATED BY 'rn'
IGNORE 1 LINES
eof;
$query = str_replace('DIR_FILE',$dir.$file,$query);
因为<<<eof
意味着您不希望php解析以下字符串中的任何内容。但是您正在尝试$dir$file
,这意味着您希望thtaphp将用值替换此变量。
LOCAL
在LOAD DATA LOCAL INFILE
中的含义有一个非直觉的扭曲。只有当加载的文件不是服务器本地的时,才需要使用LOCAL
。LOCAL
告诉MySQL客户端获取本地文件并将其放置在服务器上的临时目录中。https://dev.mysql.com/doc/refman/5.5/en/load-data.html
当您在服务器上运行php脚本时,请尝试从命令中去掉单词LOCAL
。
几年前我也遇到过同样的问题。
需要为客户端和服务器启用本地infile。
我建议您在尝试使用PHP之前,先尝试从命令行界面运行LOAD DATA LOCAL INFILE
。要确保来自客户端的连接启用本地infile,请运行以下命令:
mysql --local-infile=1 -h REPLACE_HOST_IP -u username -p
祝你好运!