【发布时间】:2021-05-05 08:43:50
【问题描述】:
我正在尝试使用 LOAD DATA INFILE 将 CSV 的 zip 文件(从我的数据库中导出)上传到 mysql 表中
Mysql 好像走错了路:
例如:
C:\xampp\htdocs\site/uploads/temp/1620203716052941000/ck_address_change.csv
返回此错误: C:\xampp\mysql\data\xampphtdocssite\uploads\temp\1620203716052941000\ck_address_change.csv 未找到 (Errcode: 2 "No such file or directory")
//Get file and create directory
$file = $_FILES['import_zip']['tmp_name'];
$rand = preg_replace('/(0)\.(\d+) (\d+)/', '$3$1$2', microtime()); //random folder name as will be deleted later
mkdir(dirname(__DIR__).'/uploads/temp/'.$rand, 0777);
$path = dirname(__DIR__).'/uploads/temp/'.$rand;
//Open Zip
$zip = new ZipArchive;
$res = $zip->open($file);
if($res === TRUE) {
$zip->extractTo($path);
$zip->close();
}
//Loop files
$files = array_diff(scandir($path), array('.', '..'));
foreach($files as $file){
$table_name = rtrim($file,'.csv');
$upload = $path.'/'.$file;
$q = "LOAD DATA INFILE '".$upload."' INTO TABLE $table_name";
$results = mysqli_query($db,$q) or die(mysqli_error($db));
if(!$results) {
printf("Error message: %s\n", mysqli_error($db));
}
}
//Remove Directory
array_map('unlink', glob("$path/*.*"));
rmdir($path);
如何为此正确设置路径?或者这是我本地服务器上的问题?
请注意,这只是为了在我的本地服务器上测试使用,所以没有安全问题等。
【问题讨论】:
-
似乎很容易从该消息中推断出 mysql 希望您将数据保存在
C:\xampp\mysql\data\下的某个位置,然后提供 LOAD DATA 命令的相对路径 -
另外,您可以指定绝对路径 - 我看到您已尝试这样做。但是您需要根据命令理解的规则来格式化该路径。在使用您不熟悉的任何命令时,我总是强烈建议您在开始编码之前使用reading the manual。在这种情况下,请特别注意“输入文件字符集”部分。如果您在阅读说明后仍有问题,请返回。
-
在代码中使用
die(mysqli_error($conn));是一个非常糟糕的主意,因为它可能会泄露敏感信息。更多解释见这篇文章:mysqli or die, does it have to die? -
@Dharman - 谢谢,但正如我所说,这只是为了测试,所以安全问题不是问题
-
抛开安全问题不谈,它仍然不是正确的代码。正确启用 MySQLi 错误报告