2012-08-29 31 views
0

我有一組csv文件添加或更新幾個表。 csv數據是舊的(可能更改的)記錄和新的混合。php條件混合插入和從csv更新mysql

這意味着在導入過程中,我必須檢查該記錄是否存在 - 如果存在則更新並且如果不存在則插入。爲了增添樂趣,獨特的列大多是guid格式,並且不是列表中的第一列。

最終,我想使用一個文件名的數組和每個用於搜索和列迭代通過自動導入。

所以我一直在適應我的搜索在這裏找到的想法,併成功地讓插入工作,但我不能構建一個有效的更新指令。

在代碼中,我回顯了mysql,所以我可以看到(並通過phpAdmin檢查)發生了什麼。我只是不能設置搜索任何內容出於$

$con= mysql_connect("my_connection_details"); 
mysql_select_db('issuetest'); 
function csv_file_to_mysql_table($source_file, $target_table, $fieln, $max_line_length=0) { 
    if (($handle = fopen("$source_file", "r")) !== FALSE) { 
     $columns = fgetcsv($handle, $max_line_length, ","); 
     $key = array_search($fieln, $columns); 
     foreach ($columns as &$column) { 
      $column = str_replace(".","",$column); 
     } 
     $insert_prefix = "INSERT INTO $target_table (".join(",",$columns).")\nVALUES"; 
     $update_prefix = "UPDATE $target_table SET "; 
     while (($data = fgetcsv($handle, $max_line_length, ",")) !== FALSE) { 
      while (count($data)<count($columns)){ 
      array_push($data, NULL); 
      } 
      $sql="SELECT $fieln FROM $target_table WHERE $fieln='$data[$key]'"; 
      if(mysql_num_rows(mysql_query($sql))=='0'){ 
       $query = "$insert_prefix (".join(",",quote_all_array($data)).");"; 
       }else{ 
       $settin=''; 
       $i='0'; 
       reset($data); 
       reset ($columns); 
       while (count($data)<count($columns)){ 
        if($i=='0'){$settin.="$columns[$i] ='".$data[$i]."'"; 
         }else{$settin.=",$columns[$i]='".$data[$i]."'"; 
        } 
        $i++; 
       } 
       $query = "$update_prefix $settin WHERE $fieln='$data[$key]';"; 
      } 
      echo $query; 
     } 
     fclose($handle); 
    } 
} 

function quote_all_array($values) { 
    foreach ($values as $key=>$value) 
    if (is_array($value)) 
    $values[$key] = quote_all_array($value); 
    else 
    $values[$key] = quote_all($value); 
    return $values; 
} 

function quote_all($value) { 
    if (is_null($value)) 
    return "NULL"; 
    $value = "'" . mysql_real_escape_string($value) . "'"; 
    return $value; 
} 
//$fiel is name of field to check 
//fileN ia name of csv file 
//$tabname is table to insert into 
$fiel='my_field'; 
$tabname='my_table'; 
$fileN='my_csv'; 

$fg=csv_file_to_mysql_table($fileN,$tabname,$fiel); 
+0

你有沒有考慮'插入...重複密鑰更新「? – Passerby

回答

0

我看不出這個

while(count($data)<count($columns)) 

將永遠改變 也許你的意思是這樣

$min= min(count($data),count($columns)); 
    while($i<$min) 
+0

謝謝你 - 這是一個樹林和樹木的事情,並且由於在凌晨工作感到有點精神上的昏迷 - 實際上它只是需要($ i user1533687