2016-04-25 99 views
0

我通過PHP中的CSV循環和更新與數據的MySQL數據庫。在運行我的代碼時,它會將相同的數據插入800次,然後移至下一條記錄。一旦達到第二條記錄,它似乎將每行作爲行中的一行插入到數據塊中。在PHP循環通過CSV - 插入和更新

難道我在循環(可能是一個無限循環),MySQL的可能只是修正有一個錯誤?

$link = mysql_connect('localhost', 'user', 'pass'); 
if (!$link) { 
    die('Not connected : ' . mysql_error()); 
} 

// make foo the current db 
$db_selected = mysql_select_db('parsetest', $link); 
if (!$db_selected) { 
    die ('Can\'t use parsetest : ' . mysql_error()); 
} 

function csv_to_array($filename='', $delimiter=',') 
{ 
    if(!file_exists($filename) || !is_readable($filename)) 
     return FALSE; 

    $header = NULL; 
    $data = array(); 
    if (($handle = fopen($filename, 'r')) !== FALSE) 
    { 
     while (($row = fgetcsv($handle, 1000, $delimiter)) !== FALSE) 
     { 
      if(!$header) 
       $header = $row; 
      else 
       $data[] = array_combine($header, $row); 
     } 
     fclose($handle); 
    } 
    return $data; 
} 

$data = csv_to_array('stockimp.csv'); 

foreach ($data as $key) { 

    $style = $key['Style']; 
    $result = mysql_query("SELECT * FROM stocklink2 WHERE Style = '$style'"); 
    if($result === FALSE) { 
     die(mysql_error()); // TODO: better error handling 
    } 
    if(mysql_num_rows($result) > 0) { 
     $result = mysql_query("UPDATE stocklink2 SET Style = '$style' "); 
     if (!$result) { 
      die('Invalid query on update: ' . mysql_error()); 
     } 
     else { 
      echo $key['Style']." Updated <br>"; 
     } 

    } 
    else 
    { 
     $result = mysql_query("INSERT INTO stocklink2 (Style) VALUES ('$style') "); 
     if (!$result) { 
      die('Invalid query on insert: ' . mysql_error()); 
     } 
     else { 
      echo $key['Style']." Inserted <br>";  
     } 

    } 


} 

更新:

原來的問題得到解決。該表沒有將任何列設置爲唯一,一旦我將表的第一列更改爲「唯一」順序插入的記錄。

循環的更新部分現在無法複製進入「2」。

+3

這應該很容易調試。嘗試使用'echo'或'print_r'(如果需要的話,後面跟一個'exit')來更多地瞭解你的循環中發生了什麼。 – Dave

+0

嘗試打印來自此函數的響應$ data = csv_to_array('stockimp.csv');查看數據是否正確。 –

+1

請檢查mysqli並準備好語句。運行這些查詢時,它們會爲您提供巨大的性能提升。 – Celoain

回答

0

原始問題已解決。該表沒有將任何列設置爲唯一,一旦我將表的第一列更改爲「唯一」順序插入的記錄。

循環的更新部分,然後用重複的條目失敗「2」。 最終工作溶液:

$link = mysql_connect('localhost', 'user', 'pass'); 
if (!$link) { 
    die('Not connected : ' . mysql_error()); 
} 

// make foo the current db 
$db_selected = mysql_select_db('parsetest', $link); 
if (!$db_selected) { 
    die ('Can\'t use foo : ' . mysql_error()); 
} 


/*=============================================== 
=   Generate array from csv   = 
===============================================*/ 

function csv_to_array($filename='', $delimiter=',') 
{ 
    if(!file_exists($filename) || !is_readable($filename)) 
     return FALSE; 

    $header = NULL; 
    $data = array(); 
    if (($handle = fopen($filename, 'r')) !== FALSE) 
    { 
     while (($row = fgetcsv($handle, 1000, $delimiter)) !== FALSE) 
     { 
      if(!$header) 
       $header = $row; 
      else 
       $data[] = array_combine($header, $row); 
     } 
     fclose($handle); 
    } 
    return $data; 
} 

$data = csv_to_array('stockimp.csv'); 

foreach ($data as $key) { 

    //set and print style 
    $style = $key['Style']; 
    $id = $key['Rec No']; 
    echo $style."<br><br>"; 

    // See if the style exists 
    $result = mysql_query("SELECT * FROM stocklink2 WHERE 'Rec No' = '$id'"); 
    print_r($result); 
    // if there's an error, die 
    if($result === FALSE) { 
     die(mysql_error()); // TODO: better error handling 
    } 
    // else do this 
    else{ 
     $insert = mysql_query("INSERT INTO stocklink2 (`Rec No`,`Style`) VALUES ('$id','$style') ON DUPLICATE KEY UPDATE Style = '$style'; "); 

    } 

} 

這並不像仍然可添加的mysqli和準備的語句的最優解。