dj.drezyna Napisano Czerwiec 15, 2012 Zgłoś Share Napisano Czerwiec 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 do komentarza Udostępnij na innych stronach More sharing options...
sazian Napisano Czerwiec 16, 2012 Zgłoś Share Napisano Czerwiec 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 do komentarza Udostępnij na innych stronach More sharing options...
dj.drezyna Napisano Czerwiec 17, 2012 Autor Zgłoś Share Napisano Czerwiec 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 do komentarza Udostępnij na innych stronach More sharing options...
Jason Napisano Czerwiec 17, 2012 Zgłoś Share Napisano Czerwiec 17, 2012 Polecam SQLite. Link do komentarza Udostępnij na innych stronach More sharing options...
sazian Napisano Czerwiec 17, 2012 Zgłoś Share Napisano Czerwiec 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 do komentarza Udostępnij na innych stronach More sharing options...
dj.drezyna Napisano Czerwiec 17, 2012 Autor Zgłoś Share Napisano Czerwiec 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 do komentarza Udostępnij na innych stronach More sharing options...
Jason Napisano Czerwiec 17, 2012 Zgłoś Share Napisano Czerwiec 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 do komentarza Udostępnij na innych stronach More sharing options...
sazian Napisano Czerwiec 17, 2012 Zgłoś Share Napisano Czerwiec 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 do komentarza Udostępnij na innych stronach More sharing options...
dj.drezyna Napisano Czerwiec 18, 2012 Autor Zgłoś Share Napisano Czerwiec 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 do komentarza Udostępnij na innych stronach More sharing options...
Polecane posty
Zarchiwizowany
Ten temat jest archiwizowany i nie można dodawać nowych odpowiedzi.