【问题标题】:PHP Load Data Infile not workingPHP加载数据文件不起作用
【发布时间】:2017-05-22 17:19:23
【问题描述】:

我还是新手。我正在尝试在 php 脚本上使用 mysql LOAD DATA INFILE 来加载 csv 文件。它既不给出任何错误,也不加载任何数据。谁能帮帮我?我正在使用以下 php 代码

<?php

$db1=mysql_connect('localhost', 'root', '');
mysql_select_db('student',$db1);

$query = "LOAD DATA INFILE 'mysqlresults.csv' INTO TABLE student.student_info FIELDS TERMINATED BY ','";

$result = mysql_query($query);
if ($result == true){
echo 'success';
}
else{
echo 'not success';
}
?>

【问题讨论】:

  • 文件 mysqlresults.csv 在你的 php 目录中对吗? Mysql 不知道该路径,您应该获取该文件的绝对路径并将其传递给 mysql
  • 请显示更多代码。最好是minimal reproducible example
  • 是的,它已经在我的 php 目录中了。当我尝试在 mysql Workbench 中运行 LOAD DATA INFILE 'mysqlresults.csv' INTO TABLE student.student_info FIELDS TERMINATED BY ',' 查询时,它成功了,但是当我尝试在 php 脚本中运行时,它没有 @MarvinFischer跨度>
  • 因为我猜是在当前目录中启动工作台,所以只需获取文件的绝对路径并将其传递给 sql (php.net/manual/de/function.realpath.php)

标签: php mysql csv


【解决方案1】:

您需要设置文件的路径

LOAD DATA LOCAL INFILE '/path/to/your/local/file' INTO TABLE 

mysql 与运行 php 脚本的位置不同,因为 mysql 将在其自己的路径位置中查找,并且不会找到该文件(因为它在其他地方)。

您可以在 php 中使用 __DIR__ 来获取 php 正在运行它的当前位置,因此查询看起来像 $query = "LOAD DATA INFILE ". __DIR__ . DIRECTORY_SEPARATOR . "'mysqlresults.csv' INTO TABLE student.student_info FIELDS TERMINATED BY ','";

DIRECTORY_SEPARATOR 是因为 DIR 没有尾部斜杠

【讨论】:

  • 这看起来像是正确答案,但为什么它有效,而问题中发布的查询却无效?
  • mysql 与运行 php 脚本的位置不同,因为 mysql 将在其自己的路径位置中查找,并且不会找到该文件(因为它在其他地方),您可以在 php 中使用 __DIR__ 获取 php 正在运行它的当前位置,因此查询看起来像 $query = "LOAD DATA INFILE ". __DIR__ . DIRECTORY_SEPARATOR . "'mysqlresults.csv' INTO TABLE student.student_info FIELDS TERMINATED BY ','"; DIRECTORY_SEPARATOR 是因为 DIR 没有尾部斜杠,
  • 我知道所有这些事情。将它们放在答案中,以使未来的读者受益。现在看来,您的答案不会得到太多支持,因为读者无法从中学到任何东西。
【解决方案2】:

您的 PHP 代码使用 MySQL 扩展作为 MySQL 服务器的客户端。这两个组件(PHP 和 MySQL 服务器)多次在不同的计算机上运行。

LOAD DATA INFILE 从位于运行 MySQL 服务器的计算机上的 CSV 文件中加载数据。

我想您的文件位于运行 PHP 脚本的计算机上(即在运行 MySQL 客户端的计算机上)。

LOAD DATA INFILE 命令的LOCAL 选项告诉 MySQL 客户端从运行它的计算机(“本地”计算机)上的文件加载数据并将其发送到服务器进行加载。

对于这两个版本的命令,如果文件名不包含路径,MySQL 客户端或服务器会使用其配置来知道在哪里搜索文件(事实证明,它通常无法在那里找到它,因为开发人员不知道/关心该配置并将文件放在其他地方)。

解决方案很简单:始终使用文件的绝对路径。如果文件是本地文件(这在涉及 PHP 的情况下发生在 99.99% 的情况下),那么您可以使用 PHP 魔术常量 __DIR__ 和函数 dirname() 来构建 CSV 文件的绝对路径,从包含代码的脚本的位置。

从您的代码看来,CSV 文件与 PHP 文件位于同一目录中(这不是一个好习惯)。代码应该是这样的:

$path = __DIR__.'/mysqlresults.csv';
$query = "LOAD DATA LOCAL INFILE '$path' INTO TABLE student.student_info FIELDS TERMINATED BY ','";

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-07
    • 2015-07-21
    • 2013-08-04
    • 2012-11-26
    • 2015-08-07
    • 2014-03-01
    相关资源
    最近更新 更多