Cygal.net.pl

Systemy, Sieci i takie tam :)

PHP & MYSQL “LOAD DATA INFILE” ERRORS

Debian wheezy w repozytoriach posiada baze danych mysql w wersji 5.5. W bazie tej w porównaniu z mysql 5.1 zaszło dużo zmian. Między innym z powodu bezpieczeństwa została wyłączona opcja LODA DATA LOCAL INFILE. Tak się składa że kilka z serwisów którymi się opiekuję korzystają z tej funkcji i musiałem zmusić nowa bazę danych do włączenia tej funkcjonalności, poniżej krotki opis jak to zrobić.

Na serwerze zainstalowano następujące wersje oprogramowania.
MySQL 5.5.33-0+wheezy1 (Debian)
PHP 5.4.4-14+deb7u7 (cli)
ISPConfig 5.3

1) Nadanie odpowiednich upewnień użytkownikowi bazy danych.

GRANT FILE ON *.* TO 'db_user'@'localhost';

2) Konfiguracja mysql
W sekcjach [client] oraz [mysql] dodajemy opcje local-infile oraz loose-local-infile jak pokazano poniżej.

vim /etc/mysql/my.cnf

[client]
loose-local-infile = 1
local-infile = 1

[mysql]
local-infile = 1

restartujemy baze danych w celu wczytania nowych ustawień
service mysql restart

3) Konfiguracja php
Musimy włączyć również funkcje local_infile w php. W tym celu musimy wymedytować plik php.ini zarówno dla mod_php jak i cgi.

vim /etc/php5/apache2/php.ini

mysql.allow_local_infile = On

vim /etc/php5/cgi/php.ini

mysql.allow_local_infile = On

opcjonalnie możemy włączyć opcje locla_infile bezpośrednio w naszym skrypcie php.

ini_set('mysql.allow_local_infile', 1);

restartujemy apache2 w celu wczytania nowych ustawień php.
service apache2 restart

4) testujemy czy wszytko działa jak należy

tworzymy plik testowy z danymi ktore maja byc zaimportowanie do bazy danych.

vim test.csv

zzzz;xxxx
yyyy;wwww
uuuuuuu;uuuuuuu
mysqli;mysqli

ustawiamy odpowiednie uprawnienia
chmod 777 file.csv

jeżeli korzystamy z ISPConfig to musimy zmodyfikować również upewnienia na katalogu web

cd /var/www/naszastrona.pl/
chmod 711 web/
drwx–x–x 28 web2 client2 20K Feb 12 22:55 web

tworzymy skrypt testujący nasza skonfigurowana powyżej funkcjonalność

vim mysql.php
[php]
<?php

define(‘DB_HOST’,’localhost’);
define(‘DB_USER’,’user_db’);
define(‘DB_PASS’,’n2WR32dsa3′);
define(‘DB_DB’,’baza_danych_new’);

$connect = mysql_connect(DB_HOST, DB_USER, DB_PASS, false, 128) or die(‘Not connect to database. ‘.mysql_error());

mysql_select_db(DB_DB,$connect);

//$sql = "LOAD DATA LOCAL INFILE ‘/var/www/naszastrona.pl/web/test.csv’ INTO TABLE test";
$sql = ‘load data infile "/var/www/naszastrona.pl/web/test.csv"
into table test fields terminated by ";"
optionally enclosed by "\""
lines terminated by "\n"’;
mysql_query($sql) or die(mysql_error());

?>
[/php]

jeżeli natomiast korzystamy z mysqli

vim mysqli.php
[php]
<?php

define(‘DB_HOST’,’localhost’);
define(‘DB_USER’,’user_db’);
define(‘DB_PASS’,’n2WR32dsa3′);
define(‘DB_DB’,’baza_danych_new’);

$mysqli = new mysqli("localhost", DB_USER, DB_PASS, DB_DB);
if ($mysqli->connect_errno) {
printf("Connect failed: %s\n", $mysqli->connect_error);
exit();
}

//$sql = "LOAD DATA LOCAL INFILE ‘/var/www/naszastrona.pl/web/test.csv’ INTO TABLE test";
$sql = ‘load data infile "/var/www/naszastrona.pl/web/test.csv"
into table test fields terminated by ";"
optionally enclosed by "\""
lines terminated by "\n"’;
$mysqli->query($sql);
?>
[/php]

Jeżeli pracujemy lokalnie czyli nasz skrypt uruchamiany jest np z powłoki bash możemy korzystać z funkcji LOAD DATA LOCAL INFILE. Jeżeli natomiast skrypt bedzie odpalany za pośrednictwem web serwera to należy użyć funkcji LOAD DATA INFILE. Oba przypadki można przetestować powyższymi skryptami. Należy tylko pamiętać, aby za komentować jedna funkcje a od komentować druga.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *


Time limit is exhausted. Please reload CAPTCHA.