CSVファイルからのINSERT

phpMyAdminとか使えばという話ですが。
それだと話が終わってしまうので、軽めに書いてみました。

define(CSV_FILE, '/path/to/convert.csv');

$db_conn =& DBManager::getConnection();
if (DB::isError($db_conn)) {
    message($db_conn->getMessage());
    exit;
}

if (!($handle = fopen(CSV_FILE, 'r'))) {
    message("cannot open csv file");
    exit;
}

$line = 1;
while ( ($data = fgetcsv($handle)) !== FALSE ) { *1
    $record = new Record();
    $record->accept($data);
    if (!($record->validate() && $record->insert())) {
        message("line {$i++}: error");
    }
}

define(LOG_FILE, '/path/to/error.log');

function message ($msg)
{
    error_log($msg . "\n", 3, LOG_FILE);
}

未検証なので動かないかもしれませんが。
挿入の部分は全部クラス化してしまうのが、他のCSVに対応させる時楽でいいかなと。

*1:CSV文字コードが内部エンコードと異なる場合はtmpfile関数で一時的に文字コードを変換したファイルを作成し、そのファイルポインタを渡す事で対処します。