0

複数のテーブルに追加または更新する一連の 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);
4

1 に答える 1

0

私はこれがどのように見えません

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

多分あなたは次のようなことを意味します

$min= min(count($data),count($columns));
    while($i<$min)
于 2012-08-29T07:40:41.653 に答える