2017-09-13 56 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

好吧,我插入这两个(一个被注释掉,但现在都工作),他们做了这份工作!

//$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行后面也不应该有空格。