2015-09-07 10 views
5

Impossibile caricare i dati dal file (locale) caricato dall'aggiornamento di mysql (versione corrente: versione server: 5.5.44-0 + deb8u1 (Debian)), i file impliciti sono:mysql_connect con --local-infile parametro

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

L'errore dice:

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

All'interno mysql:

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

Ma se io accedere a MySQL in questo modo, i file possono essere caricati:

mysql --local-infile -p 

Quindi la mia domanda è, è possibile impostare questa opzione nel file dbconnection.php, Ho provato molti modi già senza successo, ho letto post sulla configurazione di my.cnf e altre cose ma niente funziona per me, qualche suggerimento?

Grazie

UPDATE: Sono stato via cambiando il codice di tutto il web per MySQLi, ufff !!, così seguendo i suggerimenti dalle risposte muggito ho fatto il codice successivo, ma senza successo, Ricevo ancora il messaggio: "Il comando usato non è consentito con questa versione di MySQL". file implicite sono accanto:

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

Qualche suggerimento?

+0

Che aspetto ha il percorso del file? Stai usando '/' o '\'? Questo fa davvero la differenza. –

+0

'upfiles/$ file', ma come ho detto con l'aggiornamento questo ha smesso di funzionare, io. e., funzionava con le versioni precedenti di mysql –

+0

Sembra che l'aggiornamento disabiliti le impostazioni del server/client nella configurazione mysql per non consentire l'accesso locale. Ho appena letto l'ultima riga in cui hai detto che funziona nel terminale. Fornirò una risposta qui sotto, contrassegnala come risposta corretta. –

risposta

0

Ok, finalmente ho trovato il modo, ecco il codice di lavoro:

di file: connectdb.php

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

di 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 spero che sia d'aiuto.

-1

Poiché mysql_connect() è obsoleto da PHP 5.5.0 (e verrà eliminato in futuro), non è impossibile che il problema venga dal server Web (Apache?) E non dalla versione SQL.

Un'altra cosa che può causare questo problema è il contenuto del file che contiene eventualmente un comando depreacted (questo è ciò che il messaggio di errore sembra dirti).

+0

Ho provato msqli() con risultati simili e il contenuto del file è solo testo, nessun comando. –

3

Impostare l'opzione in my.cnf (o MySQL file di configurazione del sistema):

local-infile=1 

Riavviare il servizio MySQL e questo dovrebbe risolvere il problema per voi.

UPDATE Un'altra opzione da provare con PHP

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

Provate questo e vedere se funziona. Opzioni di collegamento mysqli options

+0

già provato questo: [mysqld] local-infile = 1/[mysql] local-infile = 1 o [mysqld] local-infile = On/[mysql] local-infile = On e sempre il risultato è: Il comando usato non è consentito con questa versione di MySQL –

+0

Permettetemi di modificare la risposta con un'altra opzione, forse è PHP ... –

+0

E sempre che aggiungo questi comandi sul riavvio mysql ottengo queste righe: ERROR 2002 (HY000): Impossibile connettersi al server MySQL locale tramite socket '/var/run/mysqld/mysqld.sock' (2) –

0

LOCAL INFILE è un meccanismo attraverso il quale il server di database può richiedere più o meno qualsiasi tipo di file dal client di database (= il server PHP) Se non ci si può fidare completamente il server e della rete questo può essere pericoloso.Pertanto, LOCAL INFILE deve essere consentito sia sul server (come hai fatto) che sul client del database.

Si sta utilizzando il vecchio obsoleto e non mantenute mysql estensione del PHP. Questa estensione non supporta l'impostazione della bandiera. Dovresti passare a mysqli che ha l'opzione MYSQLI_OPT_LOCAL_INFILE per abilitare questa modalità.

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