INSERT mehrerer Datensätze via Prepared Statements

Spelmann

Erfahrenes Mitglied
Mein Versuch prepared Statements zu verwenden funktioniert nicht wegen falscher Anzahl von Variablen.

PHP:
$pattern = "('name', 'size', 'gattung')";
$sep = ', ';
$rows = array();

foreach ( simplexml_load_file('./xml_sources/myXML.xml') as $elems ) {
    $rowData = array(
       'name' => (string)$elems->NAME,          
       'size' => (double)$elems->SIZE,          
       'gattung' => (string)$elems->GATTUNG     
    );
    $rows[] = strtr($pattern, $rowData);
}

$daten = join($sep, $rows); // $daten ist ein String mit dem Inhalt: ('Shrek', '2.5', 'Oger'), ('Fiona', '1.75', 'Prinzessin'), ('Gestiefelter Kater', '0.9', 'Katze')
var_dump($daten);

$sql=$db_link->prepare('insert INTO tl_figur (NAME, SIZE, GATTUNG) VALUES (?, ?, ?)');
$sql->bind_param('sds', $daten);
$sql->execute();

Fehlerausgabe zur Zeile 18:
Code:
Warning: mysqli_stmt::bind_param():
Number of elements in type definition string
doesn't match number of bind variables

Vereinfacht würde das ja so gehen:
PHP:
INSERT INTO tl_figur (NAME, SIZE, GATTUNG) VALUES ( 'Shrek', '2.5', 'Oger'), ( 'Fiona', '1.75', 'Prinzessin'), ( 'Gestiefelter Kater', '0.9', 'Katze')

Kann mir jemand beschreiben, wie ich mehrere Datensätze via Prepared Statements in meinem Beispiel verarbeiten kann?
 
$daten ist ein String. $sql erwarter aber ein String, eine Double und nochmals ein String. Das sind also 2 Angaben zu wenig

Zudem führst du es nur einmal aus, nicht jedesmal.

So sollte das aussehen
PHP:
$sql=$db_link->prepare('insert INTO tl_figur (NAME, SIZE, GATTUNG) VALUES (?, ?, ?)');
 
foreach ( simplexml_load_file('./xml_sources/myXML.xml') as $elems ) {
    $sql->bind_param('sds', (string)$elems->NAME, (double)$elems->SIZE, (string)$elems->GATTUNG );
    $sql->execute();    
}
 
Ah, mit Prepared Statements nur als Schleife. Hatte ich schon im Verdacht, wusste nur nicht wie.
Kommt mir aber entgegen, weil ich noch Kind-Knoten speichern muss.

Eine kleine Änderung in deinem Beispiel war nötig.

Bezeichnet man so etwas als Ausdruck?: (string)$elems->NAME
Ging jedenfalls so nicht, ich musste das erst in eine Variable schreiben.
PHP:
foreach ( simplexml_load_file('./xml_sources/myXML.xml') as $elems ) {
    $name = (string)$elems->NAME;
    $size = (double)$elems->SIZE;
    $gattung = (string)$elems->GATTUNG;
    $sql->bind_param('sds', $name, $size, $gattung );
    $sql->execute();   
}

Vielen Dank!
 
Auch gut. Mein letzter aktiver PHP-Code ist etwa 3 Jahre her, da vergisst man solche Details *g*
 

Neue Beiträge

Zurück