Mysql
 sql >> Datenbank >  >> RDS >> Mysql

PHP:LOAD DATA INFILE Syntaxfehler

INTO TABLE '$this->table'

Verwenden Sie keine einfachen Anführungszeichen, um einen Tabellennamen zu zitieren. Einfache Anführungszeichen stehen für String-Literale oder Datumsliterale .
Verwenden Sie entweder keine Anführungszeichen oder back-ticks für begrenzte Kennungen .

INTO TABLE `$this->table`

Zu Ihrem Kommentar:

Anscheinend haben Sie Anführungszeichen aus beiden entfernt den Dateinamen und den Tabellennamen. Das habe ich nicht gemeint. Entfernen Sie einfach die Zeichenfolge-Anführungszeichen aus dem Tabellennamen. Sie benötigen sie für den Dateinamen.

Beispiel:

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

Überprüfen Sie die unter http://dev.mysql dokumentierte Syntax. com/doc/refman/5.6/en/load-data.html

Beachten Sie das Vorhandensein oder Fehlen von Anführungszeichen um INFILE 'file_name' und INTO TABLE tbl_name :

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

Sie brauchen eigentlich keine Backticks um den Tabellennamen herum, es sei denn, Ihr Tabellenname enthält Sonderzeichen, Leerzeichen oder reservierte Wörter.

Sie haben diesen Fehler erhalten:

Richtig, nicht alle SQL-Befehle sind mit prepare() kompatibel . Ich habe das für Ihren Fall nicht überprüft, weil wir zuerst den Syntaxfehler behoben haben. Sie können eine Liste der Befehle finden, die prepare() sein können d unter der Überschrift SQL-Syntax in vorbereiteten Anweisungen erlaubt auf dieser Seite:http://dev .mysql.com/doc/refman/5.6/en/sql-syntax-prepared-statements.html

Ich habe die MySQL 5.6-Dokumentation verlinkt, aber Sie sollten die Dokumentation für die von Ihnen verwendete MySQL-Version besuchen. Weil sich die Liste der kompatiblen Befehle von Release zu Release ändert.

Sie können also prepare() nicht verwenden -- Sie müssen exec() verwenden oder query() stattdessen für ein LOAD DATA INFILE Befehl.

Wenn Sie PDO verwenden, können Sie alternativ das Attribut PDO::ATTR_EMULATE_PREPARES setzen auf true . Das wird PDO dazu bringen, MySQL vorzutäuschen, also ist Prepare() ein No-Op und die Abfrage wird tatsächlich während der Ausführung() gesendet.