Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: jak sprawdzić, czy był błąd
Forum PHP.pl > Forum > Bazy danych > PostgreSQL
DeyV
Mam zamiar przygotować ładny sposób wykonywania i kontrolowania zapytań postgres. Skoro korzysta się z PHP5, pasowałoby bowiem wykorzystywać Exeptions i pare innych mechanizmow, ktore się wraz z 5 dostaje.

Okazało się jednak, że bardzo szybko natrafiłem na problem, ktorego nie umiem w mądry sposób rozwiazać.

Chodzi o kody błędów, zwracane tylko przez funkcję pg_result_error_field" title="Zobacz w manualu PHP" target="_manual ()

Aby jednak móc z niej korzystać, konieczne jest otrzymanie resource z wynikiem zapytania, a takiego, w przypadku błędu w zapytaniu, funkcja pg_query" title="Zobacz w manualu PHP" target="_manual () nie zwraca (zamiast tego dając FALSE).

Zamiast niej manual online poleca pg_send_query" title="Zobacz w manualu PHP" target="_manual () (która zawsze zwraca true) a potem wyciągnąć resource przy pomocy pg_get_result" title="Zobacz w manualu PHP" target="_manual ()

No i OK - pg_get_result zawsze zwraca resource, teraz jednak jak mam sprawdzić, czy zapytanie się wykonało? Trochę dziwne wydaje mi się każdorazowe wyciąganie od bazy kodu błędu ( pg_result_error_field" title="Zobacz w manualu PHP" target="_manual () ) i sprawdzanie, czy jakiś błąd się pojawił.
Ale innego sposobu narazie nie udało mi się znaleść. Może w wiecie?


przykład w działaniu: (PHP5, pg8 )
  1. <?php
  2.  
  3. $bQuerySend = pg_send_query( $this->rConection, 'INSERT INTO NieIstniejacaTablea (name) values (test)' );
  4.  
  5. var_dum( $bQuerySend );
  6.  
  7. $rResult = pg_get_result( $this->rConection );
  8. var_dum( $rResult );
  9. $w = pg_result_error_field( $rResult, PGSQL_DIAG_SQLSTATE ). ' '. pg_result_error( $rResult );
  10. var_dum( $w );
  11.  
  12. ?>
SongoQ
resource zwraca Ci pg_query. Jesli wystapil blad zwraca false.
Sprawdzasz czy zwrocil false jestli tak to czytasz ostatni blad serwera, uwzgledniajac connection.

W taki to mniej wiecej sposob zrealizowalem.
DeyV
W poscie podałem, że nie jest to możliwe, ponieważ nie można wtedy wyciągnąć kodu błędu, gdyż ... zamiast resource otrzymaliśmy FALSE.

A kod błędu jest niezbędny, by móc rozpoznać np. dlaczego dany rekord się nie dodał (brak jakiegoś zewnętrznego klucza, lub ograniczenie zewnętrzne)

W każdym razie dzięki.
SongoQ
Przeciez tak jak Ci pisalem.

W manualu cos jest zle opisane pg_last_error().

  1. <?php
  2.  
  3. $resource = @pg_query($c, 'INSERT INTO s (s) VALUES ('b')');
  4.  
  5. ?>


Odpal sobie taki kod i zobacz ze Ci zwroci komunikat bledu.
DeyV
Komunikat błędu jest oczywiście wydobyć banalnie łatwo.
Ale ... zwróć mi w jakiś sposób KOD błędu, czyli to, co daje pg_result_error_field(), bez posiadania resource sad.gif
SongoQ
Cytat
Ale ... zwróć mi w jakiś sposób KOD błędu, czyli to, co daje pg_result_error_field(), bez posiadania resource


No niestety sie nie da.

  1. <?php
  2.  
  3. @pg_send_query($c, 'INSERT INTO s (s) VALUES ('b')');
  4. $res2 = pg_get_result($c); 
  5. echo pg_result_error_field($res2, PGSQL_DIAG_SQLSTATE);
  6.  
  7. ?>


Sprawdz to. Niestety nie mam dostepu do serwera z PHP5 z Postgresem.

DODANE:
Wsumie to powyzej masz to samo. Hm nie bardzo wiem czy da sie to jakos objesc nie wyciagajac za kazdym razem bledu z serwera.
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.