2015-09-07 36 views
5

自升級mysql(當前版本:服務器版本:5.5.44-0 + deb8u1(Debian))以來,無法從上載(本地)文件加載數據,所隱含文件爲:mysql_connect與--local-infile參數

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

有什麼建議?

+0

文件路徑是什麼樣的?你使用'/'還是'\'?這實際上是有區別的。 –

+0

'upfiles/$ file',但正如我提到的更新這停止工作,我。也就是說,它與以前版本的mysql一起工作 –

+0

看起來好像更新禁用了你的mysql配置中的服務器/客戶端設置,不允許local-infile。我剛剛讀到最後一行,你說它在終端中有效。我將在下面提供答案,請將其標記爲正確答案。 –

回答

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

我希望能幫助到你。

-1

由於mysql_connect()自PHP 5.5.0開始不再使用(並且將來會被刪除),所以問題來自您的Web服務器(Apache?)而不是您的SQL版本。

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

+0

我嘗試了msqli(),結果類似,文件內容只是文本,根本沒有任何命令。 –

3

設置在my.cnf選項(或MySQL配置文件,您的系統上):

local-infile=1 

重啓MySQL服務,這應該解決這個問題爲您服務。

UPDATE 另一種選擇用PHP

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

試一下,看看是否可行。選項鍊接mysqli options

+0

我已經試過了:[mysqld] local-infile = 1/[mysql] local-infile = 1或[mysqld] local-infile = On/[mysql] local-infile = On,結果總是:是不允許與此MySQL版本 –

+0

讓我編輯與另一個選項的答案,也許它是PHP ... –

+0

而且總是我重新啓動mysql添加這些命令我得到這些行:錯誤2002(HY000):無法連接到本地MySQL服務器通過套接字'/var/run/mysqld/mysqld.sock'(2) –

0

LOCAL INFILE是數據庫服務器可以從數據庫客戶端(= PHP服務器)請求更多或更少的任何文件的機制如果您不能完全信任您的服務器和網絡,這可能是危險的。因此,必須在服務器上允許LOCAL INFILE(與您一樣)和數據庫客戶機上一樣。

您使用的是舊的過時的而不是維護的mysql擴展名的PHP。該擴展名不支持設置標誌。您應切換到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); 
?>