【问题标题】:MYSQL LOAD DATA INFILE correct file pathMYSQL LOAD DATA INFILE 正确的文件路径
【发布时间】: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 错误报告

标签: php mysql


【解决方案1】:

工作代码 - 将路径中的正斜杠替换为反斜杠。

//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__).'/files/temp/'.$rand, 0777);
$path = dirname(__DIR__).'/files/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;
    $upload = str_replace('/','\\', $upload);
    $upload = str_replace('\\', '\\\\', $upload);
    $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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-03
    • 2014-05-02
    • 2013-09-24
    • 1970-01-01
    • 2018-03-03
    • 1970-01-01
    • 2012-10-05
    • 2010-11-17
    相关资源
    最近更新 更多