Mysql
 sql >> Database >  >> RDS >> Mysql

PHP:LOAD DATA INFILE errori di sintassi

INTO TABLE '$this->table'

Non utilizzare virgolette singole per citare il nome di una tabella. Le virgolette singole sono per stringa letterale o date letterali .
O non usare virgolette, oppure back-tick per identificatori delimitati .

INTO TABLE `$this->table`

Re il tuo commento:

Apparentemente hai rimosso le citazioni da entrambi il nome del file e il nome della tabella. Non è quello che intendevo. Basta rimuovere le virgolette dal nome della tabella. Ti servono per il nome del file.

Esempio:

$sql = "LOAD DATA LOCAL INFILE '$this->file'
    INTO TABLE `$this->table`
    FIELDS TERMINATED BY ','
    LINES TERMINATED BY '\\n'
    OPTIONALLY ENCLOSED BY '\"'
    ($columns)";

Esamina la sintassi documentata su http://dev.mysql. com/doc/refman/5.6/en/load-data.html

Nota la presenza o l'assenza di virgolette intorno a INFILE 'file_name' e INTO TABLE tbl_name :

LOAD DATA [LOW_PRIORITY | CONCURRENT] [LOCAL] INFILE 'file_name'
    [REPLACE | IGNORE]
    INTO TABLE tbl_name

In realtà non hai bisogno dei segni di spunta indietro attorno al nome della tabella, a meno che il nome della tabella non contenga caratteri speciali, spazi bianchi o parole riservate.

Hai ricevuto questo errore:

Esatto, non tutti i comandi SQL sono compatibili con prepare() . Non l'ho verificato per il tuo caso, perché prima stavamo risolvendo l'errore di sintassi. Puoi trovare un elenco dei comandi che possono essere prepare() d sotto l'intestazione Sintassi SQL consentita nelle istruzioni preparate in questa pagina:http://dev .mysql.com/doc/refman/5.6/en/sql-syntax-prepared-statements.html

Mi sono collegato ai documenti di MySQL 5.6, ma dovresti visitare i documenti per la versione di MySQL che usi. Perché l'elenco dei comandi compatibili cambia da un rilascio all'altro.

Quindi non puoi usare prepare() -- dovrai usare exec() o query() invece per un LOAD DATA INFILE comando.

In alternativa, se stai usando PDO, puoi impostare l'attributo PDO::ATTR_EMULATE_PREPARES su true . Ciò renderà PDO falso MySQL, quindi prepare() è un no-op e la query viene effettivamente inviata durante execute().