Musisz skonfigurować oba klient i serwer, aby zezwolić na to polecenie:
-
Upewnij się, że serwer zezwala na LOAD DATA LOCAL INFILE. Edytuj /etc/my.cnf na serwerze MySQL:
[server] local-infile=1
-
Ustaw atrybut PDO w skrypcie PHP:
<?php $dsn = "mysql:host=localhost;dbname=test"; $user = "root"; $password = "root"; $pdo = new PDO($dsn, $user, $password, array(PDO::MYSQL_ATTR_LOCAL_INFILE=>1)); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $pdo->exec("LOAD DATA LOCAL INFILE 'foo.csv' INTO TABLE foo FIELDS TERMINATED BY ','");
Należy to ustawić w argumencie opcji sterownika do konstruktora, a nie w kolejnym wywołaniu
setAttribute()
.Właśnie przetestowałem powyższy przykład kodu z powodzeniem z PHP 5.5.8 i Percona Server 5.6.15 na CentOS Linux 6.5.
Jeśli nadal masz problemy, możesz mieć kompilację klienta MySQL lub PDO, która nie zezwala na plik lokalny. Wymagania są opisane w http://dev. mysql.com/doc/refman/5.6/en/load-data-local.html
mysql.allow_local_infile
opcja w twoim php.ini nie dotyczy PDO.