Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Jak uruchomić funkcję w miejscu, w którym skończyła działanie?
Forum PHP.pl > Forum > Przedszkole
AmyLokmart
Czy istnieje sposób uruchomienia do dalszej kontynuacji funkcji, która nagle zatrzymała swoje działanie w wyniku nieokreślonego błędu?

Zamierzenie jest takie: w pliku są wiersze z jakimś opisem. Każdy wiersz jest odczytywany do zmiennej, a ta z kolei do pętli.
W pętli każdy wiersz kolejno jest zapisywany do innego pliku z przyklejoną dodatkową zawartością.
Załóżmy, że tych wierszy jest 100, a funkcja po kolei je zapisuje i nagle zatrzymuje się na wierszu 50. Mimo wszystko chcę, aby po nieudanej próbie i zatrzymaniu funkcji na wierszu 50 funkcja przeszła do wiersza 51 i kontynuowała dalej swoje działanie. Na razie wychodzi mi, że funkcja po zatrzymaniu wraca na początek i zapisuje wszystko od nowa, ale wtedy mam zdublowane zawartości sad.gif

Jak ktoś miał taki problem lub zna rozwiązanie to proszę, o pomoc.

Bardzo Dziękuję😊
Tomplus
Jeżeli chcesz aby zaczynać działanie funkcji (a raczej pętli) od danej pozycji, to musisz zapisywać za każdym razem pozycję tuż przed wykonaniem przetwarzania.

Następnie po próbie ponownego wykonywania polecenia, wczytaj tą pozycję i pomiń wszystkie inne pozycje jakie były przed i rozpocznij od wartości wyższej niż zatrzymany indeks pozycji.
AmyLokmart
W pętli jest FUNKCJA, która po kolei ma zapisywać wiersze od 1 do 100 z dodatkową zawartością i w dodatku do innego pliku. Z tego powodu nie mogę zapisywać wiersza przed wykonaniem działania funkcji, ponieważ wtedy muszę znać każdy wiersz i oddzielnie go definiować, a potem porównywać, by funkcja przeszła dalej, gdyby natrafiła na błąd i się zatrzymała. Mowa jest, o 100 wierszach dla przykładu, ale tak naprawdę mam w pliku kilkaset tysięcy wierszy i definiowanie każdego z osobna zajęłoby mi całe życie chyba sad.gif
Funkcja jest w pętli z powodu powtarzalności i interpretacji kolejnych wierszy.

Na razie kombinuje z metodami funkcji i pętli PHP: switch, case, break, continue.
aras785
to tak jak napisał Tomplus - zapisuj gdzieś ostatnią pozycję i tyle (możesz np. sprawdzać który plik został ostatnio stworzony lub stworzyć dodatkowy plik roboczy który zapisze Ci aktualny stan pętli. Pokaż kod to łatwiej będzie rozmawiać i podrzucać najlepsze rozwiązania.
AmyLokmart
Oto mój skrypt:

  1. // Inicjalizacja Autoload dla:
  2. // DATABASE
  3. // FUNCTION LOOP
  4. // MODULE: Shufle Geins
  5. // Detektor języka
  6. require_once 'vendor/autoload.php';
  7. // Sprawdzanie metody GET dla funkcji przetwarzającej zapis wierszy metodą ascendalną
  8. $code = isset($_GET['code']) ? $_GET['code'] : '';
  9. $rows = isset($_GET['rows']) ? $_GET['rows'] : '';
  10. // Sprawdzanie czy warunek odpowiada równości końca
  11. if ($code == $end) { print "Koniec"; } else { print "Jeszcze nie ukończono."; }
  12.  
  13. if (empty($_GET['rows'])) { print 'Aktualnie na tej stronie jest pusty status.'; }
  14. else {
  15. // DEFINICJA BAZY DANYCH
  16. $servername->this->server;
  17. $username->this->user;
  18. $password->this->pass;
  19. $dbname->this->db;
  20.  
  21. // Tworzenie połączenia do bazy danych
  22. $conn = new mysqli($servername, $username, $password, $dbname);
  23.  
  24. // Sprawdzanie połączenia do bazy danych
  25. if ($conn->connect_error) {
  26. die("Niepowodzenie w łączeniu z bazą danych: " . $conn->connect_error);
  27. }
  28.  
  29. // Inicjalizacja zmiennej $rows dla wykonania funkcji fgh dla zmiennej $textscan
  30. if (empty($rows)) { return; } else { $rows; };
  31. if (isset($rows)) { $rows; } else { return; };
  32. if ($content == $rows) { $rows; } else { return; };
  33.  
  34. // Inicjalizacja Treści strukturalnej
  35. $textscan->$this->fgh($rows);
  36. // Porównywanie treści strukturalnej ze wzorcem
  37. preg_match("#<table>(.+)</table>#", $textscan, $tabs);
  38. // Główne zmienne dla bazy danych
  39. $title = str_replace("&", "and", str_replace("%x", "FT", str_replace("ft", "FT", str_replace(" A ", " a ", ucwords(ltrim(rtrim(trim(str_replace("$", "s", str_replace('"', '\"', str_replace("'", "\'", str_replace("", "IM", str_replace('<h1 class="strong">', '', str_replace("</h1>", "", chop($textscan->class(".col-lg-7",0)->startclass))))))), " \n\t\r\v\0"), " \n\t\r\v\0"), " \n\t\r\v\0"))))));
  40. $text = str_replace("&", "and", str_replace("%x", "FT", str_replace("ft", "FT", str_replace(" A ", " a ", ucwords(ltrim(rtrim(trim(str_replace("$", "s", str_replace('"', '\"', str_replace("'", "\'", str_replace("", "IM", str_replace('<h1 class="strong">', '', str_replace("</h1>", "", chop($textscan->class(".col-lg-7",0)->startclass))))))), " \n\t\r\v\0"), " \n\t\r\v\0"), " \n\t\r\v\0"))))));
  41. $body = nl2br(str_replace('"', '\"', str_replace("'", "\'", str_replace("&amp;nbsp;", "", str_replace("%o", "", str_replace($textscan->$next->return . "%o", "", str_replace($textscan->$next->load . "%o", "", str_replace("&amp;raquo;", "", str_replace("%h", "", str_replace('<a rel="textscan" class="btn-secondary btn-block btn-sm my-2 py-1 add-annotation" href="java script:;">%o</a>', '', str_replace('<h2 class="mb-2">%o</h2>', '', str_replace('<div class="inner-text"><br />', '', str_replace('</div>', '', str_replace("%28", "(", str_replace("%29", ")", str_replace("%2C", ",", str_replace("%3F", "?", str_replace("%27", "'", str_replace("%3A", ":", str_replace("%5D", "]<br />", str_replace("%5B", "[", str_replace("%0D%0A", "\n", str_replace(" ", "", str_replace("+", " ", strip_tags(htmlspecialchars(urlencode($textscan->class("div.song-text div",0)->startclass)))))))))))))))))))))))))));
  42. $body_html = nl2br(str_replace('"', '\"', str_replace("'", "\'", str_replace("&amp;nbsp;", "", str_replace("%o", "", str_replace($textscan->$next->return . "%o", "", str_replace($textscan->$next->load . "%o", "", str_replace("&amp;raquo;", "", str_replace("%h", "", str_replace('<a rel="textscan" class="btn-secondary btn-block btn-sm my-2 py-1 add-annotation" href="java script:;">%o</a>', '', str_replace('<h2 class="mb-2">%o</h2>', '', str_replace('<div class="inner-text"><br />', '', str_replace('</div>', '', str_replace("%28", "(", str_replace("%29", ")", str_replace("%2C", ",", str_replace("%3F", "?", str_replace("%27", "'", str_replace("%3A", ":", str_replace("%5D", "]<br />", str_replace("%5B", "[", str_replace("%0D%0A", "\n", str_replace(" ", "", str_replace("+", " ", strip_tags(htmlspecialchars(urlencode($textscan->class("div.song-text div",0)->startclass)))))))))))))))))))))))))));
  43. // Inicjalizacja kodowania opisu
  44. $description = str_replace("'", "\'",
  45. str_replace("';", "'",
  46. str_replace("%09", "",
  47. str_replace("%e", "",
  48. str_replace("+", " ",
  49. str_replace("%09%09%09", "",
  50. str_replace("+%09%09%09%09%09%09%09%09++++", "",
  51. str_replace("++%09%09%09%09%09%09%09%09%09++++%09%09%09%09++++%09%09%09", "",
  52. str_replace("+%09%09%09%09%09%09%09%09%09++++%09%09%09%09++++", "<br />",
  53. str_replace(".+", ".",
  54. str_replace("%C5%82", "ł",
  55. str_replace("%C4%99", "ę",
  56. str_replace("%C4%99", "", // ę
  57. str_replace("%C5%9B", "ś",
  58. str_replace("%3A", ": ",
  59. str_replace("%28", "(",
  60. str_replace("%29", ")",
  61. str_replace("%2C", ",",
  62. str_replace("%C3%B3", "ó", // ó
  63. str_replace("%C5%BC", "ż", // ż
  64. str_replace("%C5%BA", "ź", // ź
  65. str_replace("%C4%85", "ą", // ą
  66. str_replace("%C4%87", "ć", // ć
  67. str_replace("%C5%9A", "Ś", // Ś
  68. str_replace("%22", "\"",
  69. str_replace("%E2%80%93", "-",
  70. str_replace("%E2%80%A2", "*",
  71. str_replace("%27", "'",
  72. str_replace("%C3%A1", "á",
  73. str_replace("%C4%8D", "č",
  74. str_replace("%C3%AD", "í",
  75. str_replace("%C3%A3", "ă",
  76. str_replace("%2F", "/",
  77. str_replace("%3B", ";",
  78. str_replace("%E2%80%8E", "",
  79. str_replace("%C5%B9", "Ź", // Ź
  80. str_replace(";", "",
  81. str_replace("%26%23039", "'",
  82. str_replace("%26amp", "&",
  83. str_replace("%C5%84", "ń", // ń
  84. str_replace("%C3%A9", "é",
  85. str_replace("%C3%A0", "ŕ",
  86. urlencode(strip_tags($tabs[1]))
  87. ))))))))))
  88. ))))))))))
  89. ))))))))))
  90. ))))))))))));
  91.  
  92. // Detekcja języka
  93. $langdec = new Text_LanguageDetect();
  94. $language = $langdec->detectSimple($text);
  95.  
  96. $sql = "INSERT INTO amylokmart (/* instrukcje ukryte */) VALUES (/* instrukcje ukryte */)";
  97. if ($conn->query($sql) === TRUE)
  98. {
  99.  
  100. // Inicjalizacja Iteracji
  101. function addNumbers(int $a, int $b) { return $a + $b; }
  102. $linecount = 1;
  103. $viewcount = $linecount + substr_count($lines, "\n" );
  104.  
  105.  
  106. ////////////////////////////////////////////////////////
  107. // Sekcja: funkcja w pętli wykonująca działanie po nieoczekiwanym zatrzymaniu od miejsca gdzie się zatrzymała
  108. // Obecnie ta sekcja nie działa poprawnie (funkcja wraca na początek i dubluje treści)
  109. ////////////////////////////////////////////////////////
  110.  
  111. // Pobieranie wierszy z pliku
  112. $lines = file('rows.txt');
  113. foreach (explode("\n", $lines) as $line_num => $line) {
  114. function saveload()
  115. {
  116. $content_add = "code(" . addNumbers($line_num, '0') . "), content(" . $line . "), count(" . $viewcount . ")";
  117. $base_file_error = fopen("base.txt", "a") or die("Nie można otworzyć pliku!");
  118. $save_title_error = $content_add . ' = "' . $rows . '"';
  119. fwrite($base_file_error, "|". $save_title_error);
  120. fclose($base_file_error);
  121. }
  122. saveload() { ModuleShufleGeins->continue; }
  123. }
  124.  
  125. ////////////////////////////////////////////////////////
  126. // Koniec sekcji
  127. ////////////////////////////////////////////////////////
  128.  
  129. if (empty($language) and empty($title))
  130. {
  131. $base_file_error = fopen("base.txt", "a") or die("Nie można otworzyć pliku!");
  132. $save_title_error = $title . ' = "' . $rows . '"';
  133. fwrite($base_file_error, "|". $save_title_error);
  134. fclose($base_file_error);
  135. }
  136.  
  137. echo '<div class="main-section" style="margin: 0 auto;"><div style="background-color: green; color: white; padding: 5px;">Dodano: w języku [' . $language . ']. [' . $title . ']</div><br /></div>';
  138. }
  139. else
  140. {
  141. $base_file_error = fopen("base.txt", "a") or die("Nie można otworzyć pliku!");
  142. $save_title_error = $title . ' = "' . $rows . '"';
  143. fwrite($base_file_error, "|". $save_title_error);
  144. fclose($base_file_error);
  145.  
  146. echo '<div class="main-section" style="background-color: red; color: white; padding: 5px; margin: 0 auto;">Plozz: ' . $sql . '<br />' . $conn->error . '</div><br /><br />';
  147. }
  148. // Kończenie połączenia z bazą danych
  149. $conn->close();
  150. }


W kodzie chodzi, o sekcje: funkcja w pętli

Funkcję w pętli testuje w osobnym pliku, aby przeprowadzić osobno uruchomienie funkcji w miejscu, w którym skończyła działanie za pomocą: switch, case, break i continue.
Nie będę zapisywała osobno przed wykonaniem funkcji pozycji wiersza, ponieważ to strata czasu, a wiem że jest prosty sposób na to, bo na youtube kiedyś oglądałam filmik na ten temat i tam użytkownik pokazał jak to zrobić. Kiedy przypomniałam sobie, o tym filmiku to okazało się, że użytkownik go usunął sad.gif
markonix
  1. ))))))))))
  2. ))))))))))
  3. ))))))))))
  4. ))))))))))));


headsetsmiley.png

Wiesz, że
obsługuje tablice?
AmyLokmart
Tak Wiem, ale w moim kodzie chodzi, o kolejność, której tablica nie obsługuje, a w zasadzie to sekwencji kolejności, którą dla str_replace dodatkowo trzeba byłoby wyrazić w funkcji pomocniczej a to za dużo pisania.

Nadal nie mam odpowiedzi na moje pytanie w temacie sad.gif
Tomplus
Skróciłem kod do minimum.


  1. $lines = file('rows.txt');
  2. foreach (explode("\n", $lines) as $line_num => $line) {
  3.  
  4. if($line_num <= loadline()) {
  5. continue;
  6. }
  7. saveline($line_num);
  8. saveload();
  9. }
AmyLokmart
"Tomplus" Dziękuję za podpowiedź. Niepoprawnie wywołałam funkcję saveload() i zabrakło klasy, która załaduje odpowiedni moduł z zewnętrznego skryptu (ModuleShufleGeins)
Poprawiłam kod z drobną pomocą mojego mentora smile.gif Kod działa tak jak chcę, ale kodu modułu nie opublikuje, bo sama musiałam go wiele dni testować i zmieniać, aby w końcu robił to co chcę. Ci co programują dobrze wiedzą (jeśli nie kopiują gotowych rozwiązań tylko starają się samemu programować, aby zrozumieć działanie php), że to naprawdę żmudna, pracochłonna i czasochłonna zabawa w tworzenie fajnych rzeczy.

Poniżej poprawiony kod:

  1. autoload::ModuleShufleGeins;
  2.  
  3. class SetLoadContinue {
  4. public return $viewcount;
  5. public return saveload();
  6. public return this.saveload.ModuleShufleGeins;
  7. break;
  8. switch { case: $viewcount; default: "0"; }
  9. continue;
  10. }
  11. $continue = new SetLoadContinue();
  12. $continue->return;
  13.  
  14. $lines = file('rows.txt');
  15. foreach (explode("\n", $lines) as $line_num => $line) {
  16.  
  17. if ($line_num == ModuleShufleGeins) {
  18. saveload();
  19. continue;
  20. }
  21.  
  22. function saveload(ModuleShufleGeins)
  23. {
  24. $content_add = "code(" . addNumbers($line_num, '0') . "), content(" . $line . "), count(" . $viewcount . ")";
  25. $base_file_error = fopen("base.txt", "a") or die("Nie można otworzyć pliku!");
  26. $save_title_error = $content_add . ' = "' . $rows . '"';
  27. fwrite($base_file_error, "|". $save_title_error);
  28. fclose($base_file_error);
  29. }
  30. }


Jeszcze raz dziękuję za podpowiedź "Tomplus"

Pozdrawiam smile.gif

Aj. Bym Zapomniała smile.gif
W moim skrypcie nie chodzi, o to, aby każdą pozycję (wiersz) zapisywać oddzielnie przed działaniem funkcji zapisującej, tylko, żeby zapisywać pozycje (wiersze) do pliku w trakcie wykonywania funkcji, a jeśli natrafi ona na jakiś błąd lub się zatrzyma z powodu nieokreślonego błędu przy zapisywaniu pozycji (wiersza), to po prostu, aby wznowiła działanie do następnego wiersza z kolei.
Wszystko to funkcja zapisuje do jednego pliku, a nie do 100 plików.

No smile.gif Chciałam tylko wyjaśnić, bo pewnie dla niektórych mój kod może być skomplikowany i niezrozumiały.
Przypominam tylko, że kod, który tu przedstawiłam jest małym wycinkiem większej całości smile.gif
Tomplus
Stosuj odstępy w kodzie.

Ja zanim zabrałem się za stworzenie podpowiedzi przeformatowałem cały kod, aby widzieć gdzie kończą się funkcje, a gdzie zaczynają.
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.