2016-04-25 6 views
0

私はPHPでcsvをループし、データでmysqlデータベースを更新しています。コードを実行すると、同じデータが800回挿入され、次のレコードに移動します。 2番目のレコードに達すると、それは想定されているように各行をDBの行として挿入するように見えます。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のと準備された文はまだ追加できるよう最適解ではありません。

関連する問題