我有一組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);
你有沒有考慮'插入...重複密鑰更新「? – Passerby