INTO TABLE '$this->table'
Nie używaj pojedynczych cudzysłowów do cytowania nazwy tabeli. Pojedyncze cudzysłowy dotyczą literałów tekstowych
lub literały daty
.
Albo nie używaj cudzysłowów, albo wsteczne zaznaczenia dla rozdzielanych identyfikatorów
.
INTO TABLE `$this->table`
Odpowiedz na swój komentarz:
Najwyraźniej usunąłeś cytaty z obu nazwę pliku i nazwę tabeli. Nie o to mi chodziło. Po prostu usuń znaki cudzysłowu z nazwy tabeli. Potrzebujesz ich do nazwy pliku.
Przykład:
$sql = "LOAD DATA LOCAL INFILE '$this->file'
INTO TABLE `$this->table`
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\\n'
OPTIONALLY ENCLOSED BY '\"'
($columns)";
Zapoznaj się ze składnią udokumentowaną pod adresem http://dev.mysql. com/doc/refman/5.6/en/load-data.html
Zwróć uwagę na obecność lub brak cudzysłowów wokół INFILE 'file_name'
i INTO TABLE tbl_name
:
LOAD DATA [LOW_PRIORITY | CONCURRENT] [LOCAL] INFILE 'file_name'
[REPLACE | IGNORE]
INTO TABLE tbl_name
W rzeczywistości nie potrzebujesz zaznaczeń wokół nazwy tabeli, chyba że nazwa tabeli zawiera znaki specjalne, odstępy lub słowa zastrzeżone.
Otrzymałeś ten błąd:
Tak, nie wszystkie polecenia SQL są kompatybilne z prepare()
. Nie sprawdziłem tego w twoim przypadku, ponieważ najpierw naprawiliśmy błąd składni. Możesz znaleźć listę poleceń, które mogą być prepare()
d pod nagłówkiem Składnia SQL dozwolona w przygotowanych oświadczeniach na tej stronie:http://dev .mysql.com/doc/refman/5.6/en/sql-syntax-prepared-statements.html
Połączyłem się z dokumentacją MySQL 5.6, ale powinieneś odwiedzić dokumentację dotyczącą używanej wersji MySQL. Ponieważ lista kompatybilnych poleceń zmienia się z wydania na wydanie.
Więc nie możesz użyć prepare()
-- będziesz musiał użyć exec()
lub query()
zamiast tego LOAD DATA INFILE
Komenda.
Alternatywnie, jeśli używasz PDO, możesz ustawić atrybut PDO::ATTR_EMULATE_PREPARES
na true
. To sprawi, że PDO sfałszuje MySQL, więc przygotowanie() nie działa, a zapytanie jest faktycznie wysyłane podczas execute().