0

次のコードがあります。これは、データベースへの挿入をより効率的に実行し、PDO を使用するようにコードを更新したいと考えています。

foreach ($urls as $i => $url) {         


    //path to csv file
    $web = "http://path-to-file/".$url;

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_COOKIEJAR, "cookies.txt");
    curl_setopt($ch, CURLOPT_COOKIEFILE, "cookies.txt");
    curl_setopt ($ch, CURLOPT_URL, $web);
    curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt ($ch, CURLOPT_TIMEOUT, 30);
    $result = curl_exec($ch);

    //explode the csv file by new line
    $r = explode("\n", $result);

    $sql = "insert into product (`product_name`) values ";

    for ($i = 1; $i <= count($r); $i++){

        //explode each row by comma
        $n = explode(",", $r[$i]);                  
        $product_name = $n[0];


        $sql .= "('$product_name'),";


    }

    $sql = trim($sql, ",");

    if(count($n) != 0)
        mysql_query($sql);                  

}

まず、リモート ファイルからデータを取得し、このすべてのデータをファイルからデータベースに挿入するというループがあります。現時点では、コードは 1 つのファイルからデータを挿入し、次のファイルに移動します。各ファイルには最大 2000 の挿入を含めることができ、通常は 15 のバッチで実行されます (したがって、挿入されるレコードのおおよその合計は 30000 です)。30000 レコードすべてを 1 回のヒットで挿入するか、またはバッチで挿入する方が、データベース上でより効率的でしょうか? (サイトに複数のユーザーがいて、ファイルを取得して挿入を実行している可能性があることに注意してください)。

次に、上記のコードを PDO を使用するように変更したいと思います。

これに関する任意の助けをいただければ幸いです。

ありがとう

PS。PDO db 接続を作成する方法を知っています。

4

1 に答える 1

1

最も単純なコードでそれを行うには:

// Start PDO connection (DataBaseHandler)
$user = 'dbuser';
$password = 'dbpass';
$dbh = new PDO('mysql:host=localhost;dbname=database', $user, $password);

// Prepare a reusable insert statement and bind the variable
$insert = $dbh->prepare("INSERT INTO product (`product_name`) VALUES (:product_name)");
$insert->bindParam(':product_name',$product_name);

// Use foreach for arrays
foreach($r as $row){
    //explode each row by comma
    $n = explode(",", $row);                  
    $product_name = $n[0];

    // Execute the prepared INSERT statement referring to the current product name
    $insert->execute();
}

### INSERT を 1 つのステートメントで実行する方が ### 個別の INSERT ステートメントを実行するよりも高速かどうかはわかりませんが、PDO プリペアド ステートメントのおかげで、このコードは間違いなくはるかに単純で効率的です: http://www.php.net/manual/ ja/pdo.prepare.php

編集:

この回答によると、1 つの大きなクエリを実行する方がはるかに高速です。PDO とプリペアド ステートメントから始めていただければ幸いですが、新しい PDO クエリを作成するのはあなたに任せます。これで始められるかもしれません: https://stackoverflow.com/a/6235710/703229

于 2013-03-07T05:14:39.687 に答える