Mysql
 sql >> Base de données >  >> RDS >> Mysql

PHP :Erreurs de syntaxe LOAD DATA INFILE

INTO TABLE '$this->table'

N'utilisez pas de guillemets simples pour citer un nom de table. Les guillemets simples sont pour littéraux de chaîne ou littéraux de date .
Soit n'utilisez pas de guillemets, soit back-ticks pour les identifiants délimités .

INTO TABLE `$this->table`

Concernant votre commentaire :

Vous avez apparemment supprimé les guillemets de les deux le nom du fichier et le nom de la table. Ce n'est pas ce que je voulais dire. Supprimez simplement les guillemets de chaîne du nom de la table. Vous en avez besoin pour le nom de fichier.

Exemple :

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

Passez en revue la syntaxe documentée sur http://dev.mysql. com/doc/refman/5.6/en/load-data.html

Notez la présence ou l'absence de guillemets autour de INFILE 'file_name' et INTO TABLE tbl_name :

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

Vous n'avez pas réellement besoin des back-ticks autour du nom de la table, à moins que votre nom de table ne contienne des caractères spéciaux, des espaces ou des mots réservés.

Vous avez cette erreur :

Bon, toutes les commandes SQL ne sont pas compatibles avec prepare() . Je n'ai pas vérifié cela pour votre cas, car nous résolvions d'abord l'erreur de syntaxe. Vous pouvez trouver une liste des commandes qui peuvent être prepare() d sous le titre Syntaxe SQL autorisée dans les instructions préparées sur cette page :http://dev .mysql.com/doc/refman/5.6/en/sql-syntax-prepared-statements.html

J'ai lié à la documentation MySQL 5.6, mais vous devriez consulter la documentation de la version de MySQL que vous utilisez. Parce que la liste des commandes compatibles change d'une version à l'autre.

Vous ne pouvez donc pas utiliser prepare() -- vous devrez utiliser exec() ou query() à la place pour un LOAD DATA INFILE commande.

Alternativement, si vous utilisez PDO, vous pouvez définir l'attribut PDO::ATTR_EMULATE_PREPARES à true . Cela fera que PDO simulera MySQL, donc prepare() est un no-op et la requête est en fait envoyée pendant execute().