dj.drezyna Posted June 15, 2012 Report Share Posted June 15, 2012 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 More sharing options...
sazian Posted June 16, 2012 Report Share Posted June 16, 2012 z pdo nie korzystam więc tu wiele nie pomogę ale nasuwa się jedno zasadnicze pytanie, a mianowicie jakiego silnika używasz ?? ponieważ trananzkcje są tylko w InnoDB Link to comment Share on other sites More sharing options...
dj.drezyna Posted June 17, 2012 Author Report Share Posted June 17, 2012 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 More sharing options...
Jason Posted June 17, 2012 Report Share Posted June 17, 2012 Polecam SQLite. Link to comment Share on other sites More sharing options...
sazian Posted June 17, 2012 Report Share Posted June 17, 2012 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 More sharing options...
dj.drezyna Posted June 17, 2012 Author Report Share Posted June 17, 2012 Dzięki! Czyli już zaczynam jarzyć. No więc wszystkie polecenia execute muszę sprawdzić czy są true i jeśli nie wszystkie to zrobić rollback. O to chodzi? P.S. Pytam się bo nie zrobiłem na to testu ale wydaje mi się że zrozumiałem(?) Galeria przyrodnicza http://fotokrajobrazy.warmia.pl Link to comment Share on other sites More sharing options...
Jason Posted June 17, 2012 Report Share Posted June 17, 2012 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 More sharing options...
sazian Posted June 17, 2012 Report Share Posted June 17, 2012 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 More sharing options...
dj.drezyna Posted June 18, 2012 Author Report Share Posted June 18, 2012 To teraz wszystko jest dla mnie jasne. Dziękuję Wam bardzo za szybkie i jasne wyjaśnienie tego problemu. Pozdrawiam i dziękuję serdecznie! Galeria przyrodnicza http://fotokrajobrazy.warmia.pl Link to comment Share on other sites More sharing options...
Recommended Posts
Archived
This topic is now archived and is closed to further replies.