Php / pdo

Moin Community,
habe mal eine Frage an alle die sich mit PDO auskennen.

Ich habe eine Tabelle (Roottabelle) die Zugriff auf 4 Untertabellen hat.
Alle Klassen nutzen das gleiche interface und sind auch gleich aufgebaut.

Der Roottabelle übergebe ich jetzt das Request Objekt, sowie die Tätigkeit z.B. 'select', so dass diese mir jetzt ein fertiges Ergebnis zurückliefert. Bei einem Update, oder Insert triggert die Roottabelle die Untertabellen an und diese speichern die Daten zum richtigen Datensatz ab bzw. legen einen neuen an.
Soweit funktioniert auch alles. Bei einem nicht Erfolg bekomme ich ein false zurück und kann in meinem Command ( MVC ) dann die richtige Meldung ausgeben.
Jetzt wollte ich das ganze über PDO::BeginnTransaction(), Rollback, Commit händeln, so dass im Falle eines False alles rückgängig gemacht werden kann.
Laut Php.net muss ich erst eine Transaction anlegen, dann die ganzen exec durchführen, um dann bei einem Erfolg ein commit(), oder bei false rollback() durchzuführen.
Ich bekomme aber jedes mal eine Fehlermeldung das bereits eine Transaction gestartet ist.... Die BeginnTransaction() wird aber bei mir im Code nur zu Beginn angestoßen und wie laut dokumentation gewünscht mit dem Commit ausgeführt und dann dadurch ja auch zurückgesetzt

Mir kräuseln sich hier langsam die Haare...

Kann mir das jemand eventuell etwas erklären, oder habe ich das ganze falsch verstanden?
 
Ich glaube du hast einfach nur den Überblick über deine Transactions verloren.
Den nachfolgender Code läuft.
Alternativ könntest du auch die Transactions,je nach Objekt, auch in zB SQL starten, da musst du dann aber aufpassen das es kein Autocommit oder Autorollback seitens PDO gibt.
mfg

sw33t
PHP:
<?php
$db = new PDO("sqlite:beispiel");
$db->query("create table was( BEISPIEL integer not null;)");
$db->query("insert into was(BEISPIEL) values(2)");
$db->exec("insert into was(BEISPIEL) values(1)");
$db->exec("insert into was(BEISPIEL) values(3)");
$ha = $db->query("select * from was");
foreach($ha as $row) print $row[0];
$db->beginTransaction();
$db->exec("insert into was(BEISPIEL) values(1)");
$db->commit();
$ha = $db->query("select * from was");
foreach($ha as $row) print $row[0]."\n";
$db->beginTransaction();
$db->exec("insert into was(BEISPIEL) values(0)");
$db->exec("insert into was(BEISPIEL) values(9)");
$db->exec("insert into was(BEISPIEL) values(6)");
//$db->beginTransaction(); // hier knallt es
$db->rollback();
$db->beginTransaction();
$db->exec("insert into was(BEISPIEL) values(5)");
$db->commit();
?>
 
Mmh... Ok das könnte wirklich so sein. Werde mir das ganze nochmal in Ruhe ansehen und mal schauen ob der Ablauf nicht doch irgendwo noch abknickt.

Das schöne ist das ich Anhand deines Beispiels sehen kann das ich das ganze zumindest richtig verstanden habe und das sowas funktioniert.

melde mich dann wieder zurück... danke erstmal...
 
So... ich habe aus meine PDO Objekt ein singleton gemacht und hole mir jetzt wenn imer die aktuelle instance.
Ich denke nach der momentanen augenscheinlichen Fuktion das Du Recht hattest.... Danke, war wohl doch zu oft aufgerufen
 
Zurück
Oben