INTO TABLE '$this->table'
Använd inte enstaka citattecken för att citera ett tabellnamn. Enstaka citattecken är för strängtexter
eller date literals
.
Använd inga citattecken, annars back-ticks för avgränsade identifierare
.
INTO TABLE `$this->table`
Angående din kommentar:
Du tog tydligen bort citat från båda filnamnet och tabellnamnet. Det var inte det jag menade. Ta bara bort citattecken från tabellnamnet. Du behöver dem för filnamnet.
Exempel:
$sql = "LOAD DATA LOCAL INFILE '$this->file'
INTO TABLE `$this->table`
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\\n'
OPTIONALLY ENCLOSED BY '\"'
($columns)";
Granska syntaxen som finns dokumenterad på http://dev.mysql. com/doc/refman/5.6/en/load-data.html
Lägg märke till närvaron eller frånvaron av citattecken runt INFILE 'file_name'
och INTO TABLE tbl_name
:
LOAD DATA [LOW_PRIORITY | CONCURRENT] [LOCAL] INFILE 'file_name'
[REPLACE | IGNORE]
INTO TABLE tbl_name
Du behöver faktiskt inte ha bakåtmarkeringarna runt tabellnamnet, om inte ditt tabellnamn innehåller specialtecken, blanksteg eller reserverade ord.
Du fick det här felet:
Höger, inte alla SQL-kommandon är kompatibla med prepare()
. Jag kontrollerade inte det för ditt fall, eftersom vi först löste syntaxfelet. Du kan hitta en lista över kommandon som kan prepare()
d under rubriken SQL-syntax tillåten i förberedda uttalanden på denna sida:http://dev .mysql.com/doc/refman/5.6/en/sql-syntax-prepared-statements.html
Jag länkade till MySQL 5.6-dokumenten, men du bör besöka dokumenten för den version av MySQL du använder. Eftersom listan över kompatibla kommandon ändras från utgåva till utgåva.
Så du kan inte använda prepare()
-- du måste använda exec()
eller query()
istället för en LOAD DATA INFILE
kommando.
Alternativt, om du använder PDO, kan du ställa in attributet PDO::ATTR_EMULATE_PREPARES
till true
. Det kommer att göra att PDO fejkar ut MySQL, så prepare() är en no-op och frågan skickas faktiskt under execute().