mysql_connect 带有 --local-infile 参数

mysql_connect with --local-infile parameter

升级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 配置的帖子和一些其他东西但对我没有用,有什么建议吗?

谢谢

更新: 我一直在将整个网络的代码更改为 mysqli,呜呜!!,按照下面答案的建议我做了下一个代码但没有成功,我仍然收到消息:"The used command is not allowed with this MySQL version".接下来是隐含文件:

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);
?>

有什么建议吗?

由于 mysql_connect() 自 PHP 5.5.0 以来已被弃用(并将在未来删除),问题并非不可能来自您的网络服务器(Apache?)而不是你的 SQL 版本。

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

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

local-infile=1

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

更新 尝试 PHP

的另一种选择
$conn = mysqli_init();
$conn->options(MYSQLI_OPT_LOCAL_INFILE, true);

尝试一下,看看是否有效。选项 link mysqli options

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

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

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

好的,我终于找到了方法,这里是工作代码:

文件: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));

希望对您有所帮助。

仔细阅读上面的评论并创建您的清单如下:

  1. 我可以通过 mysql 命令行 运行 "Load Data Local Infile" 吗?如果不是,请确保通过检查上面讨论的全局变量来启用它。
  2. 我可以通过我的 php 代码 运行 一个基本的 mysql 脚本吗?如果是,则替换为 "Load Data Local Infile" 脚本 show about(与通过 mysql 在步骤 1 中使用的相同)。
  3. 检查数据库以确定负载是否有效。如果是,"great job"。如果不是,您需要通过 PHP 打开此加载功能。查看上面的说明,其中添加了 $xxx->options(MYSQL_OPT_LOCAL_INFILE, true);这之后应该是关闭它的命令。

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