![]() ![]() |
Post
#1
|
|
|
Grupa: Zarejestrowani Postów: 80 Pomógł: 0 Dołączył: 27.05.2009 Ostrzeżenie: (0%)
|
witajcie,
Męczę formularz rejestracyjny. W jakis posób wydać komendę rolback korzystając z takiego przykładu $wynik=$dbh->exec("INSERT INTO xxxx (xxxx, xx,xxxx) VALUES ('xxx','$xxx','$id_xxx')"); wysyłanie maila { //ok } else //awaria { rolback kod u góry print('Fail'); } |
|
|
|
Post
#2
|
|
|
Grupa: Zarejestrowani Postów: 167 Pomógł: 2 Dołączył: 1.07.2009 Skąd: Poznań Ostrzeżenie: (0%)
|
jeżeli wstawiasz zmienne w zapytaniu to musisz robić w cudzysłowiach czyli tak:
lub takie sposoby:
lub
|
|
|
|
Post
#3
|
|
|
Grupa: Zarejestrowani Postów: 80 Pomógł: 0 Dołączył: 27.05.2009 Ostrzeżenie: (0%)
|
Kod <?php $dbh->beginTransaction(); $wynik=$dbh->exec("INSERT INTO xxxx (xxxx, xx,xxxx) VALUES ("xxx","$xxx","$id_xxx")"); wysyłanie maila { //ok $dbh->commit(); } else //awaria { $dbh->rollBack(); print('Fail'); } ?> Czy tak posługuje się komendą roolBack ? Ten post edytował ahold 1.07.2009, 16:36:29 |
|
|
|
Post
#4
|
|
|
Grupa: Moderatorzy Postów: 15 467 Pomógł: 1451 Dołączył: 25.04.2005 Skąd: Szczebrzeszyn/Rzeszów |
A nie mogłeś sprawdzić? (IMG:http://forum.php.pl/style_emoticons/default/tongue.gif)
|
|
|
|
Post
#5
|
|
|
Grupa: Zarejestrowani Postów: 80 Pomógł: 0 Dołączył: 27.05.2009 Ostrzeżenie: (0%)
|
Pytam, czy dobrze kombinuje.
Mój pierwszy pomysł, polegał na DELETE from xxx jeżeli wysłanie maila się "nie powiedzie", ale przypomniała mi się funkcja roolback. Tylko nie wiem, czy pozwala ona na wykorzystanie w wypadku innego wyjątku, takiego "mojego". Wiem że pisana była pod kontem wielo zapytań do serwera SQL typu odejmij xxx z konta y, dodaj xxx na konto x. Jeżeli się nie powiedzie, roolback. Nigdy nie miałem doczynienia z tym, w wypadku innej funkcji. Zaraz się, przekonamy kolego ! |
|
|
|
Post
#6
|
|
|
Grupa: Zarejestrowani Postów: 231 Pomógł: 22 Dołączył: 6.10.2008 Ostrzeżenie: (0%)
|
Aby użyć rollback najpierw musisz rozpocząć transakcje. Jeśli zrobisz coś takiego
$dbh->exec("INSERT INTO xxxx (xxxx, xx,xxxx) VALUES ("xxx","$xxx","$id_xxx")"); gdzie w exec nie ma transakcji to doda ci do bazy to co chciałeś. Transaction, Rollback, Commit działa na bazie danych a nie w php chyba że ktos napisał własna metodę która działa na poziomie php http://dev.mysql.com/doc/refman/5.0/en/commit.html Napisz z jakiego konektora kozystasz do łączenia z bazą (PDO etc). |
|
|
|
Post
#7
|
|
|
Grupa: Zarejestrowani Postów: 6 381 Pomógł: 1116 Dołączył: 30.08.2006 Ostrzeżenie: (0%)
|
Powiedzcie mi czemu ludzie nie raczą nigdy zajrzeć do dokumentacji?
http://pl2.php.net/manual/en/pdo.transactions.php @fender: kod jaki podaje ahold jest tylko w PDO (no i w nowym sqlite dla php 5.3 z którego pewnie nie korzysta). Ten post edytował viking 2.07.2009, 12:21:37 |
|
|
|
Post
#8
|
|
|
Grupa: Zarejestrowani Postów: 231 Pomógł: 22 Dołączył: 6.10.2008 Ostrzeżenie: (0%)
|
masz racje
|
|
|
|
Post
#9
|
|
|
Grupa: Zarejestrowani Postów: 80 Pomógł: 0 Dołączył: 27.05.2009 Ostrzeżenie: (0%)
|
Niestety, nie mogę dojść do tego.
Korzystam z PDO. Czy faktycznie nie ma tam funkcji, do cofnięcia zmian w MySQL w sytuacji kiedy PHP napotka na błąd ? Tzn, ja napotkam błąd w kodzie, i chcę wycofać zmiany. |
|
|
|
Post
#10
|
|
|
Grupa: Zarejestrowani Postów: 79 Pomógł: 7 Dołączył: 2.07.2005 Skąd: Lublin Ostrzeżenie: (0%)
|
Powiedzcie mi czemu ludzie nie raczą nigdy zajrzeć do dokumentacji? http://pl2.php.net/manual/en/pdo.transactions.php Autorowi nie do końca o to chodzi. Czy faktycznie nie ma tam funkcji, do cofnięcia zmian w MySQL w sytuacji kiedy PHP napotka na błąd ? W sumie dobre pytanie. Rollback jest wykonywany na wskutek przechwycenia wyjątku, który wyrzuca adapter, wskutek błędu, który wyrzuca baza... Nigdy w sumie nie miałem takiego problemu, aby cofać zmiany jeśli kod php jest nieprawidłowy - nie można go przebudować? Ten post edytował omeck 7.07.2009, 14:28:41 |
|
|
|
Post
#11
|
|
|
Grupa: Zarejestrowani Postów: 80 Pomógł: 0 Dołączył: 27.05.2009 Ostrzeżenie: (0%)
|
Autorowi nie do końca o to chodzi. W sumie dobre pytanie. Rollback jest wykonywany na wskutek przechwycenia wyjątku, który wyrzuca adapter, wskutek błędu, który wyrzuca baza... Nigdy w sumie nie miałem takiego problemu, aby cofać zmiany jeśli kod php jest nieprawidłowy - nie można go przebudować? Dokładnie. Mi nie chodzi o doskonale opisaną metodę roolback w sytuacji kiedy jedna zapytanie na dwa, się nie powiedzie. Wtedy tam właśnie mamy przechwytywanie wyjątku, i roolback. Mi chodzi o prostą sytuację. Przykład 1) generuje użytkownikowi nowe hasło 2) dodaje do bazy danych 3) Wysyłam e-mail - zmieniłem Ci hasło Nastąpiła awaria bo wewnętrzny serwer smtp poleciał. Tak więc e-mail nie został wysłany. Łapie mi to wyjątek w php, odpowiedni w bibliotece stwierdzający awarie serwera if awaria { Wiadomość nie może być wysłana, serwer smtp leży. } I teraz trzeba cofnąć te zmianę w serwerze mysql, ponieważ, zmieniliśmy hasło, ale nie dotrze ono do użytkownika. Potrzebuję takie wywołanie if awaria { cofnij ostatnie zapytania, które były np po "begin trans action " } Naprawdę długo szukałem tego na Google, i wszędzie przykłady dotyczyły przechwytywania, błędów w zapytaniach. Czemu więc po prostu wywołanie roolback() nie odnosi sukcesu. Jeżeli ma prawo reagować na błąd w mysql to czemu nie może też php wywołać procedury cofania. |
|
|
|
Post
#12
|
|
|
Grupa: Zarejestrowani Postów: 79 Pomógł: 7 Dołączył: 2.07.2005 Skąd: Lublin Ostrzeżenie: (0%)
|
1) generuje użytkownikowi nowe hasło 2) dodaje do bazy danych 3) Wysyłam e-mail - zmieniłem Ci hasło Czy możliwa jest zamiana punktu 2 z 3? najpierw wysyłać maila, a potem jeśli się udało wykonać operacje na bazie? Naprawdę długo szukałem tego na Google, i wszędzie przykłady dotyczyły przechwytywania, błędów w zapytaniach. Czemu więc po prostu wywołanie roolback() nie odnosi sukcesu. Jeżeli ma prawo reagować na błąd w mysql to czemu nie może też php wywołać procedury cofania. Może taki mały hack - skoro wyłapałeś błąd w php, to wykonaj celowo jakieś złe zapytanie SQL - transakcja powinna to przechwycić i rollback powinien zadziałać. Przynajmniej tak mi się wydaje (IMG:http://forum.php.pl/style_emoticons/default/tongue.gif) Ten post edytował omeck 7.07.2009, 15:49:58 |
|
|
|
Post
#13
|
|
|
Grupa: Zarejestrowani Postów: 80 Pomógł: 0 Dołączył: 27.05.2009 Ostrzeżenie: (0%)
|
Kajam się i proszę o wybaczenie.
Dokładnie 6 godzin zajęło mi odnalezienie rozwiązania. Mianowicie jakiś ekspert położył tabelę w my_isami :/ Po zmianie na inno_db oczywiście ruszyło. Czy możliwa jest zamiana punktu 2 z 3? najpierw wysyłać maila, a potem jeśli się udało wykonać operacje na bazie? Może taki mały hack - skoro wylapaleś błąd w php, to wykonaj celowo jakieś zle zapytanie SQL - transakcja powinna to przechwycić i rollback powinien zadziałać Myślałem, powiedz czy dobrym rozwiązaniem jest dostać e-mail, z hasłem które nie działa ^^ Ale rozwiązaliśmy problem: Bo ruszyło, a ten kod który mam u góry jest poprawny. Nie działało, bo facet położył tabelę w my_isami. Wiesz, nie wpadło by mi do głowy żeby to sprawdzić. Teraz ruszyło. Działający example:
Tutaj mamy kod który generuje błąd.
|
|
|
|
Post
#14
|
|
|
Grupa: Zarejestrowani Postów: 231 Pomógł: 22 Dołączył: 6.10.2008 Ostrzeżenie: (0%)
|
Przecież właśnie zamieniłeś punkt 2 z 3 wykonałeś commit po tym jak sprawdziłeś czy poszedł mail !
mogłeś zrobić tak: Kod if($mail->Send()){ $dbh->exec($zapytanie); } else{ echo "Awaria !"; } myślenie nie boli Ten post edytował fander 7.07.2009, 18:01:16 |
|
|
|
Post
#15
|
|
|
Grupa: Zarejestrowani Postów: 80 Pomógł: 0 Dołączył: 27.05.2009 Ostrzeżenie: (0%)
|
Wykonałem commit zapytania które się udało wykonać. Na tym przykładnie źle to widać, no ale cóż.
To zły przykład na 1 pliku, ale w inftastrukturze xxxx users, od razu zmiana musi zostać zapisana, inaczej ktoś ją nam po prostu nadpisze. I zaczną się jaja. Trzeba brać pod uwagę nie tylko awarię serwera smtp, ale równiez mysql który jest osobną maszyną. |
|
|
|
![]() ![]() |
|
Aktualny czas: 20.12.2025 - 13:06 |