Jump to content

Transakcje w PDO


dj.drezyna

Recommended Posts

Chciałbym robić transakcje w pdo, tzn. że chciałbym uzyskać efekt zadziałania wszystkich zapytań jednak jeżeli jakieś nie wykona się poprawnie to żeby nic się nie wykonało

{ require 'baza.php'; } //Ustawienia bazy danych;
$dsn = 'mysql:dbname='.$ini_baza.';host='.$ini_host;
try {
$polbazy = new PDO($dsn,$ini_uzytk,$ini_haslo);
}
catch (PDOException $e) {
echo 'Nie można się połaczyć: ' . $e->getMessage();
}
$polbazy->exec("SET NAMES latin2");
$polbazy->beginTransaction();
$stmt = $polbazy->prepare("insert into test_pdo (tekst) values (?)");
$stmt->execute(array("abbbb"));
$stmt = $polbazy->prepare("insert into test_pdo (tekst) values (?)");
$stmt->execute(array("grgrtrt"));
$polbazy->commit();

W powyższym przypadku kiedy zmienię w drugim poleceniu insert into na błędne 'insr t in to' to niestety efekt jest taki, że wykona się instrukcja pierwsza druga nie a przecież miały się wykonać obie lub żadna.

 

Zatem co robię nie tak?

Galeria przyrodnicza http://fotokrajobrazy.warmia.pl

Link to comment
Share on other sites

Dzięki za odpowiedź!

 

Otóż ta tabela jest na innoDB. Ale działa tak jak opisałem wcześniej, czyli nie działa jak prawdziwa transakcja. Pomyślałem sobie że może to przez to że jest błąd w składni i baza uważa, za niezaistniałe polecenie drugie?

 

A z czego korzystasz? Jest coś lepszego od PDO?

 

Poza tym co by się działo na MyISAM? Czy polecenia wykonałby się czy byłby błąd w postaci braku obsługi transakcji i żadne by się nie wykonało?

 

Pozdrawiam serdecznie i dziękuję!

Galeria przyrodnicza http://fotokrajobrazy.warmia.pl

Link to comment
Share on other sites

ok tylko że SQLite to system bazodanowy a PDO to interfejs. Mi osobiście najbardziej podchodzi mysqli.

 

A wracając do pytania, przepraszam coś nie doczytałem. Zachowanie jest jak najbardziej prawidłowe.

Wywołujesz takie zapytania

<pre class="programlisting">START TRANSACTION; <-- start transakcji INSERT INTO test_pdo VALUES("aaaaaa");  <--prawidłoweINSERT INTO test_pdo2 VALUES("aaaaaa");  <--błędne, nie ma tabeliCOMMIT; <-- zatwierdź zmiany </pre>

teraz widzisz co się dzieje ? mimo że jest błąd zatwierdzasz zamiany przez commit. Jeśli wystąpi błąd powinien być rollback żeby wycofać zmiany.

Poza tym nie wiem czy autocommit nie będzie tu przeszkadzał ale pewności nie mam

Link to comment
Share on other sites

Jak coś jest nie tak, to po prostu nie wykonujesz commit :)

 

Jak korzystałem z SQLite, to gdy wprowadzałem niepoprawne zapytanie, to Py(język zakazany na forum przez Nakiela) wyrzucał mi wyjątek, np. selec zamiast select:

sqlite3.OperationalError: near "selec": syntax error

To wszystko można wyłapać w try... catch. Gdy coś jest nie tak, to sobie w catch np. jakiegoś boola ustawiasz na true. Jeśli po wszystkich operacjach będzie on false, to dajesz commit, w przeciwnym razie dajesz użytkownikowi komunikat, że operacja się nie powiodła.

Link to comment
Share on other sites

nie wiem jak pdo ale standardowe funkcje w php nie rzucają wyjątków i trzeba sprawdzać kod błędu - jeśli jest zero to wszystko ok, w przeciwnym przypadku jest jakiś błąd.

Jeśli po wszystkich operacjach będzie on false, to dajesz commit, w przeciwnym razie dajesz użytkownikowi komunikat, że operacja się nie powiodła.

 

komunikat i rollback

Link to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.

×
×
  • Create New...