Problem z odczytywaniem pliku i wyświetlaniem na stronie

0

Witam ! Mam problem ktory może zainteresować innych. Chcę napisać program który przekazuje plik z danymi z komputera lokalnego na serwer i wyświetla je na stronie. Napisałem mały program aby sprawdzić wyświetlanie danych na stronie (zamieszczam poniżej). Program co 2 sec. odczytuje plik w PHP oraz odczytane dane wyświetla w konsoli. Starałem się zminimalizować program aby był łatwiejszy do interpretacji. Problem polega na tym że mimo że teoretycznie zaktualizowana zawarość pliku powinna być wyświetlana w każdorazowym wywołaniu funkcji php_js() która jest wywoływana przez setInterval to tak się nie dzieje. mimo iż plik zawiera zupełnie inne dane to w konsoli widać ciągle te same dane (takie jak po uruchomieniu strony). Dopiero po odświeżeniu strony rzeczywista zawartość pliku jest wyświetlana w konsoli a to mnie nie urządza. Siedzę nad tym od kilkunastu dni. Przekopałem internet i dostępną literaturę bez rezultatu. Proszę o pomoc.

<HEAD>
<meta http-equiv="Content-Script-Type" content="text/javascript">
<META HTTP-EQUIV="Content-type" CONTENT="text/html; charset=utf-8">
<META HTTP-EQUIV="Content-Language" CONTENT="pl">
</HEAD>
<BODY>
<script>

	  setInterval('php_js()',2000);
           
function php_js()  
	
{
	tablica_js=[];
	
<?php	

$odbiorniki=array();

				$data=file_get_contents("onoffdata.txt");  
			
				$data=substr($data,0,17);    //usuwam ostatni przecinek aby explode działało poprawnie
				$odbiorniki=explode(",",$data);	 
				
     foreach($odbiorniki as $klucz => $wart) 
	 
        print ("tablica_js[$klucz] = $wart;"); 
?>
console.log(tablica_js);
}
</script>	   	
</BODY>
</HTML>

Plik ktory jest przesyłany jest plikiem tekstowym i ma taką postać. Oczywiście to tylko przykład
9,0,5,3,4,8,6,5,9,

0

Jak chcesz przesłać dane bez odświeżania strony to bardziej ajax, dodatkowo cache przeglądarki też może trzymać stare dane.

1

Zaszyłeś kawałek kodu PHP wewnątrz funkcji JS.

Efekt jest taki, że podczas uruchomienia strony serwer generuje plik HTML wraz z w.w funkcją i odczytanymi w niej wartościami i przesyła do twojej przeglądarki.
Zaś każde kolejne wywołanie funkcji da ci ten sam wynik, bo w żaden sposób nie odwołujesz się tutaj do serwera, tylko wywołujesz na sztywno zdefiniowaną funkcję.

Jak radzą czyste skarpety: szukaj terminu AJAX.

0

Freja Draco Twoje wyjaśnienie ma sens. Z Ajaxa korzystałem wielokrotnie ale w innych sytuacjach i to mnie zmyliło. Jednak nie wszystko jest dla mnie jasne i jeśli mogę jeszcze wykorzystać Twoją wiedzę to powiedz mi co produkują kolejne wywołania kodu PHP np. file_get_contens . Jeśli ta funkcja nie ma dostępu do serwera to powinna zgłosić błąd a tak się nie dzieje, dlaczego?. Z góry dziękuję za odpowiedź. Pozdrawiam.

3

PHP działa po stronie serwera. Generuje treść i potem masz ją w przeglądarce. Przeglądarka nie interpretuje PHP. Nie ma takiej możliwości. Z resztą zobacz sobie źródło strony, w przeglądarce nie powinno być tam śladu po kodzie PHP. Zmienna tablica_js zostanie raz zadeklarowana i potem juz tylko się do niej odwołujesz.

0

Jurek 1980 dziękuję Ci za chęć pomocy . Zmienna tablica_js jest zadeklarowana w skrypcie a kod js jest wykonywany w przeglądarce. W każdym wywołaniu funkcji php_js() tablica jest kasowana a jednak na końcu jest zapisywana a może to zrobić tylko kod PHP bo nic innego tam nie ma. Jak się to odbywa nie wiem bo inaczej nie byłoby tego postu.

1

PHP jest wykonywane przez serwer, a JS przez przeglądarkę.

Jeśli umieścisz kawałek PHP wewnątrz funkcji JS, to efekt jest taki, że wszystko co umieścisz pomiędzy <?php ?> zostanie przetworzone przez serwer przy wywołaniu strony. Serwer odczyta pliki, przypisze wartości i wygeneruje kod JS.

Jednak po wygenerowaniu i przesłaniu przeglądarce taki kod jest już niezmienny i kolejne wywołania funkcji JS odwołują za każdym razem do tego niezmiennego kodu.
Jak ci już radzono, zajrzyj z resztą do źródła. Z punktu widzenia przeglądarki i JS nie ma tam już żadnego PHP.

0

Wszystko co napisał Freja Draco jest oczywiste i takie było również dla mnie do momentu kiedy nie wpadłem w tą pułapkę. Teraz już nie tak bardzo bo nasuwa się cały szereg pytań dotyczących działania kodu PHP wywoływanego w funkcji JS już po przesłaniu strony do przeglądarki tak jak w moim przykładzie. Faktem jest że zmienna tablica_js jest kasowana na początku wykonania funkcji php_js a po jej wykonaniu znowu jest zapełniana więc robi to kod PHP a wiemy że wartości zmiennych PHP są zachowane w kolejnym bloku <?php ?/> co częściowo wyjaśniałoby problem . Pozostaje aktualne pytanie jak traktowane jest wywołanie funkcji file_get_contens() że mimo iż nie ma dostępu do serwera nie zgłasza błędu. Czy interpreter ignoruje wywołanie czy tylko podstawia pod zmienną poprzednią wartość. Temat jest ciekawy ale nie sądzę żeby zainteresował większe grono więc pewnie trzeba zakończyć ten wątek. Dziękuję wszystkim za udział.

1

Ale tu nie ma magii ani ukrytych pułapek. Żadna funkcja z PHP nie działa po stronie przeglądarki. Sprawdziłeś źródło wygenerowanej strony? Masz tam PHP? Cały blok PHP jest raz wykonywany po stronie serwera przy wczytaniu strony. Jak masz tam jakiś plik to PHP stworzy Ci przypisanie np. tablica_js = [1,2,9]
Potem już kręcisz się w pętli czyli przypisujesz znów pustą tablicę i znów tą o wartości wygenerowanej przy pierwszym wczytaniu strony. Sam to dokładnie opisaleś w pierwszym poście.

1
dinosaurus napisał(a):

Pozostaje aktualne pytanie jak traktowane jest wywołanie funkcji file_get_contens() że mimo iż nie ma dostępu do serwera nie zgłasza błędu. Czy interpreter ignoruje wywołanie czy tylko podstawia pod zmienną poprzednią wartość.

Nijak nie jest traktowane, bo z punktu widzenia przeglądarki wewnątrz twojej funkcji JS nie ma już żadnego kodu PHP, w tym w szczególności nie ma tam żadnego file_get_contens() . Są tylko zadeklarowane na sztywno polecenia JS.

1 użytkowników online, w tym zalogowanych: 0, gości: 1