我是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
我该如何解决这个问题?
答案 0 :(得分:1)
很可能文件存在,但MySQL不允许您从该位置读取文件。 MySQL有很好的理由,因为它读取LOAD DATA ... INFILE的位置相当严格。您可能需要先将文件移动到MySQL可以读取的路径,或者更改MySQL服务器的设置。
从MySQL 5.1手册:
请注意,在非LOCAL的情况下,这些规则意味着一个名为的文件 as ./myfile.txt是从服务器的数据目录中读取的,而 名为myfile.txt的文件是从数据库目录中读取的 默认数据库。 [...]
和
使用正斜杠而不是使用正斜杠指定Windows路径名 反斜杠。如果你使用反斜杠,你必须加倍。
答案 1 :(得分: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手册中阅读此页面。它涵盖了您正在处理的许多问题以及提供示例: