[mysql_connect with --local-infile参数

问题描述 投票:5回答:5

自从升级mysql(当前版本:服务器版本:5.5.44-0 + deb8u1(Debian)以来,无法从上载的(本地)文件中加载数据,隐含的文件是:

dbconnection.php

<?php
$server = "localhost";
$user = "TheUser";
$pass = "ThePass";
$db_name = "DbName";
$link = mysql_connect($server, $user, $pass);
mysql_select_db($db_name);
mysql_set_charset('utf8', $link);
?>

send2db.php

<?php
include 'dbconnection.php';
mysql_select_db("DbName") or die(mysql_error());
$query = "LOAD DATA LOCAL INFILE '$file' INTO TABLE `T1` FIELDS TERMINATED BY ';' OPTIONALLY ENCLOSED BY '\"' ";
mysql_query($query) or die(mysql_error());
?>

错误说:

ERROR 1148 (42000): The used command is not allowed with this MySQL version

在mysql内部:

SHOW GLOBAL VARIABLES LIKE 'local_infile';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| local_infile  | ON    |
+---------------+-------+
1 row in set (0.00 sec)

但是如果我以这种方式访问​​mysql,则可以加载文件:

mysql --local-infile -p

所以我的问题是,我可以在dbconnection.php文件中设置此选项吗,我已经尝试了很多方法而没有成功,我一直在阅读有关my.cnf配置和其他内容的文章,但对我来说没有任何用处,有什么建议吗?

谢谢

UPDATE:我一直在将整个Web的代码更改为mysqli,ufff !!,并按照下面的答案提出了建议,我做了下一个代码,但没有成功,但我仍然得到消息:“使用的命令不允许与这个MySQL版本”。隐式文件是下一个:

acessdb.php

<?php
$link = new mysqli($server, $user, $pass, $dbname);
?>

send2db.php

<?php include 'acessdb.php';
$link->options(MYSQLI_OPT_LOCAL_INFILE, true);
mysqli_query($link, "LOAD DATA LOCAL INFILE 'upfiles/file.csv' INTO TABLE `T1` FIELDS TERMINATED BY ';' OPTIONALLY ENCLOSED BY '\"'") or die(mysqli_error($link));
$link->options(MYSQLI_OPT_LOCAL_INFILE, false);
?>

有什么建议吗?

php mysql sql load-data-infile
5个回答
4
投票

在my.cnf(或系统上的mysql配置文件)中设置选项:

local-infile=1

重新启动MySQL服务,这应该可以为您解决问题。

UPDATE尝试使用PHP的另一种选择

$conn = mysqli_init();
$conn->options(MYSQLI_OPT_LOCAL_INFILE, true);

尝试一下,看看是否可行。选项链接mysqli options


0
投票

LOCAL INFILE是一种机制,通过该机制数据库服务器可以从数据库客户端(= PHP服务器)请求或多或少的任何文件。如果您不能完全信任服务器和网络,则可能很危险。因此,必须(和您一样)在服务器上和数据库客户端上都同时允许LOCAL INFILE

您正在使用旧的过时且未维护的PHP mysql扩展名。该扩展名不支持设置标志。您应该切换到具有mysqli选项的MYSQLI_OPT_LOCAL_INFILE以启用此模式。

<?php
$m = new mysqli(...);
$m->option(MYSQLI_OPT_LOCAL_INFILE, true);
$m->query("LOAD DATA LOCAL INFILE ....");
$m->option(MYSQLI_OPT_LOCAL_INFILE, false);
?>

0
投票

确定,终于找到了方法,这是工作代码:

文件:connectdb.php

$link = mysqli_init();
mysqli_options($link, MYSQLI_OPT_LOCAL_INFILE, true);
mysqli_real_connect($link, $server, $user, $pass, $dbname);

文件:send2db.php

mysqli_query($link, "LOAD DATA LOCAL INFILE 'upfiles/file.csv' INTO TABLE `T1` FIELDS TERMINATED BY ';' OPTIONALLY ENCLOSED BY '\"'") or die(mysqli_error($link));

希望对您有帮助。


0
投票

浏览上面的评论并按如下所示创建您的排序清单:

  1. 我可以通过mysql命令行运行“加载数据本地文件”吗?如果不是,请通过如上所述检查全局变量来确保启用此功能。
  2. 我可以通过我的PHP代码运行基本的mysql脚本吗?如果是,则用“ Load Data Local Infile”脚本显示有关内容(与通过MySQL在步骤1中使用的内容相同)。
  3. 检查数据库以确定负载是否起作用。如果是的话,“伟大的工作”。如果否,则需要通过PHP启用此加载功能。查看上面的说明,在其中添加$ xxx-> options(MYSQL_OPT_LOCAL_INFILE,true);这之后应该是一个命令以将其关闭。

我在同一问题上苦苦挣扎了5个多小时。这些是摘要步骤,可以帮助我更快地进行故障排除和解决此问题。在弄乱配置文件之前,我会尝试这些步骤,这可能会导致意想不到的后果。感谢大家的贡献。


-1
投票

由于自PHP 5.5.0起不推荐使用mysql_connect()(以后将删除它,因此问题并非不可能来自您的Web服务器(Apache?),而不是您的SQL版本。

可能导致此问题的另一件事是文件的内容,该文件的内容最终包含已弃用的命令(这就是错误消息似乎告诉您的内容。

© www.soinside.com 2019 - 2024. All rights reserved.