2013-01-15 49 views
0

我有一个PHP网页,让我们上传一个文件。 我想从$ _FILE中提取文件名,然后将所有数据加载到我的数据库中。使用mysql在PHP中LOAD statment失败,但通过命令行工作

我的代码如下所示:

$myfile = $_FILE['file']['tmp_file']; 
$executebatchloadsql = 'LOAD DATA LOCAL INFILE "'. $myfile .'" INTO TABLE testtable (fname, lname); 
mysql_query($executebatchloadsql) or die(mysql_error()); 

但我发现了错误信息说:

所使用的命令是不允许使用此版本的MySQL

我问题如下

  1. 我应该使用tmp_file名称还是名称?
  2. 我需要做些什么来获得加载数据命令的工作?我试图按照在MySQL: Enable LOAD DATA LOCAL INFILE找到的帖子,但它仍然给我同样的错误。

编辑1:

这是我的/etc/mysql/my.cnf看起来像部分:

[mysqld] 

user   = mysql 
pid-file  = /var/run/mysqld/mysqld.pid 
socket   = /var/run/mysqld/mysqld.sock 
port   = 3306 
basedir   = /usr 
datadir   = /var/lib/mysql 
tmpdir   = /tmp 
lc-messages-dir = /usr/share/mysql 
skip-external-locking 
local-infile 

最后一行是我添加了什么。我还添加了同一线路到[MySQL的]部分:

[mysql] 
local-infile 

做了这些改变之后,我重新启动SQL:

/etc/init.d/mysql restart 

但我仍然有问题

编辑2:

我也尝试了本地infile = 1,根据我上面提到的相同的职位。 但这也行不通。

编辑3

我已经尽力了FILE prvil添加到用户..像这样:

GRANT FILE ON *.* TO root; 

,然后当我showit补助金根,我可以看到,其已被添加。但我仍然收到一条错误消息,说我的版本的mysql不允许使用这个命令。 我的my.cfg文件中的infile后需要“= 1”吗?

EDIT 4:

作为进一步的测试中,我试图通过命令行,而不是通过PHP手动加载文件,它接受了。我以root的身份(这是我用我的用于测试目的的应用程序相同的ID),然后我尝试下面的命令:

mysql> load data local infile '/var/www/testwebsite/abc.csv' into table testtable; 
Query OK, 3 rows affected, 48 warnings (0.00 sec) 
Records: 3 Deleted: 0 Skipped: 0 Warnings: 48 

但我似乎无法得到的PHP代码工作。 谢谢。

+0

您正在使用什么版本的MySQL,和您使用mysql_,mysqli_或PDO? – Ascherer

+2

你的服务器是否允许'LOAD DATA'并且配置为这样? – Kermit

+2

确保你的MySQL用户拥有'FILE'权限。如果您使用共享主机,您的主机提供商也有可能阻止您执行此命令。 – hohner

回答

1

从MySQL 5.0到5.5后,我发现我突然启用LOCAL INFILE,特别是在PHP中创建连接时。

下使用mysql:

mysql_connect(server,user,code,false,128); // 128 enables LOCAL INFILE 
mysql_select_db(database); 

使用的mysqli:

$conn = mysqli_init(); 
mysqli_options($conn, MYSQLI_OPT_LOCAL_INFILE, true); 
mysqli_real_connect($conn,server,user,code,database); 
相关问题