Come inserire un arrays in una singola istruzione preparata MySQL con PHP e PDO

Durante una logging online, un cliente può select un numero di programmi per i quali ha scelto di iscriversi. Questi programmi sono numbers interi a tre cifre e sono memorizzati in una matrix.

Per esempio:

Voglio iscrivermi ai programmi 155, 165, 175 e 185.

Il mio arrays è impostato come:

$data = arrays(); $data[] = 155; $data[] = 165; $data[] = 175; $data[] = 185; 

Quando arriva il momento di inserire queste informazioni nella tabella associata, includo anche elementi aggiuntivi dall'altra parte della logging:

Ad esempio, se stavo facendo un'istruzione di inserimento di un programma SINGLE, avrebbe il seguente aspetto:

 $stmt = $db->prepare("INSERT INTO table SET memberID=?, programID=?, date_added=NOW()"); $stmt->execute(arrays($memberid, 155)); 

Normalmente creerei un semplice ciclo per l'arrays sopra il quale chiamerei più istanze dell'istruzione sql ed eseguirai come:

 for($j = 0; $j < (count($data)-1); $j++) { $stmt = $db->prepare("INSERT INTO table SET memberID=?, programID=?, date_added=NOW()"); $stmt->execute(arrays($memberid, $data[$j])); } 

Realizzo che il codice sopra non è valido ($ data [$ j]) ma sto cercando il modo giusto per effettuare la chiamata.

Mi è stato anche detto che la creazione di una singola istruzione SQL dynamic è nel complesso migliore rispetto a più chiamate come sopra. Il mio primo passaggio sarebbe qualcosa di simile:

 $sql = arrays(); foreach( $data as $row ) { $sql[] = '("'.$memberid.'", "'.$row[$j].'", NOW()")'; } mysql_real_query('INSERT INTO table (memberid, programid) VALUES '.implode(',', $sql)); 

ma con PDO non sono abbastanza sicuro di come funzioni, specialmente con i segnaposti (?).

Eventuali suggerimenti?

È ansible creare la query in modo programmatico …:

 $sql = 'INSERT INTO table (memberID, programID) VALUES '; $insertQuery = arrays(); $insertData = arrays(); foreach ($data as $row) { $insertQuery[] = '(?, ?)'; $insertData[] = $memberid; $insertData[] = $row; } if (!empty($insertQuery)) { $sql .= implode(', ', $insertQuery); $stmt = $db->prepare($sql); $stmt->execute($insertData); } 

2 soluzioni

 // multiple queries $stmt = $pdo->prepare('INSERT INTO table SET memberID=:memberID, programID=:programID, date_added=NOW()'); $data = arrays(155, 165, 175, 185); foreach($data as $d) { $stmt->execute(arrays(':memberID' => $memberid, ':programID' => $d)); } 

E

 // one query $data = arrays(155, 165, 175, 185); $values = arrays(); foreach($data as $d) { $values[] = sprintf('(%d, %d, NOW())', $d, $memberid); } $sql = sprintf('INSERT INTO table (memberID, programID, date_added) VALUES %s', implode (', ', $values)); $pdo->exec($sql); 

Quello che stai cercando è come fare un inserto BULK, questo è più legato a SQL che a PDO stesso.

Devi solo fare la stessa identica cosa con * _query, build la tua query di inserimento di massa e il tuo arrays param fianco a fianco.

 $placeholder = arrays(); $values = "?, ?, ?, ..."; $args = arrays(); foreach ($arrayss as $arrays) { $placeholder[] = $value; $args[] = $arrays['col1']; $args[] = $arrays['col2']; $args[] = $arrays['col3']; ... } $sql = "INSERT INTO table (col1, col2, ... ) VALUES (" . implode('), (', $placeholder) . ")"; $stmt = $db->prepare($sql); $db->execute($sql, $args); 

Questo è un algorithm brutto ma funzionante, penso.