Multininsert: Über SQL-Datenbanken, Höflichkeit älteren Damen gegenüber und die Ursachen langer Wartezeit an der Wursttheke

Beitrag lesen

foreach($einzelneVariablen AS $variable => $wert) {

$result = $statement->execute(array(
'formular' => 1,
'id_var' => $variable,
'wert' => $wert ));
	
}

Das macht 200x:

"INSERT INTO TABLE `tabelle` (
    `id`,
    `formular`,
    `wert`
) VALUES (
     $i,
     $variable,
     $wert
);

Danach wird 200x der Index neu gebaut. Das dauert halt. Weder MySQL noch MariaDB sind für schnelles Indexieren bekannt und vielleicht ist auch noch ein lahmes Netz dazwischen. Du bist ja mit Informationen äußerst zurückhaltend und schwammig. Was ist denn unter IT-Leuten ist eine "gefühlte Ewigkeit"? (SAP-Anwender sollen angeblich sehr geduldig sein… Mich nervt jede Sekunde)

Das ist wie wenn die Dame (der man an der Einganstür eben noch höflich die Tür aufhaltend den Vortritt gelassen hat) beim Fleischer immer GENAU EINE Scheibe ("Aber bitte recht dünn!") von der Salami ordert und, wenn die Wurst gewogen das Paket schon verpackt ist, insgesamt 200x mit "Ach wissen Sie, ich nehme doch noch eine." das ganze Wiegen, Berechnen und Packen von vorn beginnen lässt.

Und alle hinter ihr sie eigentlich nur anschreien wollen.

Deshalb sollst Du EINEN Multininsert bauen!

"INSERT INTO TABLE `tabelle` (
    `id`,
    `formular`,
    `wert`
) VALUES (
     $i[0],
     $variable[0],
     $wert[0]
), (
     $i[1],
     $variable[1],
     $wert[1]
), 
...
(
     $i[199],
     $variable[199],
     $wert[199]
);

Achte darauf, alle aus unsicheren Quellen stammende oder mutmaßlich womöglich merkwürdiges Zeug enthaltenen Werte zu "entgiften". Da Du nichts dazu aussagst empfehle ich bei Verwendung von PDO:

  • für Strings: $string = $conn->quote( $string );,
  • für Integer: $i = intval( $i );
  • für Float/Dezimalzahlen: $f = intval( $f );

In Deinem Fall also etwa so:

$sql='INSERT INTO `variablen` ( `formular`, `id_var`, `wert`) VALUES ';

$ar = [];

foreach( $einzelneVariablen AS $variable => $wert ) {
    $ar[] = '(' 
           . intval( $formular ) 
           . ','
           . $conn->quote( $variable )
           . ','
           . $conn->quote( $wert )
           . ')'
           . PHP_EOL; 
           /* Der Zeilenumbruch für Fehlermeldungen/Debuggen */
}

if( count( $ar ) ) {
    $sql .= implode( ',', $ar );
    $count = $conn->exec( $sql );
    /* Ausgaben? */
} else {
    /* Ausgaben? */
}
unset( $ar );