2014-04-18 2 views
0

그래서 이걸 얻었습니다. 그냥 MySQL의 PHP를 통해 PDO 드라이버로 csv 파일을 삽입하려고 :큰 따옴표로 묶인 cvs의 LOAD DATA INFILE

<?php 
$databasehost = "localhost"; 
$databasename = "db"; 
$databasetable = "table"; 
$socketPath = "/home/mysql/mysql.sock"; 
$databaseusername="user"; 
$databasepassword = "pass"; 
$fieldseparator = ","; 
$fieldenclosed = '"'; 
$lineseparator = "\r\n"; 
$csvfile = "file.csv"; 

if(!file_exists($csvfile)) { 
    die("File not found. Make sure you specified the correct path."); 
} 

try { 
    $pdo = new PDO("mysql:host=$databasehost;dbname=$databasename;unix_socket=$socketPath", 
     $databaseusername, $databasepassword, 
     array(
      PDO::MYSQL_ATTR_LOCAL_INFILE => true, 
      PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION 
     ) 
    ); 
} catch (PDOException $e) { 
    die("database connection failed: ".$e->getMessage()); 
} 

$affectedRows = $pdo->exec(" 
    LOAD DATA LOCAL INFILE ".$pdo->quote($csvfile)." INTO TABLE `$databasetable` 
    FIELDS TERMINATED BY ".$pdo->quote($fieldseparator).", ENCLOSED BY ". $pdo->quote($fieldenclosed)." 
    LINES TERMINATED BY ".$pdo->quote($lineseparator)." IGNORE 1 LINES;"); 

echo "Loaded a total of $affectedRows records from this csv file.\n"; 

?> 

CSV 파일 이런 식으로 뭔가를 (쉼표로 구분하고 큰 따옴표로 둘러싸인)입니다.

"X410","","4114068500","000010","04/15/2014","04/16/2015" 
"X410","","4220521243","000030","04/08/2014","04/08/2015" 
"X410","","4130003659","000010","04/02/2014","04/05/2014" 
"X410","","4220524277","000010","04/08/2014","04/08/2015" 
"X410","","4114038136","000010","04/07/2014","04/07/2015" 
"X410","","4130003594","000110","03/14/2014","03/14/2015" 
"X410","","4130003675","000010","04/04/2014","04/04/2015" 
"X410","","4130003623","000010","03/12/2014","03/12/2015" 
"X410","","4130003679","000010","04/09/2014","04/09/2015" 
"X410","","4130003679","000020","04/09/2014","04/09/2015" 

ENCLOSED BY 부분은 나에게 문제를주고 하나는, 내가 함께하고 withouth, $fieldenclosed = "\"\""을 내 숙제를하고 $fieldenclosed = '\"\"' 해봤 인 $pdo->quote($fieldenclosed) 내가의 불구했습니다 또는에서 발견 된 다른 이상한 CONCAT의 STUF 유사한 문제가있는 다른 주제

MySQL은이 오류가 발생하십시오에 CentOS 6.4 서버의 MySQL 5.1을 실행

PHP Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ' ENCLOSED BY '"' 
LINES TERMINATED BY '\r\n' IGNORE 1 LINES' at line 2' in /root/csvUpload.php:32 

임.

아이디어가 있으십니까?

답변

1

ENCLOSED BY 앞에 쉼표가 있어서는 안됩니다. 다음과 같아야합니다.

$fieldenclosed = '"'; 

작은 따옴표 - 필드 시작 및 끝 부분에 있어야하는 문자입니다.

또한 변수 이름을 잘못 입력했으며 문자열을 끝내지 않고 $pdo->quote을 호출하여 연결하지 않았습니다.

$affectedRows = $pdo->exec(" 
    LOAD DATA LOCAL INFILE ".$pdo->quote($csvfile)." INTO TABLE `$databasetable` 
    FIELDS TERMINATED BY ".$pdo->quote($fieldseparator)." ENCLOSED BY ".$pdo->quote($fieldenclosed)." 
    LINES TERMINATED BY ".$pdo->quote($lineseparator)." IGNORE 1 LINES;"); 
+0

쉼표가 있습니다. 여기에 코드를 복사하는 동안 연결이있는 오타가있었습니다 (원래 게시물에서 고정). –

+0

제대로 닫히기 위해 되돌아옵니다. 단일 이중 따옴표 부분에 맞았지만, MySQL 5.1 빌드에서 적절한 sintaxys는 전에 쉼표없이 ENCLOSED BY 부분을 넣고있었습니다. 이상한 것들. –