Jika Anda melakukan echo($sql); sebelum Anda menjalankannya, Anda akan melihat bahwa sintaks kueri Anda salah karena alasan berikut:
-
Nama file harus diapit dalam tanda kutip daripada tanda centang balik karena ini adalah string literal bukan pengenal.
-
Sama sekali tidak perlu memanggil
mysql_escape_string()untuk menentukan pembatas diFIELDS TERMINATED BYdanENCLOSED BYdanESCAPED BYklausa. -
Anda terlalu sering menggunakan backtick. Bahkan dalam kasus Anda, karena tidak ada kata khusus yang digunakan, Anda membuang semuanya. Mereka hanya menambah kekacauan.
-
Di akhir baris pertama file CSV, Anda harus memiliki
,,,karena Anda menggunakannya sebagai bagian dari pembatas garis. Jika Anda tidak melakukannya, Anda tidak hanya akan melewati baris pertama tetapi juga baris kedua yang berisi data. -
Anda tidak dapat menggunakan
ENCLOSED BYklausa lebih dari satu kali. Anda harus berurusan denganNumberbidang dengan cara yang berbeda. -
Melihat baris sampel Anda IMHO, Anda tidak perlu
ESCAPED BY. Tetapi jika Anda merasa membutuhkannya gunakan seperti iniESCAPED BY '\\'.
Dikatakan bahwa pernyataan yang benar secara sintaksis mungkin terlihat seperti ini
LOAD DATA INFILE 'detection.csv'
INTO TABLE calldetections
FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY ',,,\r\n'
IGNORE 1 LINES
(date, name, type, number, duration, addr, pin, city, state, country, lat, log)
Sekarang IMHO Anda perlu mengubah beberapa bidang saat Anda memuatnya:
-
jika
datedi tabel Anda adalahdatetimetipe data maka perlu diubah, jika tidak, Anda akan mendapatkan kesalahanNilai tanggal waktu salah:'18 Sep-2013 13:53:45' untuk kolom 'tanggal' pada baris
-
anda harus berurusan dengan qoutes tunggal di sekitar nilai dalam
Numberbidang -
kemungkinan besar Anda ingin mengubah
"null"string literal keNULLyang sebenarnya untukaddr, pin, city, state, countrykolom -
jika durasi selalu dalam detik maka Anda dapat mengekstrak nilai bilangan bulat dari detik dan menyimpannya seperti itu di tabel Anda agar dapat dengan mudah menggabungkan nilai durasi nanti.
Meskipun demikian, versi pernyataan yang berguna akan terlihat seperti ini
LOAD DATA INFILE 'detection.csv'
INTO TABLE calldetections
FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY ',,,\r\n'
IGNORE 1 LINES
(@date, name, type, @number, @duration, @addr, @pin, @city, @state, @country, lat, log)
SET date = STR_TO_DATE(@date, '%b-%d-%Y %h:%i:%s %p'),
number = TRIM(BOTH '\'' FROM @number),
duration = 1 * TRIM(TRAILING 'Secs' FROM @duration),
addr = NULLIF(@addr, 'null'),
pin = NULLIF(@pin, 'null'),
city = NULLIF(@city, 'null'),
state = NULLIF(@state, 'null'),
country = NULLIF(@country, 'null')
Di bawah ini adalah hasil mengeksekusi kueri di mesin saya
mysql> LOAD DATA INFILE '/tmp/detection.csv'
-> INTO TABLE calldetections
-> FIELDS TERMINATED BY ','
-> OPTIONALLY ENCLOSED BY '"'
-> LINES TERMINATED BY ',,,\n'
-> IGNORE 1 LINES
-> (@date, name, type, @number, @duration, @addr, @pin, @city, @state, @country, lat, log)
-> SET date = STR_TO_DATE(@date, '%b-%d-%Y %h:%i:%s %p'),
-> number = TRIM(BOTH '\'' FROM @number),
-> duration = 1 * TRIM(TRAILING 'Secs' FROM @duration),
-> addr = NULLIF(@addr, 'null'),
-> pin = NULLIF(@pin, 'null'),
-> city = NULLIF(@city, 'null'),
-> state = NULLIF(@state, 'null'),
-> country = NULLIF(@country, 'null');
Query OK, 3 rows affected (0.00 sec)
Records: 3 Deleted: 0 Skipped: 0 Warnings: 0
mysql> select * from calldetections;
+---------------------+---------+---------------+-------------+----------+------+------+------+-------+---------+------+------+
| date | name | type | number | duration | addr | pin | city | state | country | lat | log |
+---------------------+---------+---------------+-------------+----------+------+------+------+-------+---------+------+------+
| 2013-09-18 13:53:45 | Unknown | outgoing call | 123456 | 0 | NULL | NULL | NULL | NULL | NULL | 0.0 | 0.0 |
| 2013-09-18 13:54:14 | Unknown | outgoing call | 1234567890 | 0 | NULL | NULL | NULL | NULL | NULL | 0.0 | 0.0 |
| 2013-09-18 13:54:37 | Unknown | outgoing call | 14772580369 | 1 | NULL | NULL | NULL | NULL | NULL | 0.0 | 0.0 |
+---------------------+---------+---------------+-------------+----------+------+------+------+-------+---------+------+------+
3 rows in set (0.00 sec)
Dan akhirnya di php menetapkan string kueri ke $sql variabel akan terlihat seperti ini
$sql = "LOAD DATA INFILE 'detection.csv'
INTO TABLE calldetections
FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '\"'
LINES TERMINATED BY ',,,\\r\\n'
IGNORE 1 LINES
(@date, name, type, @number, @duration, @addr, @pin, @city, @state, @country, lat, log)
SET date = STR_TO_DATE(@date, '%b-%d-%Y %h:%i:%s %p'),
number = TRIM(BOTH '\'' FROM @number),
duration = 1 * TRIM(TRAILING 'Secs' FROM @duration),
addr = NULLIF(@addr, 'null'),
pin = NULLIF(@pin, 'null'),
city = NULLIF(@city, 'null'),
state = NULLIF(@state, 'null'),
country = NULLIF(@country, 'null') ";