przypisanie wartosci zmiennej js do php

0

witam, mam pytanko z którym sobie nie potrafie poradzic. jak moge przypisac wartosc zmiennej z funkcji napisanej w javacript jako wartosc zmiennej php. mam takie cos

      if (detectcos()) // funkcja javascript
      {
      document.write("tak");
      }
      else
      {
      document.write("nie");
      }

a chodzi mi zeby zwracalo mi:

      if (detectcos()) // funkcja javascript
      {
      <?= $f = 'tak'?>;
      }
      else
      {
      <?= $f = 'nie'?>;
      }

dlaczego pomimo ze powinno mi zwracac "tak" przy wyswietlaniu $f daje mi "nie". co jest nie tak?

0

Oj, musiałbyś zrozumieć podstawy architektury aplikacji sieciowych, żeby skumać ten błąd. Wygląda na to, że nie zdajesz sobie sprawy, w którym miejscu i kiedy wykonuje się kod PHP, a w którym JavaScript. Jako programista aplikacji sieciowych (to szumna nazwa, chodzi tu również o zwykłe małe strony www) po prostu powinieneś to wiedzieć.

Pokrótce i w pewnym uproszczeniu, to jest tak...

Użytkownik wpisuje adres URL strony lub klika na jakieś łącze. Przeglądarka wykonuje wtedy tzw. żądanie. Czyli mówi odpowiedniemu serwerowi (serwer to komputer, na którym leży sobie docelowa strona), że użytkownik chce zobaczyć taką i taką stronę. Serwer dostaje to żądanie i przygotowuje odpowiedź. Odpowiedź to w naszym przypadku będzie plik HTML (tak naprawdę odpowiedzią może być plik ze skryptem, arkusz stylów, obrazek, czy niemal cokolwiek innego). U nas użytkownik żąda strony, więc serwer musi mu przygotować kod HTML, który w dodatku będzie zawierał wstawki z JavaScriptem. Utworzeniem tego kodu HTML zajmuje się u nas PHP.

W tym momencie znajdujemy się na serwerze. Odpalany jest interpreter PHP. Przetwarza on Twój kod PHP. To, co znajduje się poza znacznikami php (czyli poza np. <?= ... ?>) jest po prostu przepisywane do odpowiedzi. Serwer więc tworzy odpowiedź, dodając do niej najpierw linijkę:

if (detectcos()) // funkcja javascript

Zauważ proszę, że dla serwera to tylko zwykły tekst. Żadna funkcja detectcos() nie jest na tym etapie odpalana. Serwer na razie jest na etapie budowy kodu HTML strony.

Przepisuje też wprost do odpowiedzi następną linijkę, czyli:

      {

Przepisuje nawet kilka spacji z kolejnej linii. Aż trafia na tag PHP, czyli <?= ... ?>.

To oznacza, że tu nie może już bezmyślnie przepisywać tekstu pliku PHP do odpowiedzi. Musi tak naprawdę odpalić "właściwy interpreter PHP". (przełącza się w tryb przetwarzania "prawdziwego" kodu PHP). Wykonuje więc akcję zapisaną w języku PHP, o którą prosisz: wstawia do zmiennej $f wartość 'tak'. Dodatkowo przepisuje wartość tego wyrażenia do odpowiedzi, bo używasz tu <?= ... ?>. Wartością wyrażenia "$f = 'tak'" jest "tak", więc do kodu odpowiedzi dołączane jest "tak". Prawdopodobnie jest to błędem z Twojej strony, bo powinieneś użyć <?php ... ?> (wtedy wartość 'tak' zostanie wstawiona do $f, ale wartość wyrażenia nie będzie niepotrzebnie przepisana do odpowiedzi).

Zaraz, czy jednak o to Ci chodziło? Chyba nie... Chciałeś, by JavaScript tu zadziałał, ale interpreter JavaScript na razie w ogóle nie był uruchomiony! Serwer nie interpretuje Twojego kodu JavaScript, tylko tworzy odpowiedź, która trafi do przeglądarki.

Tworzy więc ją nadal. Jest już poza tagami PHP <?= ... ?>, więc przepisuje do odpowiedzi znak "}", w następnej linii "else", w następnej "{" i znowu trafia na kod PHP. Wykonuje więc go: podstawia 'nie' do zmiennej $f i leci dalej, przepisując do odpowiedzi końcową klamrę.

Uff, serwer już utworzył odpowiedź, czyli plik HTML żądany przez przeglądarkę. Wysyła go więc do przeglądarki.

Przeglądarka otrzymuje plik z kodem HTML (w Twoim przykładzie nie widać tego kodu HTML, widać tylko wstawkę JavaScriptową -- jednak zakładam, że ten JavaScript jest umieszczony w jakimś dokumencie HTML). Wyświetla więc ten plik HTML. Natrafia na wstawkę z JavaScriptem. Odpala interpreter JavaScriptu.

Kod JavaScript wygląda tak:

if (detectcos()) // funkcja javascript
{
    tak;
}
else
{
    nie;
}

Dopiero teraz wykonywany jest powyższy kod. Po trafieniu do przeglądarki. PHP już tu nie działa -- dawno zrobiło to, co miało do zrobienia: utworzyło na serwerze odpowiedź dla przeglądarki, którą serwer przesłał przeglądarce.

Dlatego to, co chcesz zrobić -- a może raczej sposób w jaki to robisz -- jest nieosiągalne, a pokusiłbym się nawet o stwierdzenie, że jest bez sensu :).

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