Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP]Wykrycie braku danych w pliku
Szunaj85
post
Post #1





Grupa: Zarejestrowani
Postów: 392
Pomógł: 7
Dołączył: 11.05.2008

Ostrzeżenie: (0%)
-----


Mam skrypt, który za pomocą Crona co godzinę zapisuje mi pewne dane do pliku razem z aktualną datą i godziną.
Jednak zawsze coś może się zdarzyć i serwer może nie działać.
Na przykładzie widać, że brakuje zapisu z godziny 3 i 4.
Gdy serwer znów zacznie działać jak wykryć przy pomocy PHP brak tych zapisów i uzupełnić je razem z treścią "błąd" tak jak na drugim przykładzie?
Kod
09.07.2011, 00:00, treść
09.07.2011, 01:00, treść
09.07.2011, 02:00, treść
09.07.2011, 05:00, treść
09.07.2011, 06:00, treść
itd...

Kod
09.07.2011, 00:00, treść
09.07.2011, 01:00, treść
09.07.2011, 02:00, treść
09.07.2011, 03:00, błąd
09.07.2011, 04:00, błąd
09.07.2011, 05:00, treść
09.07.2011, 06:00, treść
itd...
Go to the top of the page
+Quote Post
Daiquiri
post
Post #2





Grupa: Administratorzy
Postów: 1 552
Pomógł: 211
Dołączył: 7.07.2009
Skąd: NJ




A nie możesz po prostu przy dodawaniu kolejnego rekordu sprawdzać, czy poprzedni jest o jeden mniejszy? I jeżeli nie, to sprawdzać do momentu aż będzie i dopiero zacząć kolejny uzupełnianie? Chyba, że coś mi umyka (IMG:style_emoticons/default/smile.gif) .
Go to the top of the page
+Quote Post
sadistic_son
post
Post #3





Grupa: Zarejestrowani
Postów: 1 495
Pomógł: 245
Dołączył: 1.07.2009
Skąd: Bydgoszcz

Ostrzeżenie: (0%)
-----


Przecież kolega nie dodaje tego do bazy tylko do plików, więc skąd mowa o rekordach ?!
Moim zdaniem najprościej byłoby podzielić explodem zawartość całego pliku według znaków końca linii. To da Ci każdy wpis w oddzielnym elemencie tablicy. Następnie każdy z nich dzielisz względem przecinka i sprawdzasz czy $element[1] z danej linii jest większy o 1 od poprzedniego.

PS. A tak na marginesie to bazą danych byłoby zdecydowanie łatwiej to rozwiązać.

Ten post edytował sadistic_son 9.07.2011, 12:28:23
Go to the top of the page
+Quote Post
Daiquiri
post
Post #4





Grupa: Administratorzy
Postów: 1 552
Pomógł: 211
Dołączył: 7.07.2009
Skąd: NJ




Rekord rozumiany jako wpis. Serio, czy to było nie do wyłapania? Bez przesady. Pytanie było raczej teoretyczne (algorytmiczne), zważywszy na brak jakiegokolwiek kodu.
Go to the top of the page
+Quote Post
Fifi209
post
Post #5





Grupa: Zarejestrowani
Postów: 4 655
Pomógł: 556
Dołączył: 17.03.2009
Skąd: Katowice

Ostrzeżenie: (0%)
-----


Cytat(sadistic_son @ 9.07.2011, 13:27:10 ) *
Moim zdaniem najprościej byłoby podzielić explodem zawartość całego pliku według znaków końca linii. To da Ci każdy wpis w oddzielnym elemencie tablicy.

Równie dobrze możesz wczytać poprzez file chyba, że się mylę?
Go to the top of the page
+Quote Post
toaspzoo
post
Post #6





Grupa: Zarejestrowani
Postów: 778
Pomógł: 84
Dołączył: 29.07.2010
Skąd: Gliwice / Pławniowice Mistrz niezmordowanej klawiatury.

Ostrzeżenie: (20%)
X----


Jak kolega wyżej, explode zdziała cuda ;p
Go to the top of the page
+Quote Post
Szunaj85
post
Post #7





Grupa: Zarejestrowani
Postów: 392
Pomógł: 7
Dołączył: 11.05.2008

Ostrzeżenie: (0%)
-----


Cytat
Moim zdaniem najprościej byłoby podzielić explodem zawartość całego pliku według znaków końca linii. To da Ci każdy wpis w oddzielnym elemencie tablicy.
Cytat
Jak kolega wyżej, explode zdziała cuda ;p
Zajrzałem do manuala, ale i tak sobie z tym nie radze. (IMG:style_emoticons/default/sadsmiley02.gif) Mógłbyś mi pokazać taki cud? (IMG:style_emoticons/default/snitch.gif)
Go to the top of the page
+Quote Post
toaspzoo
post
Post #8





Grupa: Zarejestrowani
Postów: 778
Pomógł: 84
Dołączył: 29.07.2010
Skąd: Gliwice / Pławniowice Mistrz niezmordowanej klawiatury.

Ostrzeżenie: (20%)
X----


$linia = explode("\n", $plik);
wpisuje do zmiennej każdą nową linię jako $linia[0,1,2,3] itd.

explode służy poniekąd do znajdowania (IMG:style_emoticons/default/wink.gif)

Ten post edytował toaspzoo 10.07.2011, 17:01:43
Go to the top of the page
+Quote Post
Szunaj85
post
Post #9





Grupa: Zarejestrowani
Postów: 392
Pomógł: 7
Dołączył: 11.05.2008

Ostrzeżenie: (0%)
-----


Cytat
Następnie każdy z nich dzielisz względem przecinka i sprawdzasz czy $element[1] z danej linii jest większy o 1 od poprzedniego.
Teoretycznie tak chciałem zrobić. Jednak choć prawdopodobieństwo wystąpienia takiego scenariusza jest dość małe trzeba wziąć pod uwagę, że skrypt uruchomi się o północy i wtedy nie będzie miał poprzedniego elementu mniejszego tylko większego. Co wtedy zrobić?
Go to the top of the page
+Quote Post
thek
post
Post #10





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




Skrypt odpalany sobiesprawdza ostatnia linijkę i według niej decyduje co robić. Złapie, że ostatnia linijka wykonana wiecej niż godzinę temu to dopisze brakujące z errorem.
  1. $file = file( $nazwa_pliku );
  2. $last_line = end( $file );
  3. //tu sobie robisz co chcesz, sprawdzasz, kombinujesz, dodajesz braki
  4. $file[] = $nowa_linijka;
  5. file_put_contents( $nazwa_pliku, implode( PHP_EOL, $file ) );
Go to the top of the page
+Quote Post
Szunaj85
post
Post #11





Grupa: Zarejestrowani
Postów: 392
Pomógł: 7
Dołączył: 11.05.2008

Ostrzeżenie: (0%)
-----


Jeszcze jedno pytanie. Jak za pomocą warunku if sprawdzić czy zmienna 1 jest większa o 1 od zmiennej 2?

Ten post edytował Szunaj85 11.07.2011, 13:41:19
Go to the top of the page
+Quote Post
Daiquiri
post
Post #12





Grupa: Administratorzy
Postów: 1 552
Pomógł: 211
Dołączył: 7.07.2009
Skąd: NJ




Nawet najgłupszym sposobem: jeżeli ($zmienna1 -1 == $zmienna2) ?
Go to the top of the page
+Quote Post
Fifi209
post
Post #13





Grupa: Zarejestrowani
Postów: 4 655
Pomógł: 556
Dołączył: 17.03.2009
Skąd: Katowice

Ostrzeżenie: (0%)
-----


Cytat(Daiquiri @ 11.07.2011, 14:47:42 ) *
Nawet najgłupszym sposobem: jeżeli ($zmienna1 -1 == $zmienna2) ?


01:03 - 1 == 02:04

Jestem ciekaw. ;]
Go to the top of the page
+Quote Post
Daiquiri
post
Post #14





Grupa: Administratorzy
Postów: 1 552
Pomógł: 211
Dołączył: 7.07.2009
Skąd: NJ




Nie podał szczegółów co do jednostek (IMG:style_emoticons/default/smile.gif) .
Go to the top of the page
+Quote Post
thek
post
Post #15





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




Fifi... Nie bądźmy upierdliwi. Wystarczy, że porównałby godzinę samą, bez minut i nie byłoby problemu. Nie twórzmy problemów na siłe (IMG:style_emoticons/default/biggrin.gif)
Go to the top of the page
+Quote Post
Szunaj85
post
Post #16





Grupa: Zarejestrowani
Postów: 392
Pomógł: 7
Dołączył: 11.05.2008

Ostrzeżenie: (0%)
-----


Cytat
Nie podał szczegółów co do jednostek smile.gif.

Czas rozłożyłem na czynniki pierwsze. Dlatego nie muszę się martwić o taką sytuację jaką podał Fifi209. Jednak dziękuję za czujność.

Chciałbym się jeszcze zapytać jak zrobić coś takiego.
Cały czas bazuje na poniższym przykładzie.
Kod
09.07.2011, 00:00, treść
09.07.2011, 01:00, treść
09.07.2011, 02:00, treść
09.07.2011, 03:00, błąd
09.07.2011, 04:00, błąd
09.07.2011, 05:00, treść
09.07.2011, 06:00, treść
itd...
Jak skrypt wykryje, że brakuje poprzedniej godziny to oblicza jaka jest ilość brakujących godzin (różnica między aktualną a zapisaną godziną) i tą ilość zapisze do zmiennej. Z tym raczej nie będzie problemu...
Poniżej mam skrypt, który wyświetla tekst tyle razy ile wynosi zmienna.
  1. $a=2;
  2. for($i=0;$i<$a;$i++)
  3. {
  4. echo '09.07.2011, 00:00, błąd';
  5. }
Załóżmy, że skrypt wykonuje się o godzinie 5. Wykrył, że ostatnia zapisana godzina to 2. Jak w tej pętli w tekście zamiast "00:00" wpisać poprzednią godzinę i jeszcze poprzednią czyli 3 i 4 żeby wynik wynosił...
Kod
09.07.2011, 03:00, błąd
09.07.2011, 04:00, błąd
Oczywiście wszystko musi zależeć od tego ile wynosi zmienna.

Ten post edytował Szunaj85 12.07.2011, 10:01:34
Go to the top of the page
+Quote Post
Fifi209
post
Post #17





Grupa: Zarejestrowani
Postów: 4 655
Pomógł: 556
Dołączył: 17.03.2009
Skąd: Katowice

Ostrzeżenie: (0%)
-----


Cytat(thek @ 11.07.2011, 15:13:26 ) *
Fifi... Nie bądźmy upierdliwi. Wystarczy, że porównałby godzinę samą, bez minut i nie byłoby problemu. Nie twórzmy problemów na siłe (IMG:style_emoticons/default/biggrin.gif)

Skoro autor zapytał to pewnie nie wiedział, skoro Daiquiri daje "rozwiązanie" to niech daje takie, które pomoże autorowi. Bo tyle to i sam autor mógł wymyślić i pewnie by nie pytał.

@edit
Poza tym, 00:00 - 01:00, to nie jest -01:00

Ten post edytował Fifi209 12.07.2011, 10:55:52
Go to the top of the page
+Quote Post
Daiquiri
post
Post #18





Grupa: Administratorzy
Postów: 1 552
Pomógł: 211
Dołączył: 7.07.2009
Skąd: NJ




Fifi209, tworzysz problemy których nie ma. Uważam, że każdy kto szuka pomocy, powinien jak najdokładniej opisać swój problem. Im mniejsza dokładność w opisie problemu - tym bardziej ogólnikowe rozwiązanie. Autor nie wrzucił listingu z tego, w jaki sposób zaaranżował zbieranie danych. Jasne, że w grę może wchodzić dodatkowy zestaw warunków, ale to chyba już leży w gestii osoby, która bawi się w kodowanie. Z mojej strony to tyle, na temat tworzącego się OT.
Go to the top of the page
+Quote Post
Szunaj85
post
Post #19





Grupa: Zarejestrowani
Postów: 392
Pomógł: 7
Dołączył: 11.05.2008

Ostrzeżenie: (0%)
-----


Pomoże mi ktoś z moim nie rozwiązanym problemem? (IMG:style_emoticons/default/co_jest.gif)
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 19.09.2025 - 04:36