Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Sisipkan beberapa baris dengan pernyataan yang disiapkan PDO

Hal penting pertama yang harus dikatakan adalah bahwa Anda bisa menyisipkan beberapa baris berkat hanya satu INSERT permintaan

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...

Setelah Anda mengetahuinya, Anda bisa mendapatkan solusi yang baik dengan PDO (misalnya).
Anda harus ingat bahwa Anda ingin prepare yang lengkap dan execute proses (dalam hal keamanan, Anda harus melewati setiap parameter secara terpisah).

Katakanlah Anda memiliki baris untuk disisipkan terstruktur sebagai berikut:

$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 ...
);

Sasaran Anda adalah menjadikan hasil ini sebagai kueri yang disiapkan :

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

Dengan yang sesuai eksekusi :

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


Ya, Anda hanya harus melakukannya sekarang:

$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);

Dan... Itu dia!

Dengan cara ini, setiap param diperlakukan secara terpisah, yang Anda inginkan (keamanan, keamanan, keamanan!) dan semuanya, secara dinamis, hanya dengan satu INSERT permintaan

Jika Anda memiliki terlalu banyak baris untuk disisipkan (lihat ini ), Anda harus execute satu per satu

$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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Skrip Pemeriksaan Kesehatan Replikasi MySQL

  2. Tinjauan Fungsi Jendela Analitik Baru di MySQL 8.0

  3. menggunakan (-) tanda hubung di nama tabel mysql

  4. INDEKS DROP MySQL

  5. Kembalikan baris hanya jika nilainya tidak ada