Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP] Jak uruchomić funkcję w miejscu, w którym skończyła działanie?, Aktywacja/Kontynuacja funkcji kiedy nagle się zatrzyma z powodu błędu
AmyLokmart
post 9.12.2021, 20:39:16
Post #1





Grupa: Zarejestrowani
Postów: 45
Pomógł: 0
Dołączył: 28.11.2021

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


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ę😊

Ten post edytował AmyLokmart 9.12.2021, 20:44:28
Go to the top of the page
+Quote Post
Tomplus
post 9.12.2021, 20:48:34
Post #2





Grupa: Zarejestrowani
Postów: 1 836
Pomógł: 225
Dołączył: 20.03.2005
Skąd: Będzin

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


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.
Go to the top of the page
+Quote Post
AmyLokmart
post 10.12.2021, 11:35:55
Post #3





Grupa: Zarejestrowani
Postów: 45
Pomógł: 0
Dołączył: 28.11.2021

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


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.

Ten post edytował AmyLokmart 10.12.2021, 11:37:11
Go to the top of the page
+Quote Post
aras785
post 10.12.2021, 11:49:00
Post #4





Grupa: Zarejestrowani
Postów: 859
Pomógł: 177
Dołączył: 29.10.2009

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


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.
Go to the top of the page
+Quote Post
AmyLokmart
post 10.12.2021, 14:06:57
Post #5





Grupa: Zarejestrowani
Postów: 45
Pomógł: 0
Dołączył: 28.11.2021

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


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

Ten post edytował AmyLokmart 10.12.2021, 14:42:49
Go to the top of the page
+Quote Post
markonix
post 10.12.2021, 14:26:59
Post #6





Grupa: Zarejestrowani
Postów: 2 707
Pomógł: 290
Dołączył: 16.12.2008
Skąd: Śląsk

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


  1. ))))))))))
  2. ))))))))))
  3. ))))))))))
  4. ))))))))))));


headsetsmiley.png

Wiesz, że
obsługuje tablice?


--------------------
Go to the top of the page
+Quote Post
AmyLokmart
post 10.12.2021, 14:36:05
Post #7





Grupa: Zarejestrowani
Postów: 45
Pomógł: 0
Dołączył: 28.11.2021

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


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
Go to the top of the page
+Quote Post
Tomplus
post 11.12.2021, 19:42:38
Post #8





Grupa: Zarejestrowani
Postów: 1 836
Pomógł: 225
Dołączył: 20.03.2005
Skąd: Będzin

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


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. }
Go to the top of the page
+Quote Post
AmyLokmart
post 11.12.2021, 23:18:19
Post #9





Grupa: Zarejestrowani
Postów: 45
Pomógł: 0
Dołączył: 28.11.2021

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


"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

Ten post edytował AmyLokmart 11.12.2021, 23:27:09
Go to the top of the page
+Quote Post
Tomplus
post 13.12.2021, 16:54:15
Post #10





Grupa: Zarejestrowani
Postów: 1 836
Pomógł: 225
Dołączył: 20.03.2005
Skąd: Będzin

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


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ą.
Go to the top of the page
+Quote Post

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

 



RSS Wersja Lo-Fi Aktualny czas: 25.04.2024 - 03:19