Tidak lama, saya baru saja menemui permasalahan baru saat ingin import data dari file ke database dengan menggunakan perintah LOAD DATA LOCAL INFILE. Kasusnya sederhana, saya punya sebuah file CSV yang akan diimport ke dalam tabel di database tertentu.
Teorinya simpel, apabila server mysql dengan server applikasi masih satu mesin maka cukup gunakan perintah LOAD DATA INFILE. Namun jika server database dan server applikasi terpisah mesinnya maka perlu parameter tambahan menjadi LOAD DATA LOCAL INFILE. Sarat kedua, usernya sudah memperoleh GRANT FILE.
Namun, belakangan setelah update beberapa server, oleh tim lain, maka script saya yang biasa menemui error sebagai berikut
Error Number: 1148 The used command is not allowed with this MySQL version LOAD DATA LOCAL INFILE 'path/file.csv' INTO TABLE `tabel` FIELDS TERMINATED BY ';' ENCLOSED BY '"' ESCAPED BY '\\' LINES TERMINATED BY '\n' Filename: /libraries/war_file_reader.php Line Number: 358
Setelah cek variabel server mysql, variabel local_infile udah ON. Setelah searching di google menemui jawaban yang berputar pada variabel ini. Namun ada salah satu jawaban yang berbeda, yaitu dengan memanipulasi fungsi mysql_connect(). Dengan menambahkan integer 128 pada parameter keempat maka permasalahan tadi sudah terselesaikan. Untuk pengguna CI 2.x silakan cari file driver mysql dan manipulasi sedikit di sini.
function db_connect() { if ($this->port != '') { $this->hostname .= ':'.$this->port; } return @mysql_connect($this->hostname, $this->username, $this->password, TRUE, 128); }