sql >> データベース >  >> RDS >> Mysql

PHP/MySQLを使用したCSVアップロード

    CSVをデータベーステーブルにインポートする必要があるときはいつでも、自分のcsvパーサー/インポーターを作成してきました。とても簡単です。

    これが例です。

    test.csv

    Firstname,Lastname,Age
    "Latheesan","Kanes",26
    "Adam","Smith",30
    

    test.php

    <?php
    
    // Mini Config
    $csv_file       = 'test.csv';
    $delimiter      = ',';
    $enclosure      = '"';
    $skip_first_row = true;
    $import_chunk   = 250;
    
    // Parse CSV & Build Import Query
    $import_queries = array();
    $first_row_skipped = false;
    if (($handle = fopen($csv_file, "r")) !== FALSE) {
        while (($data = fgetcsv($handle, 1000, $delimiter, )) !== FALSE) {
            if ($skip_first_row && !$first_row_skipped) {
                $first_row_skipped = true;
                continue;
            }
            list($firstname, $lastname, $age) = $data;
            $import_queries[] = "INSERT INTO myTable (firstname, lastname, age) VALUES ('$firstname', '$lastname', $age);";
        }
        fclose($handle);
    }
    
    // Proceed if any data got parsed
    if (sizeof($import_queries))
    {
        foreach(array_chunk($import_queries, $import_chunk) as $queries)
        {
            $dbh->query(implode(' ', $queries));
        }
    }
    
    ?>
    

    解析されたクエリは次のようになります(print_rの場合) it):

    Array
    (
        [0] => INSERT INTO myTable (firstname, lastname, age) VALUES ('Latheesan', 'Kanes', 26);
        [1] => INSERT INTO myTable (firstname, lastname, age) VALUES ('Adam', 'Smith', 30);
    )
    

    dbへの実際のインポートには2つのオプションがあります:

    1. インポートSQLクエリのコレクションを作成し、バッチ(array_chunk)で実行します。これは、データベースに対するクエリが少なくなることを意味します。ただし、ご覧のとおり、CSVの値をチェックしていません。つまり、データソースを信頼し、何もエスケープしていません。少し危険です...

    2. 値をエスケープしてクエリを作成するとすぐにクエリを実行します。小さな欠点は、csvの行ごとに1つのクエリを実行することです。...

    これがお役に立てば幸いです。




    1. 複合ステートメントでEVENTを作成したときに、このエラーが発生したのはなぜですか?

    2. 致命的なエラー:未定義の関数mysqli_result()の呼び出し

    3. Mysql:外部キーを追加してもMyISAMテーブルに警告/エラーは発生しません

    4. SQL Server(T-SQL)のデータベースメールログからイベントを削除する