Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Wstaw wiele wierszy z przygotowanymi oświadczeniami PDO

Pierwszą ważną rzeczą do powiedzenia jest to, że możesz wstawiaj wiele wierszy dzięki tylko jednemu INSERT zapytanie

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

Kiedy już to wiesz, będziesz w stanie uzyskać dobre rozwiązanie z PDO (na przykład).
Musisz pamiętać, że chcesz kompletnego prepare i execute proces (ze względów bezpieczeństwa każdy parametr należy przekazać osobno).

Załóżmy, że masz wiersze do wstawienia w następujący sposób:

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

Twoim celem jest uzyskanie tego wyniku jako przygotowanego zapytania :

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

Z odpowiednim wykonaniem :

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


Cóż, tylko muszę to zrobić teraz:

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

I... to wszystko!

W ten sposób każdy parametr jest traktowany osobno, czego chcesz (bezpieczeństwo, bezpieczeństwo, bezpieczeństwo!) i wszystko to w sposób dynamiczny, z tylko jednym INSERT zapytanie

Jeśli masz zbyt wiele wierszy do wstawienia (zobacz to ), powinieneś execute jeden po drugim

$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. Wydajność MySQL – 5 parametrów z pliku konfiguracyjnego

  2. Odmowa dostępu MYSQL do pliku outfile - ale mój użytkownik ma WSZYSTKI dostęp... a folder to CHMOD 777

  3. Zarządzanie bazą danych MySQL w cPanel za pomocą PHPMyAdmin

  4. LOAD DATA INFILE Kod błędu:13

  5. Jak całkowicie usunąć MySQL z Ubuntu?