2015-09-07 15 views
5

nie można wczytać dane z przesłanego pliku (lokalnego) od modernizacji mysql (Aktualna wersja: Wersja serwera: 5.5.44-0 + deb8u1 (Debian)), pliki implikowane są:mysql_connect z --local-plik_we parametru

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

błąd mówi:

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

Wewnątrz MySQL:

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

Ale jeśli mam dostępu mysql w ten sposób, pliki mogą być ładowane:

mysql --local-infile -p 

Więc moje pytanie brzmi, czy mogę ustawić tę opcję w pliku dbconnection.php, Próbowałem już wiele sposobów bez powodzenia, czytałem posty o konfiguracji my.cnf i inne rzeczy, ale nic nie działa dla mnie, sugestia?

Dzięki

UPDATE: byłem z dala zmiany kodu całej sieci do mysqli, ufff !!, dobrze postępując zgodnie z sugestiami z odpowiedzi ryczeć Zrobiłem następny kod, ale bez powodzenia, Nadal dostaję komunikat: "Używana komenda nie jest dozwolona w tej wersji MySQL". Pliki implikowane są następne:

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

Wszelkie sugestie?

+0

Jak wygląda ścieżka pliku? Czy używasz "/" lub "\"? To naprawdę robi różnicę. –

+0

"upfiles/$ file", ale jak wspomniałem z aktualizacją, to przestało działać, i. e., działało z poprzednimi wersjami mysql –

+0

Wydaje się, że tak jakby aktualizacja wyłączyła ustawienia serwera/klienta w konfiguracji mysql, aby nie zezwalać na lokalny plik typu "infile". Właśnie przeczytałem tę ostatnią linijkę, w której powiedziałeś, że działa ona w terminalu. Podam odpowiedź poniżej, proszę oznaczyć ją jako właściwą odpowiedź. –

Odpowiedz

0

Ok, w końcu znalazłem sposób, tutaj jest kod roboczych:

file: connectdb.php

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

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

I mam nadzieję, że to pomoże.

-1

Ponieważ mysql_connect() jest przestarzałe od PHP 5.5.0 (i zostanie usunięte w przyszłości), nie jest wykluczone, że problem pochodzi z serwera WWW (Apache?), A nie z wersji SQL.

Kolejną rzeczą, która może powodować ten problem, jest zawartość pliku, która ostatecznie zawiera polecenie odmowy wykonania (taki komunikat o błędzie wydaje się informować).

+0

Próbowałem msqli() z podobnymi wynikami, a zawartość pliku jest po prostu tekstem, bez żadnych poleceń. –

3

Ustaw opcję w my.cnf (lub mysql pliku konfiguracyjnego w systemie):

local-infile=1 

usługę MySQL restart i to powinno rozwiązać problem dla Ciebie.

UPDATE Innym rozwiązaniem, aby spróbować z PHP

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

Spróbuj to i zobacz czy działa. Opcje odwołuje mysqli options

+0

Próbowałem już: [mysqld] local-infile = 1/[mysql] local-infile = 1 lub [mysqld] local-infile = On/[mysql] local-infile = On i zawsze wynik jest: Używane polecenie nie jest dozwolone z tą wersją MySQL –

+0

Pozwól mi edytować odpowiedź z inną opcją, może to PHP ... –

+0

I zawsze, że dodaję te komendy po ponownym uruchomieniu mysql, otrzymuję następujące linie: ERROR 2002 (HY000): Nie mogę się połączyć z lokalny serwer MySQL poprzez gniazdo "/var/run/mysqld/mysqld.sock" (2) –

0

LOCAL INFILE to mechanizm, dzięki któremu serwer bazy danych może żądać mniej lub bardziej dowolny plik od klienta bazy danych (= serwer PHP) Jeśli nie można w pełni zaufać serwerowych i sieciowych to może być niebezpieczne.Dlatego LOCAL INFILE musi być dozwolony zarówno na serwerze (tak jak Ty) jak na kliencie bazy danych.

Używasz starego, przestarzałego i nieobsługiwanego rozszerzenia języka PHP mysql. To rozszerzenie nie obsługuje ustawiania flagi. Powinieneś przełączyć się na mysqli, który ma opcję MYSQLI_OPT_LOCAL_INFILE, aby włączyć ten tryb.

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