簡體   English   中英

mysql_connect 與 --local-infile 參數

[英]mysql_connect with --local-infile parameter

mysql升級后無法從上傳的(本地)文件加載數據(當前版本:服務器版本:5.5.44-0+deb8u1(Debian)),隱含的文件是:

數據庫連接.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);
?>

發送2db.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,ufff !!,按照下面的答案中的建議我做了下一個代碼但沒有成功,我仍然收到消息:“使用的命令不是此 MySQL 版本允許”。 接下來是隱含的文件:

訪問數據庫

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

發送2db.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);
?>

有什么建議?

在 my.cnf(或系統上的 mysql 配置文件)中設置選項:

local-infile=1

重新啟動 MySQL 服務,這應該會為您解決問題。

更新嘗試使用 PHP 的另一種選擇

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

試試看,看看是否有效。 選項鏈接mysqli 選項

好的,最后我找到了方法,這是工作代碼:

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

我希望它有幫助。

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

查看上面的評論並創建您的清單,如下所示:

  1. 我可以通過 mysql 命令行運行“Load Data Local Infile”嗎? 如果不是,請通過檢查如上所述的全局變量來確保啟用此功能。
  2. 我可以通過我的 php 代碼運行一個基本的 mysql 腳本嗎? 如果是,則替換為“Load Data Local Infile”腳本顯示(與通過 mysql 在步驟 1 中使用的內容相同)。
  3. 檢查數據庫以確定負載是否有效。 如果是,“干得好”。 如果沒有,則需要通過 PHP 開啟此加載功能。 查看上面添加 $xxx->options(MYSQL_OPT_LOCAL_INFILE, true); 的說明。 這應該跟一個命令來關閉它。

我在同樣的問題上掙扎了 5 個多小時。 這些是幫助我更快地排除故障和解決此問題的摘要步驟。 我會在弄亂配置文件之前嘗試這些步驟,這可能會導致意想不到的后果。 感謝大家的貢獻。

由於 mysql_connect() 自 PHP 5.5.0 起已棄用(將來會被刪除),因此問題並非不可能來自您的 Web 服務器(Apache ?)而不是您的 SQL 版本。

可能導致此問題的另一件事是文件的內容,它最終包含已棄用的命令(這就是錯誤消息似乎告訴您的內容)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM