在PHP中使用mysql LOAD语句失败,但通过命令行工作

时间:2013-01-15 22:38:42

标签: php mysql

我有一个php网页,让一个人上传文件。 我想从$ _FILE中提取文件名,然后将所有数据加载到我的数据库中。

我的代码如下所示:

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

但我得到的错误信息是:

  

此MySQL版本不允许使用used命令

我的问题如下

  1. 我应该使用tmp_file名称还是姓名?
  2. 我需要做什么才能使load data命令生效?我试图按照MySQL: Enable LOAD DATA LOCAL INFILE发现的帖子,但它仍然给我同样的错误。
  3. 编辑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:

    我也按照上面提到的相同帖子尝试了local-infile = 1。 但这也不起作用。

    编辑3

    我试图将FILE prvil添加到用户..就像这样:

    GRANT FILE ON *.* TO root;
    

    然后当我显示root的授权时,我可以看到它被添加了。但我仍然收到一条错误消息,指出我的mysql版本不允许使用命令。 我的my.cfg文件中的infile之后是否需要“= 1”?

    编辑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代码正常工作。 谢谢!

1 个答案:

答案 0 :(得分:1)

从MySQL 5.0升级到5.5后,我发现在PHP中创建连接时,我突然必须启用LOCAL INFILE。

使用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);