0

我对 php 和 CakePHP 还很陌生,我在上传一个文本文件(2kb)后尝试执行以下代码:

$filefullname = $this->request->data['File']['file']['tmp_name'];
debug($filefullname);
move_uploaded_file($filefullname, WWW_ROOT.'tmp.txt');
$query = 'LOAD DATA LOW_PRIORITY INFILE "'.WWW_ROOT.'tmp.txt'.'" INTO TABLE agencies FIELDS TERMINATED BY "," OPTIONALLY ENCLOSED BY """" LINES TERMINATED BY "\r" IGNORE 1 LINES';
debug($query);
$this->Agency->query($query);

虽然可以找到该文件,但我得到以下输出:

'C:\Windows\Temp\phpB413.tmp'
'LOAD DATA LOW_PRIORITY INFILE "C:\Data\myphpapplication\app\webroot\tmp.txt" INTO TABLE agencies FIELDS TERMINATED BY "," OPTIONALLY ENCLOSED BY """" LINES TERMINATED BY "\r" IGNORE 1 LINES'
Error: SQLSTATE[HY000]: General error: 29 File 'C:\Data\myphpapplication\app\webroot\tmp.txt' not found (Errcode: 13)
SQL Query: LOAD DATA LOW_PRIORITY INFILE "C:\Data\myphpapplication\app\webroot\tmp.txt" INTO TABLE agencies FIELDS TERMINATED BY "," OPTIONALLY ENCLOSED BY """" LINES TERMINATED BY "\r" IGNORE 1 LINES

我怎样才能解决这个问题?

4

2 回答 2

2

该文件很可能在那里,但 MySQL 不允许您从该位置读取文件。MySQL 从读取 LOAD DATA ... INFILE 的位置相当严格,这是有充分理由的。您可能需要先将文件移动到 MySQL 可以读取的路径,或更改 MySQL 服务器的设置。

从 MySQL 5.1 手册:

请注意,在非本地情况下,这些规则意味着从服务器的数据目录读取名为 ./myfile.txt 的文件,而从默认数据库的数据库目录读取名为 myfile.txt 的文件。[...]

和:

Windows 路径名使用正斜杠而不是反斜杠指定。如果确实使用了反斜杠,则必须将它们加倍。

于 2013-01-07T23:07:32.807 回答
0

@JvO 正在引导您走上正确的道路。我认为您缺少几个重要元素,其中之一是将上传的文件从服务器上的初始临时目录移动到 MySQL 可以正式读取它的位置(为了安全起见,它不会从临时目录中读取它原因)。

这是我做的一个项目的一个例子,它上传了一个 CSV 文件,然后将它移动到一个可读的目录中。我首先使用move_uploaded_file函数上传了它,然后创建了一个变量来描述新文件的上传路径,以用于 LOAD DATA 查询。

move_uploaded_file($_FILES["fCSV"]["tmp_name"],"user_uploads/SG".$dapID ."/". $_FILES["fCSV"]["name"]);

$csvfile = "user_uploads/SG".$dapID ."/". $_FILES["fCSV"]["name"];

在您的 LOAD DATA 查询中,您缺少“LOCAL”关键字,它告诉 MySQL 从指定目录读取文件,否则它会在数据库目录中查找它(下面使用“Field1”等用于演示仅用于目的,您应该在其中包含真实的表字段名称):

$sqlLoad = "LOAD DATA LOCAL INFILE '".$csvfile."' INTO TABLE my_table FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\"' LINES TERMINATED BY '\r\n' IGNORE 1 LINES (Field1,Field2,Field3,Field4) SET ID =".$id

最后,您确实需要通读 MySQL 手册中的这一页。它涵盖了您正在处理的许多问题,并提供了示例:

MySQL LOAD DATA INFILE 语法

于 2013-01-08T14:47:22.377 回答