2013-11-26 18 views
7

Niedawno przeniosłem serwery sieciowe, a nowy serwer WWW ma inną wersję PHP.LOKALNA INFILE DANYCH DANYCH nie działa z poziomu PHP 5.5 przy użyciu PDO

Nowy serwer: PHP 5.5.3-1ubuntu2 (CLI) starego serwera: PHP 5.3.10 (CLI)

na serwerze bazy danych, my.cnf jest ustawiony, aby umożliwić local-plik_we. mogę używać danych Load lokalnej plik_we od:

- HeidiSQL 
- The command line client running on the new web server using --local-infile=1 
- PHP, using PDO, from the old web server 

jednak, gdy próbuję się połączyć z nowym serwerem WWW za pomocą PHP z PDO, otrzymuję: Problem bazy danych wystąpiły: SQLSTATE [42000]: Składnia błąd lub dostępu naruszenie: 1148 Zastosowana komenda nie jest dozwolona w tej wersji MySQL

php.ini:

[MySQL] 
; Allow accessing, from PHP's perspective, local files with LOAD DATA statements 
; http://php.net/mysql.allow_local_infile 
mysql.allow_local_infile = On 

PDO konstruktor:

$this->db_conn = new PDO("mysql:host=$host;dbname=$dbname;port=$port", $user, $pass, array(PDO::MYSQL_ATTR_LOCAL_INFILE => 1)); 

Próbowałem również ini_set ('mysql.allow_local_infile', 1) i ini_set ('mysql.allow_local_infile', true) w skrypcie PHP.

Słowo kluczowe LOCAL jest potrzebne, ponieważ pliki są hostowane na serwerze WWW, a nie na serwerze bazy danych.

Co jeszcze PHP 5.5 chce ode mnie?

+0

i twój MySQL w wersji ?? – Hackerman

+1

Czy może to być problem z uprawnieniami? CHNP nie robi nic szczególnego w tym zakresie, o ile wiem. – tadman

+0

Baza danych MySQL: mysql Ver 14.14 Distrib 5.1.69 dla redhat-linux-gnu (x86_64) za pomocą readline 5.1. Hostowany na CentOS 5. Używam tego samego użytkownika i hasła we wszystkich testach, więc nie powinien to być problem z uprawnieniami MySQL. Skrypt PHP jest wykonywany przez root. – NotEnoughGolds

Odpowiedz

15

Musisz skonfigurować zarówno klientem a serwerem w celu umożliwienia tego polecenia:

  1. Upewnij się, że serwer pozwala LOAD DATA LOCAL plik_we. Edytować /etc/my.cnf na serwerze MySQL:

    [server] 
    local-infile=1 
    
  2. 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 ','"); 
    

    to musi być ustawione w argumencie opcji sterownika do konstruktora, nie w kolejnym wywołaniu numeru 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 lokalne infile. Wymagania są opisane w http://dev.mysql.com/doc/refman/5.6/en/load-data-local.html

Opcja w php.ini mysql.allow_local_infile nie ma znaczenia dla PDO.

0

Twój kod jest absolutnie poprawny i nie trzeba go zmieniać, ponieważ błąd leży w pliku bazy danych.

błąd przyczyną

Powodem tego błędu spowodowane w utworzeniu kopii zapasowej bazy danych za pomocą poleceń i próbuje przesłać dane poprzez skrypt php zwyczaj.

rozwiązanie

Istnieją 2 dostępnych rozwiązań rozwiązany są: -

  1. próby załadowania bazy danych za pośrednictwem poleceń, jeśli nie masz dostępu do poleceń następnie można poprosić operatora sieci w celu ładuję dla ciebie. Ponieważ musi po prostu uruchomić proste polecenie.

  2. Otwórz plik bazy danych w edytorze tekstu i sprawdź nagłówki, które kodowanie jest używane. Następnie odczytaj dane i dekoduj je, a następnie uruchom polecenie wstawiania.

Jeśli problem nie robi rozwiązać pozwól mi znać ..

Powiązane problemy