![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 76 Pomógł: 0 Dołączył: 8.01.2009 Ostrzeżenie: (0%) ![]() ![]() |
Chcę wykonać zapytanie do bazy i utworzyć katalog.
Chcę żeby wykonały się oba polecenia albo żadne. Myślałem o transakcjach, ale nigdy z nich nie korzystałem. Czy mogłby ktoś napisać w jaki sposób one działają, albo znacie może inne przykład? |
|
|
![]()
Post
#2
|
|
![]() Grupa: Zarejestrowani Postów: 274 Pomógł: 54 Dołączył: 2.05.2006 Skąd: Nadarzyn Ostrzeżenie: (0%) ![]() ![]() |
Kod $query = 'twoje zapytanie'; if(mysql_query($query)) mkdir('katalog'); katalog doda sie tylko jezeli mysql_query nie zwróci false. Ten post edytował Rafal Filipek 20.02.2009, 22:55:08 |
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 411 Pomógł: 35 Dołączył: 27.06.2004 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
No tak tylko, co w przypadku gdy katalog nie zostanie stworzony? Zapytanie już zostało wykonane, a nie powinno. Tego się nie da zrobić w prosty sposób.
-------------------- |
|
|
![]()
Post
#4
|
|
![]() Grupa: Zarejestrowani Postów: 274 Pomógł: 54 Dołączył: 2.05.2006 Skąd: Nadarzyn Ostrzeżenie: (0%) ![]() ![]() |
no tak troche sie pospieszyłem ale nadal nie jest to problem
![]() Kod $query = 'zapytanie';
if(mkdir('katalog')){ if(!mysql_query($query)){ rmdir('katalog'); } } Ten post edytował Rafal Filipek 20.02.2009, 23:20:11 |
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 76 Pomógł: 0 Dołączył: 8.01.2009 Ostrzeżenie: (0%) ![]() ![]() |
Włąśnie o to mi chodziło
Dziękuje bardzo <piwo> |
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 411 Pomógł: 35 Dołączył: 27.06.2004 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
Ale to ciągle nie jest atomowa operacja.
Przeanalizujemy taką sytuację: 1)Folder jest tworzony 2)Zapytanie się nie udało (bo np jest chwilowo za bardzo obciążona maszyna) 3)Skoro jest obciążona to jest bardzo prawdopodobne, że nie będzie się dało też skasować folderu Folder pozostaje choć nie powinno go być, bo zapytanie było nieudane. Jeszcze raz powtórzę: to nie jest takie proste. -------------------- |
|
|
![]()
Post
#7
|
|
Grupa: Zarejestrowani Postów: 76 Pomógł: 0 Dołączył: 8.01.2009 Ostrzeżenie: (0%) ![]() ![]() |
Niestety nie działa to ponieważ gdy nie uda się stworzyć katalogu (np. istnieje juz taki o podanej nazwie)
To w bazie danych rekord się zapisze. Słyszałem o transakcjach w mysql to znaczy że pisze się w bloku kilka operacji i mysql albo wykona wszystkie albo nie wykona żadnej. Ale niestety ie wiem czy jest coś takiego w php. |
|
|
![]()
Post
#8
|
|
![]() Grupa: Zarejestrowani Postów: 274 Pomógł: 54 Dołączył: 2.05.2006 Skąd: Nadarzyn Ostrzeżenie: (0%) ![]() ![]() |
Cytat Niestety nie działa to ponieważ gdy nie uda się stworzyć katalogu (np. istnieje juz taki o podanej nazwie) To w bazie danych rekord się zapisze. kod ktory podalem nie doda rekordu jezeli nie stworzy katalogu. mozesz sobie ewentualnie dodac jeszcze w pierwzym if sprawdzenie czy katalog istnieje zanim go stworzysz. naturalnie to co pisze legorek zgadza sie dlatego napisz nam te jakie moga byc przyczyny niepowodzenia ? |
|
|
![]()
Post
#9
|
|
Grupa: Zarejestrowani Postów: 316 Pomógł: 36 Dołączył: 2.04.2008 Ostrzeżenie: (0%) ![]() ![]() |
Ten post Rafała Filipka prawdę ci powie. Kod jest dobry. Tylko nie zapomnij na samym początku - w sensie przed wykonaniem zapytań - wyłączyć autocommit:
Kod $uchwyt_polaczenia_z_baza -> autocommit(false); //a później $uchwyt_polaczenia_z_baza -> autocommit(true); Cytat Słyszałem o transakcjach w mysql to znaczy że pisze się w bloku kilka operacji i mysql albo wykona wszystkie albo nie wykona żadnej. I właśnie po to jest ten autocommit :] . |
|
|
![]()
Post
#10
|
|
![]() Grupa: Zarejestrowani Postów: 274 Pomógł: 54 Dołączył: 2.05.2006 Skąd: Nadarzyn Ostrzeżenie: (0%) ![]() ![]() |
@230005 zapomniales chyba dodac ze to o czym piszesz i ten autocomit to tyczy sie przypadku gdy korzystamy z mysqli ajest to dosc istotna roznica.
|
|
|
![]()
Post
#11
|
|
Grupa: Zarejestrowani Postów: 316 Pomógł: 36 Dołączył: 2.04.2008 Ostrzeżenie: (0%) ![]() ![]() |
Fakt, mój błąd :/
|
|
|
![]()
Post
#12
|
|
![]() Grupa: Zarejestrowani Postów: 677 Pomógł: 89 Dołączył: 31.08.2003 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
Transakcje są w MySQL, ale nie działają na tabelach MyISAM (więc trzeba sobie w razie konieczności skonwertować np. na InnoDB).
Przykładowa transakcja w pseudokodzie: Kod query('START TRANSACTION'); try { // tu zapytania SQL } exception { // tu akcje do wykonania, jeśli co najmniej jedno z zapytań SQL się nie powiedzie query('ROLLBACK'); return; // lub break } // tu akcje do wykonania, jeśli wszystkie zapytania się powiodą query('COMMIT'); Oczywiście wymagana jest klasa dostępu do MySQLa zwracająca błędy jako wyjątki. Ten post edytował mls 21.02.2009, 10:52:45 -------------------- |
|
|
![]()
Post
#13
|
|
![]() Grupa: Zarejestrowani Postów: 6 476 Pomógł: 1306 Dołączył: 6.08.2006 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
MySQL obsługuje transakcje, ale czy Twój system plików też?
PS. Dlaczego, katalog miałby się nie tworzyć? |
|
|
![]()
Post
#14
|
|
![]() Grupa: Przyjaciele php.pl Postów: 5 724 Pomógł: 259 Dołączył: 13.04.2004 Skąd: N/A Ostrzeżenie: (0%) ![]() ![]() |
A moze kolega nie potrzebuje az tak idealnych transakcji?
-------------------- Nie lubię jednorożców.
|
|
|
![]()
Post
#15
|
|
Grupa: Zarejestrowani Postów: 76 Pomógł: 0 Dołączył: 8.01.2009 Ostrzeżenie: (0%) ![]() ![]() |
Cytat $query = 'zapytanie'; if(mkdir('katalog')){ if(!mysql_query($query)){ rmdir('katalog'); } } Wykorzystałem ten kod, dodałem tylko sprawdzenie czy katalog już istnieje, bo wcześniej jak już istniał to miałem błąd. I wszystko ok. Dzięki |
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 14.08.2025 - 02:46 |