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

PDOプリペアドステートメントを使用して複数の行を挿入します

    最初に重要なことは、できるということです。 1 だけで、複数の行を挿入できます INSERT クエリ

    INSERT INTO Table (col1, col2, col3) 
    VALUES ('abc', 'def', 'ghi'),
           ('abc', 'def', 'ghi'),
           ('abc', 'def', 'ghi'),
           ('abc', 'def', 'ghi'),
           ('abc', 'def', 'ghi')
           -- and so on...
    

    それがわかれば、たとえばPDOで優れたソリューションを得ることができます。
    完全なprepareが必要であることを覚えておく必要があります。 およびexecute プロセス(セキュリティの観点から、各パラメーターを個別に渡す必要があります)。

    次のように構造化された挿入する行があるとします。

    $rows = array(
                  array('abc', 'def', 'ghi'), // row 1 to insert
                  array('abc', 'def', 'ghi'), // row 2 to insert
                  array('abc', 'def', 'ghi')  // row 3 to insert
                  // and so on ...
    );
    

    あなたの目標は、この結果を準備されたクエリとして取得することです。 :

    INSERT INTO Table (col1, col2, col3) 
    VALUES (?, ?, ?),
           (?, ?, ?),
           (?, ?, ?)
    

    対応する実行

    PDOStatement::execute(array('abc', 'def', 'ghi', 'abc', 'def', 'ghi', 'abc', 'def', 'ghi'));
    


    ええと、あなたはのみ 今それをしなければならない:

    $rows = array(
                  array('abc', 'def', 'ghi'),
                  array('abc', 'def', 'ghi'),
                  array('abc', 'def', 'ghi')
    );
    
    $row_length = count($rows[0]);
    $nb_rows = count($rows);
    $length = $nb_rows * $row_length;
    
    /* Fill in chunks with '?' and separate them by group of $row_length */
    $args = implode(',', array_map(
                                    function($el) { return '('.implode(',', $el).')'; },
                                    array_chunk(array_fill(0, $length, '?'), $row_length)
                                ));
    
    $params = array();
    foreach($rows as $row)
    {
       foreach($row as $value)
       {
          $params[] = $value;
       }
    }
    
    $query = "INSERT INTO Table (col1, col2, col3) VALUES ".$args;
    $stmt = DB::getInstance()->prepare($query);
    $stmt->execute($params);
    

    そして...それだけです!

    このように、各パラメーターは個別に処理されます。これは、必要なもの(セキュリティ、セキュリティ、セキュリティ!)であり、すべてを動的に1つのINSERTで処理します。 クエリ

    行が多すぎて挿入できない場合(これ )、executeする必要があります 1つずつ

    $rows = array(
                  array('abc', 'def', 'ghi'), // row 1 to insert
                  array('abc', 'def', 'ghi'), // row 2 to insert
                  array('abc', 'def', 'ghi')  // row 3 to insert
                  // and so on ...
    );
    
    $args = array_fill(0, count($rows[0]), '?');
    
    $query = "INSERT INTO Table (col1, col2, col3) VALUES (".implode(',', $args).")";
    $stmt = $pdo->prepare($query);
    
    foreach ($rows as $row) 
    {
       $stmt->execute($row);
    }
    


    1. Capgemini AgileInnovationPlatformとOracleCloudを使用した大規模なクラウドネイティブとDevSecOps

    2. DISTINCTを使用して可能なパーティション関数COUNT()OVER

    3. PostgreSQLで最大接続数を増やす方法

    4. PostgreSQLでのAtan()のしくみ