2013-11-03 31 views
0

我試圖解析產品提要中的一些CSV文件。我使用下面的代碼從CSV中獲取數據,並逐行處理以插入到MySQL數據庫中。出於某種原因,每隔一段時間,addslashes函數似乎都會跳過轉義序列。我在這裏做錯了什麼?PHP的CSV解析問題MySQL的轉義字符串

while (($data = fgetcsv($fh, 2000, ",")) !== FALSE) 
{   
    $num = count($data); 
    $nl = 0; 

    for ($c=0; $c < $num; $c++) 
    { 
     $nl++; 
     if ($c >= 0) 
     { 
      if ($nl == 1) 
      { 
       $Name = addslashes($data[$c]); 
      } 
      if ($nl == 2) 
      { 
       $URL = $data[$c]; 
      } 
      if ($nl == 3) 
      { 
       $CatalogName = addslashes($data[$c]); 
      } 
      if ($nl == 4) 
      { 
       $LastUpdated = $data[$c]; 
      } 
     } 
    } 
    if ($headerRow > 40) 
    { 
     $sql = "INSERT INTO table (name,url,catname,updated) VALUES ('$Name','$URL','$CatalogName','$LastUpdated')"; 
       mysqli_query($connection3,$sql) or die("Can't execute query I001.); 
    } 
} 
+2

要麼使用參數化查詢,要麼使用'mysqli_real_escape_string' – Barmar

+1

如果您使用的是MySQLi,爲什麼要將值注入SQL查詢中?使用預處理語句/綁定變量 –

+2

我也不明白你爲什麼使用'for'循環。只要執行'$ Name = addslashes($ data [1]); $ URL = $ data [2]; 「 – Barmar

回答

1

的參數化查詢(http://php.net/manual/en/mysqli.prepare.php):

$sql=$connection3->prepare("INSERT INTO table (name,url,catname,updated) VALUES (?,?,?,?)"); 
$sql->bind_param('ssss',$Name,$URL,$CatalogName,$LastUpdated); 
$results=$sql->execute(); //results contains whether or not the execute was successful. 

雖然這是「面向對象式的」這句話的實際功能將工作,你是否不喜歡的「對象」到「程序風格「,這都是風格。無論如何,它都可以工作,並且在文檔中有程序示例。

其實,這裏是你如何做到這在程序上:

$stmt=mysqli_prepare($connection3, "INSERT INTO table (name,url,catname,updated) VALUES (?,?,?,?)"); 
mysqli_stmt_bind_param($stmt, "ssss", $Name,$URL,$CatalogName,$LastUpdated); 
mysqli_stmt_execute($stmt); 

現在,你不必擔心逃避你的聲明,但你仍然需要清理你的條目,以防止跨站腳本和其他安全風險。

+0

我會在循環的每次迭代中包含所有3條語句,還是僅在循環外部執行第一行,並在每次迭代中執行最後兩條語句? – Robert82

+0

您可以在循環外設置準備,然後綁定參數並在循環內部執行 – Snowburnt