Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Transakcja a bledy
Forum PHP.pl > Forum > Bazy danych > PostgreSQL
mdudi
Witam!
Mam taki problem, ze w php pisze transakcje z update i na poziomie postgresql jest sprawdzane czy ten update moze wystapic jezeli nie wystapil to chce zeby na stronie wyswietlalo mi o tym informacje, w traksakcji funkcja pg_affected_rows() nie pomoze mi niestety. Ma ktos jakis pomysl jak sobie z tym poradzic??
SongoQ
Nie na pisales na jakiez zasadzie w PG sprawdzasz czy mozna zmodyfikowac rekord. Mozesz np zrobic trigger i wywalac blad i wtedy nie sprawdzasz ilosc zmodyfikowanych rekordow tylko czekasz na blad a jak blad to wiadomow wycofanie transakcji.
mdudi
Mam trigger ktory sprawdza przed kazdym update czy dana kwota znajduje sie na koncie uzytkownika jezeli nie to nie dochodzi do update. I teraz na stronie (czuli z php) chcialabym zeby wyswietlala sie informacja : Brak takiej sumy na koncie". Tylko nie wiem jak sprawdzic czy update nastapil czy nie.
SongoQ
Hm jesli trigger nie dopusci to update to niech wywala blad. Trigger przed dodaniem.
mdudi
Z tego co mi wiadomo komuniakt o bledzie zwraca RAISE EXCEPTION i przerywa transkacje, tylko ze jak dalam ta komende to na stronie wywalalo mi blad. I wlasnie nie wiem czy jest inna metoda iformujaca o bledach.
Zbłąkany
RAISE obsługuje następujące typy komunikatów:
  • DEBUG[1-5]
  • INFO
  • NOTICE
  • WARNING
  • LOG
  • EXCEPTION
Możesz wyrzucić dowolny typ, a w php przejąć to exception, bądź error handlerem. Polecałbym PDO bo ma opcję wyciszania błędów smile.gif .

Edit: Poprawiłem listę typów smile.gif
mdudi
A mozesz podac przyklad takiego przechwycenia bledu bo gubie sie w tych ang. materialach :/
Z gory dziekuje.
Zbłąkany
A poza tym pg_affected_rows() działa przy transakcjach smile.gif .
Dla PDO czy zwykłego sterownika?
mdudi
No tak dziala ale zwraca 0, bo on czyta tylko pierwszy wiersz a pierwszy wiersz to begin, w manualu nawet o tym pisza.
Dla zwyklego sterownika smile.gif.
Zbłąkany
Daj tak:
  1. <?php
  2. pg_query('BEGIN TRANSACTION;');
  3. pg_query('SET TRANSACTION ISOLATION LEVEL SERIALIZABLE READ WRITE');
  4. $q = pg_query('INSERT INTO ...;');
  5. if (pg_affected_rows($q) === 1) {
  6. pg_query('COMMIT TRANSACTION;');
  7. print 'tak';
  8. } else {
  9. pg_query('ROLLBACK TRANSACTION;');
  10. print 'nie';
  11. }
  12.  
  13. ?>

a na pewno pokaże czy zmodyfikował wiersz smile.gif .

A co do error handler to polecam to. Przejrzyj kod i przykłady, a zrozumiesz, jak działa error handler i jak napisać swój własny smile.gif
mdudi
Dzieki wielkie smile.gif.
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.