我有一个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
我问题如下
- 我应该使用
tmp_file
名称还是名称? - 我需要做些什么来获得加载数据命令的工作?我试图按照在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代码工作。 谢谢。
您正在使用什么版本的MySQL,和您使用mysql_,mysqli_或PDO? – Ascherer
你的服务器是否允许'LOAD DATA'并且配置为这样? – Kermit
确保你的MySQL用户拥有'FILE'权限。如果您使用共享主机,您的主机提供商也有可能阻止您执行此命令。 – hohner