複数のテーブルに追加または更新する一連の csv ファイルがあります。csv データは、古い (変更された可能性がある) レコードと新しいレコードが混在しています。
つまり、インポート中にそのレコードが存在するかどうかを確認する必要があります。存在する場合は更新し、存在しない場合は挿入します。さらに興味深いことに、固有の列はほとんどが GUID 形式であり、リストの最初のものではありません。
最終的には、ファイル名の配列とそれぞれで使用される列を検索に使用し、それを繰り返してインポートを自動化したいと考えています。
そのため、ここでの検索で見つかったアイデアを適応させ、挿入を機能させることに成功しましたが、効果的な更新命令を構築することはできません.
コードでは、mysql をエコーしているので、何が起こっているかを確認 (および phpAdmin 経由で確認) できます。$settin からコンテンツを取得できません
$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);