Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: PHP + MSSQL + Transakcja
Forum PHP.pl > Forum > Bazy danych > Microsoft SQL Server / MSDE
peyn
Witajcie

Mmam takie cos:
  1. <?php
  2.  
  3. $q = &#092;"BEGIN TRANSACTION Tran;\";
  4. $q.= &#092;"Insert into tabela (pole) values ('1');\";
  5. mssql_query($q);
  6.  
  7. $m = mssql_get_last_message();
  8.  
  9. if ($m == '') 
  10. {
  11. mssql_query(&#092;"COMMIT TRANSACTION Tran;\");
  12. }
  13. else
  14. {
  15. mssql_query(&#092;"ROLLBACK TRANSACTION Tran;\");
  16. };
  17.  
  18. ?>


I teraz tak, w tabeli mam klucz na ta kolumne uniemozliwiajacy wpisanie powtornie tej samej wartosci. Mam tam tez juz jeden rekord z wartoscia '1'. A wiec wykonanie tego zapytania zwroci blad. I rzeczywiscie zwraca, problem jedynie w tym ze get_last_message mi go nie zwraca :-(

Moje pytanie: czy ktos juz przerabial transakcje w php + mssql? Jakie jest na to rozwiazanie? biggrin.gif
radzaw
zauwaz, ze mssql_query zwraca FALSE w przypadku bledu, czyli

$m = mssql_query($query);
if ($m == FALSE) ...
zalew
zabierasz sie za porzadna baze danych, zeby jej dzialanie kontrolowac warunkami w inerfejsie?
nie po to wymyslono transakcje, zeby przerzucac zwyklego 'if zapytanie sie udalo' na interfejs..
peyn
radzaw: no wiem wiem, ale jednoczesnie zwraca tez bledy na strone / do loga (zalezy jak kto sobie ustawi) i chyba przez to nie moge pozniej wyslac zadnego headera (glownie chodzi mi o location).

Prawde mowiac nie wiem na 100% czy to to, ale tak wnioskuje, w kazdym razie nic na strone nie wywalam, wysylane sa jedynie bledy do loga, a header nie idzie wiec podejrzewam ze to to.

zalew: wiem ze mozna to zrobic na bazie ale akurat w tym wypadku potrzebuje zeby skrypt wiedzial czy sie powiodlo czy nie. IMHO bez sensu by bylo zebym sprawdzal na bazie czy sie powiodlo czy nie, robil rollbacka albo commita w zaleznosci od wyniku, pozniej zwracal wynik i jeszcze raz w php bym sprawdzal wynik i np wyswietla tak lub nie. Tzn tak mi sie wydaje ale moze masz jakis fajowy pomysl to wal smialo biggrin.gif
zalew
podstawowa zasada: baza to baza, interfejs to interfejs. wszystkie zadania, ktore naleza do bazy danych powinno sie wykonywac za jej pomoca w miare mozliwosci, ana mozliwosci m$ nie ma co narzekac..
akurat szczerze nie wiem co ty chcesz zrobic poza tym, ze sprawdzic czy insert sie udal.. ale uzaleznianie operacji bazy od ifa w interfejsie - wg mnie od dupy strony

napisze jak ja bym to zrobil przykladowo, jesli dobrze cie rozumiem
  1. CREATE FUNCTION insertmydata (integer, text) returns BOOLEAN AS '
  2. begin insert into mytable (id, comment) values ($1, $2);
  3. if (@@ROW_COUNT>0) then
  4. return true;
  5. else
  6. return false;
  7. end if;
  8. end;'

(skladnia moze byc do poprawienia w ktoryms miejscu, bo ostatnio w pgsqlu siedze glownie)

wywolujesz ta funkcje i albo ci wstawi do bazy albo zwroci false..
potem
  1. <?php
  2. if ($function) {
  3. //zrob costam
  4. } else {
  5. //zrob co innego, wroc do forumalrza, nie wiem..
  6. }
  7. ?>



wiesz, masz tyle mozliwosci po stronie bazy zeby kontorlowac wpisanie rekordu, zalozyc trigger tkory to sprawdzi i zincrementuje id albo odrzuci transakcje, zdefiniowana funkcje, ktora wszystko sprawdzi; ze nie rozumiem totalnie po co skladac ifami query po stronie php.. troche jak poczakujace mysqlowanie (imo, bez urazy)..
peyn
Hmm, nie ma problemu, konstruktywna krytyka jest jak najbardziej wskazana, przynajmniej sie czegos naucze.

Co do tej procedury to w sumie rzeczywiscie chyba tak zrobie. Z tym ze po prostu dziabne jedna wielka procedure na bazie, do ktorej jako argument bede przesylal zapytanie bo tworzyc do kazdego zapytania nowa procedure to troche bez sensu.

Chyba ze zrobie w php funkcje ktora bedzie tylko tworzyla procedure na chwilke z podanym w paramterze zapytaniem biggrin.gif Sam juz nie wiem...

Co do triggerkow to ok jesli jest to robione na mojej tabeli. Natomiast pracujac na czyjejs tabeli musialbym ciagle sprawdzac czy przy ostatnim update'cie np ta osoba nie wywalila mojego trigerka albo nie zmienila czegos.

pozdrowienia
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.