2017-09-13 11 views
1

CSVファイルをウェブサイト経由でデータベースに挿入しようとしています。スクリプトは正常に動作しますが、単一引用符を含むデータベースには値を挿入しません(たとえば、 "May's Flowers")。私はreal_escape_string関数とstriplashesを試しましたが、それは役に立たなかった。私は文字列として変数をキャストしようとしました。任意のヒント?コードの一重引用符で囲まれたCSV値は無視されます

パート:

if($_FILES["file"]["size"] > 0) 
{ 
    $file = fopen($filename, "r"); 
    //skip first line 
    fgetcsv($file); // first line wont show but neither the 3r 
    while (($getData = fgetcsv($file, 1000)) !== FALSE) 
    { 
     $sql = "INSERT into accounts (accountnumber, accountname, bookccy, date) 
       values ('$getData[0]','$getData[1]','$getData[2]','$getData[3]')"; 
     $result = mysqli_query($conn, $sql); 
+5

[準備文](http://php.net/manual/en/mysqli.quickstart.prepared-statements.php)を使用して、[bind_param(http://php.net/manual/en /mysqli-stmt.bind-param.php)。これは、あなた自身の値を引用する必要性を回避します。 – aynber

+0

例を挙げることができますか? @aynber – noel293

+2

私はリンクされているドキュメントを読む、すべての例があります。 – aynber

答えて

0

私はこれらの2つを挿入しました(1つはコメントアウトされていますが、どちらも機能します)。

//$name = addcslashes($getData[1], "'"); 
    $name = mysqli_real_escape_string($conn,$getData[1]); 
1

このようなファイルをループはLOAD DATA INFILEを使っほど効率的ではありません。代わりに、このような何かを試してみてください:

<?php 

define("DBNAME", "databasename"); 
define("DBUSER", "username"); 
define("DBPWD", "aoeuaoeuauea"); 

$csvfile = "myfile.csv"; 


if(!file_exists($csvfile)) { 
    die("Error: File not found!"); 
} 

try { 
    $dbh = new PDO("mysql:host=localhost;dbname=". DBNAME, DBUSER, DBPWD, array(PDO::MYSQL_ATTR_LOCAL_INFILE => true)); 

    $sql = <<<SQL 
     LOAD DATA INFILE '$csvfile' 
     INTO TABLE accounts 
     FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' 
     LINES TERMINATED BY '\n' 
     (accountnumber, accountname, bookccy, date) 
SQL; 

    $dbh->exec($sql); 

} catch (PDOException $e) { 
    die("An error has occured ". $e->getMessage()); 
} 

CSVファイルを符号化する方法によっては、FIELDS TERMINATED BYLINES TERMINATED BYセクションを変更する必要があります。

私はHEREDOC構文を使ってそれをもう少し細かくしました。 HEREDOC構文に慣れていない場合は、SQL;行の前後に空白がないことが重要です。 <<<SQL行の後ろにスペースを入れてはいけません。

関連する問題