dav133
2009-07-04, 16:31:23
Hallo,
folgendes Problem:
Ich muss zum befuellen einer Datenbank INSERT-Befehle aus einer Schleife heraus ausführen. Mal auf ein simples Beispiel runtergebrochen, sieht das so aus (es wird PDO mit perpared statements verwendet):
$statement = $db->prepare( "INSERT INTO tabelle (`wert`) VALUES (:wert )" );
for ($i=0;$i<=$max;$i++)
{
$statement->bindParam( ":wert", $i, PDO::PARAM_INT );
$statement->execute();
}
Nun ist ja bekannt, dass SQL-Befehle in Loops nicht besonders performant sind. Mit "normalem" SQL haette ich mir erstmal einen SQL-String generiert, etwa folgendermaßen:
$sqlBefehl="INSERT INTO tabelle (wert) VALUES ";
for ($i=0;$i<=$max;$i++)
{
$sqlBefehl.='('.$i.'),';
}
mysql_query($sqlBefehl);
//ergibt:
//INSERT INTO tabelle (wert) VALUES (0),(1),(2),(3),(4),(5),(6),(7),(8),(9),(10) ....
// (das letzte Komma müsste logischerweise noch abgeschnitten werden)
So würde ich die Datenbank nur einmal ansprechen müssen. Mit prepared Statements ist sowas allerdings nicht zu machen. Jetzt hab ich mich in die "transations" bei PDO eingelesen, allerdings funktioniert das auch nicht so wie gedacht, die Datenbank wird nämlich trotzdem bei jedem Schleifendurchlauf angesteuert und nicht nur einmal am Ende bei "commit", wie ich mir das vorgestellt hätte.
$db->beginTransaction();
$statement = $db->prepare( "INSERT INTO tabelle (`wert`) VALUES (:wert )");
for ($i=0;$i<=$max;$i++)
{
$statement->bindParam( ":wert", $i, PDO::PARAM_INT );
$statement->execute();
}
$db->commit();
/edit: Grad gelesen, dass beginTransaction() anscheinend mit der von mir verwendeten Storageengine myisam garnicht funktioniert :(
Abhilfe ;)?
lg
folgendes Problem:
Ich muss zum befuellen einer Datenbank INSERT-Befehle aus einer Schleife heraus ausführen. Mal auf ein simples Beispiel runtergebrochen, sieht das so aus (es wird PDO mit perpared statements verwendet):
$statement = $db->prepare( "INSERT INTO tabelle (`wert`) VALUES (:wert )" );
for ($i=0;$i<=$max;$i++)
{
$statement->bindParam( ":wert", $i, PDO::PARAM_INT );
$statement->execute();
}
Nun ist ja bekannt, dass SQL-Befehle in Loops nicht besonders performant sind. Mit "normalem" SQL haette ich mir erstmal einen SQL-String generiert, etwa folgendermaßen:
$sqlBefehl="INSERT INTO tabelle (wert) VALUES ";
for ($i=0;$i<=$max;$i++)
{
$sqlBefehl.='('.$i.'),';
}
mysql_query($sqlBefehl);
//ergibt:
//INSERT INTO tabelle (wert) VALUES (0),(1),(2),(3),(4),(5),(6),(7),(8),(9),(10) ....
// (das letzte Komma müsste logischerweise noch abgeschnitten werden)
So würde ich die Datenbank nur einmal ansprechen müssen. Mit prepared Statements ist sowas allerdings nicht zu machen. Jetzt hab ich mich in die "transations" bei PDO eingelesen, allerdings funktioniert das auch nicht so wie gedacht, die Datenbank wird nämlich trotzdem bei jedem Schleifendurchlauf angesteuert und nicht nur einmal am Ende bei "commit", wie ich mir das vorgestellt hätte.
$db->beginTransaction();
$statement = $db->prepare( "INSERT INTO tabelle (`wert`) VALUES (:wert )");
for ($i=0;$i<=$max;$i++)
{
$statement->bindParam( ":wert", $i, PDO::PARAM_INT );
$statement->execute();
}
$db->commit();
/edit: Grad gelesen, dass beginTransaction() anscheinend mit der von mir verwendeten Storageengine myisam garnicht funktioniert :(
Abhilfe ;)?
lg