Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Funkcja read()
Forum PHP.pl > Forum > PHP
Capellini
Na stronie mam taki kod:

  1. <div id="odp"></div>
  2. <input type="submit" />


Po kliknięciu przycisku submit wykonywany jest skrypt przy użyciu Ajaxu, a wynik działania skryptu jest wsypywany do <div id="odp">. Ten wykonywany skrypt (nazwijmy go skrypt A) odpala jakiś inny skrypt (nazwijmy go skrypt B ) funkcją eval(), ale chciałbym, żeby ten skrypt B mógł wykorzystywać funkcję read($zmienna), która kończyłaby działanie skryptu w tym momencie, gdzie została wywołana, czekała aż użytkownik wpiszę coś w textarea i naciśnie przycisk, przypisawałaby do zmiennej podanej jako argument wartość wpisaną w textarea i dopiero po tym dokańczałaby działanie tamtego odpalanego skryptu od momentu, w którym było wywołanie funkcji read().

Chodzi mi po prostu o coś takiego jak funkcja read() w Pascalu czy scanf() w C, ale chcę coś takiego napisać w PHP pobierając ten wczytywany tekst z textarea. Czy da się coś takiego zrobić, albo chociaż coś podobnego do tego?

Mój pomysł jest taki, żeby podzielić cały skrypt B na kawałki między wywołania tej funkcji read():
  1. <?php
  2. $fragmenty = split('/[^;]*read((.*));.*/i', $skryptB);
  3. ?>


I później wykonujemy pierwszą część kodu i to, która część kodu jest wykonywana jest przechowywane w sesjach, podobnie przechowywane w sesjach byłyby wartości wszystkich zmiennych, ale musiałbym także oprócz zmiennych przechowywać w tych sesjach jeszcze na przykład definicje wszystkich funkcji, klas itd.

Czy istnieje lepsze rozwiązanie?
Zyx
O panie, elementarne podstawy protokołu HTTP się kłaniają. Klient wysyła żądanie, serwer odsyła odpowiedź. Tak wygląda komunikacja w obrębie pojedynczego żądania. Najczęściej, gdy przeglądarka zaczyna odbierać kod HTML, skrypt PHP już jest przeszłością. Oczywiście można wymusić, by dane wysyłać wcześniej, ale niewiele Ci to da, bo komunikacja jest jednokierunkowa w obrębie żądania. Taką funkcję masz, ale jak piszesz skrypt PHP wykonywany na konsoli, natomiast przez sieć i HTTP - nie da rady. Co najwyżej możesz Ajaksem wysłać kolejne żądanie HTTP do kolejnego skryptu, że coś zostało tam wpisane.
Capellini
Cytat
O panie, elementarne podstawy protokołu HTTP się kłaniają. Klient wysyła żądanie, serwer odsyła odpowiedź. Tak wygląda komunikacja w obrębie pojedynczego żądania. Najczęściej, gdy przeglądarka zaczyna odbierać kod HTML, skrypt PHP już jest przeszłością.


Wiem o tym doskonale, chyba nie zrozumiałeś, o co mi chodzi. Przeczytaj mój post jeszcze raz.

Dlatego właśnie nie wykonuję skryptu B w normalny sposób, tylko evalem, żeby móc przedtem go "nadzorować" skryptem A. Skrypt B wykonuje się fragmentami i wiem, że nie da się wykonać tego wszystkiego za jednym żądaniem.

Chciałbym żeby było tak, że użytkownik coś wpisuje, później skrypt B jest wykonywany do momentu wywołania read() i wtedy serwer odsyła odpowiedź, ale wartości wszystkich zmiennych, definicje funkcji itd. zapisuję w sesjach, ale trudno jest to wszystko skryptem A wyciągnąć ze skryptu B, dlatego pytam się, czy ktoś ma lepszy pomysł chociaż raczej inaczej nie da się tego zrobić.
erix
Cytat
Chodzi mi po prostu o coś takiego jak funkcja read() w Pascalu czy scanf() w C, ale chcę coś takiego napisać w PHP pobierając ten wczytywany tekst z textarea. Czy da się coś takiego zrobić, albo chociaż coś podobnego do tego?

Widać, kto zaglądał do dokumentacji: sscanf" title="Zobacz w manualu PHP" target="_manual
Zyx
Hmmm... faktycznie, teraz to brzmi trochę sensowniej - trochę to zakręcone było w pierwszy poście, ale mniejsza z tym, ważne że teraz już mam jasność smile.gif. Myślę, że Twój problem polega na tym, że próbujesz przenieść do świata WWW technikę, która działa w C/C++, ale tutaj nie ma szans powodzenia. Takie rzeczy robi się zupełnie inaczej: każde żądanie traktujemy niezależnie i nie próbujemy w żaden sposób symulować ciągłego wykonywania, bo z tego jest tylko więcej szkody niż pożytku. Wszystkie żądania same sobie ładują cały potrzebny kod, analizują adres URL, określają, czego się od nich chce i odsyłają odpowiedź, a ew. autoryzacja leci przez sesje. Przykład takiej komunikacji:

1. Skrypt A generuje kod do wyświetlenia formularza. KONIEC. Nie ma żadnego nadzoru nad innym skryptem, ani nic. Skrypt miał wygenerować formularz i go wygenerował.
2. Przeglądarka czeka na wpisanie czegoś. Gdy to się stanie, wysyła AJAX-em kolejne żądanie do skryptu B.
3. Skrypt B startuje całkowicie normalnie, identycznie jak skrypt A, tyle że po drodze określa, że chcemy od niego danych AJAX-owych. Generuje je więc i kończy pracę.
4. Użytkownik wciska przycisk wysłania formularza i na serwerze rozpoczyna się wtedy wykonywanie skryptu C.
5. Skrypt C znowu ładuje się normalnie i widzi, że musi przetworzyć jakiś formularz. Wobec tego przetwarza go i odsyła do przeglądarki odpowiedź.

Po prostu musisz zacząć myśleć właśnie w taki sposób, że wyświetlenie formularza i jego przetworzenie to dwa oddzielne procesy, w których dzieje się zupełnie co innego. Znacznie szybciej do czegoś dojdziesz, niż tracąc czas na eksperymenty z próbą zasymulowania funkcji read().
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.