Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP + ADOdolite] Problem z transakcjami
Forum PHP.pl > Forum > PHP
mrok
Witam

Korzysta ktoś może z transakcji w ADOdblite?

Mój problem polega na tym, iż poniższy skrypt


  1. <?php
  2. require_once 'adodb/adodb.inc.php';
  3. $db = NewADOConnection("mysql");
  4. $db->Connect("xxx”); 
  5.  
  6. $db->StartTrans();
  7. $db->Execute("INSERT INTO test2 ( id_testu , wynik ) VALUES ('3', 'gfd')");
  8. $db->CompleteTrans();
  9. ?>



Bez problemu działa w ADOdb, natomiast to samo przy wykorzystaniu wersji lite wyświetla błąd
  1. Fatal error: Call to undefined method mysql_driver_ADOConnection::StartTrans()

Próbowałem to obejść/naprawić przez skopiowanie kilku funkcji (StartTrans, CompleteTrans) z pliku adodb.inc.php z versji full do adodb.inc.php versji lite, ale niestety nie przyniosło to efektów ;(

Posiada może ktoś, lepsza wersję tej biblioteki?
Wg dokumentacji na stronie ADOdblite transakcje powinny działać…..
devnul
coś mi się po kodowaniu wydaje że cudzysłów masz zły i z tąd problem (linia 4 códzysłów zamykający jest inny niż otwierający)
mrok
Cytat
coś mi się po kodowaniu wydaje że cudzysłów masz zły i z tąd problem

Słuszna uwaga i dobre oko, ale to nie przez to. te cudzyslowie pomylilem jak wklepywalem kod do przegladarki i nie chcialem podawac hasla poblicznie winksmiley.jpg)

Ten sam kod uruchamiam przy ADOdb full (dziala) i lite (nie dziala) wiec to raczej nie cudzyslow.

  1. <?php
  2. require_once 'adodb/adodb.inc.php';
  3. $db = NewADOConnection("mysql");
  4. $db->Connect("xxx"); 
  5.  
  6. $db->StartTrans();
  7. $db->Execute("INSERT INTO test2 ( id_testu , wynik ) VALUES ('3', 'gfd')");
  8. $db->CompleteTrans();
  9. ?>


błąd jest w lini 6. W pakiecie ADOdbLite nie mam zdefiniowanej funkcji StartTrans()questionmark.gif probowałem sciągnąć wersję wcześniejszą 1.4 zamiast 1.42, ale tez jej tam nie ma winksmiley.jpg.

Chyba trzeba bedzie zrezygnowac z lita ;(
Cezar708
... no niestety nie ma obsługi tranzacji w AdoDB lite, wiec masz dwa wyjścia:

1. dopisujesz obsługę tranzakcji:

  1. <?php
  2. class MyAdodbLite extends <nie wiem jak sie nazywa klasa adodbLite... musisz sprawdzic>{
  3.  
  4. private $CORRECT_TRANS;
  5. private $TRANS_IN_PROGRESS;
  6.  
  7. function StartTrans(){
  8. $this->TRANS_IN_PROGRESS = true;
  9. $this->CORRECT_TRANS = $this->Execute("BEGIN");
  10. }
  11.  
  12. function CompleteTrans(){
  13. if ( $this->TRANS_IN_PROGRESS && $this->CORRECT_TRANS ){
  14. $this->Execute("COMMIT");
  15. return true;
  16. } else {
  17. $this->Execute("ROLLBACK");
  18. return false;
  19. }
  20. }
  21.  
  22. function Execute($sql){
  23. if ( $this->TRANS_IN_PROGRESS && $this->CORRECT_TRANS ){
  24. $this->CORRECT_TRANS = parent::Execute($sql);
  25. return $this->CORRECT_TRANS;
  26. }
  27. return parent::Execute($sql);
  28. }
  29.  
  30. }
  31. ?>

(nie sprawdzałem, pisałem w edytorze forum.php.pl tongue.gif)

no i potem odpowiednio podmieniasz tę klasę z klasa adodblite

2. zmieniasz na AdoDB
mrok
Dzięki Cezar. Klasa bardzo zgrabna i przydatna, ale …. dosłownie minute po Twoim poście znalazłem rozwiązanie (i przetestowałem - działa;)

Cały zonk polega na błędnym wyborze bazy.

W AdoDBLite jest niestety różnica między

  1. <?php
  2. $db = NewADOConnection("mysql"); //brak obslugi transakcji
  3. ?>


a

  1. <?php
  2. $db = NewADOConnection("mysqlt"); //obsluga transakcji
  3. ?>


tak więc dwa dni zeszły na szukanie jednego 't' winksmiley.jpg)

Natomiast ADOdb obsługuje transakcje i przy
  1. <?php
  2. $db = NewADOConnection("mysql"); //w ADOdb
  3. ?>


Jeszcze raz dzięki wszystkim za pomoc
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.