Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Wykrycie braku danych w pliku
Forum PHP.pl > Forum > Przedszkole
Szunaj85
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...
Daiquiri
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 smile.gif.
sadistic_son
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ć.
Daiquiri
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.
Fifi209
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ę?
toaspzoo
Jak kolega wyżej, explode zdziała cuda ;p
Szunaj85
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. sadsmiley02.gif Mógłbyś mi pokazać taki cud? snitch.gif
toaspzoo
$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 wink.gif
Szunaj85
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ć?
thek
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 ) );
Szunaj85
Jeszcze jedno pytanie. Jak za pomocą warunku if sprawdzić czy zmienna 1 jest większa o 1 od zmiennej 2?
Daiquiri
Nawet najgłupszym sposobem: jeżeli ($zmienna1 -1 == $zmienna2) ?
Fifi209
Cytat(Daiquiri @ 11.07.2011, 14:47:42 ) *
Nawet najgłupszym sposobem: jeżeli ($zmienna1 -1 == $zmienna2) ?


01:03 - 1 == 02:04

Jestem ciekaw. ;]
Daiquiri
Nie podał szczegółów co do jednostek smile.gif.
thek
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 biggrin.gif
Szunaj85
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.
Fifi209
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 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
Daiquiri
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.
Szunaj85
Pomoże mi ktoś z moim nie rozwiązanym problemem? co_jest.gif
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.