Mam zmienną w PHP i potrzebuję jej wartości w kodzie JavaScript. Jak mogę uzyskać zmienną z PHP na JavaScript?
Mam kod, który wygląda następująco:
<?php
...
$val = $myService->getValue(); // Makes an API and database call
?>
Mam kod JavaScript, który potrzebuje val
i wygląda następująco:
<script>
myPlugin.start($val); // I tried this, but it didn't work
<?php myPlugin.start($val); ?> // This didn't work either
myPlugin.start(<?=$val?> // This works sometimes, but sometimes it fails
</script>
javascript
php
Duch Madary
źródło
źródło
myPlugin.start(<?=$val?>
celowy? Czy to prawda, że „czasem to działa”?"42)"
to będzie działać dobrze: DOdpowiedzi:
Istnieje na to kilka sposobów. Niektóre wymagają większego obciążenia niż inne, a niektóre uważa się za lepsze niż inne.
W szczególnej kolejności:
W tym poście sprawdzimy każdą z powyższych metod, zobaczymy zalety i wady każdej z nich, a także sposób ich wdrożenia.
1. Użyj AJAX, aby uzyskać potrzebne dane z serwera
Ta metoda jest uważana za najlepszą, ponieważ skrypty po stronie serwera i po stronie klienta są całkowicie oddzielne .
Plusy
Cons
Przykład realizacji
W AJAX potrzebujesz dwóch stron, jedna jest miejscem, w którym PHP generuje dane wyjściowe, a druga jest miejscem, w którym JavaScript pobiera dane wyjściowe:
get-data.php
index.php (lub jak nazywa się rzeczywista strona)
Powyższa kombinacja dwóch plików powiadomi
42
o zakończeniu ładowania pliku.Więcej materiałów do czytania
2. Zapisz gdzieś dane na stronie i użyj JavaScript, aby uzyskać informacje z DOM
Ta metoda jest mniej preferowana niż AJAX, ale nadal ma swoje zalety. Nadal jest względnie oddzielony między PHP a JavaScript w tym sensie, że nie ma PHP bezpośrednio w JavaScript.
Plusy
Cons
<input type=hidden>
do przechowywania informacji, ponieważ łatwiej jest je uzyskaćinputNode.value
, ale oznacza to, że masz bez znaczenia element w swoim HTML. HTML zawiera<meta>
element danych o dokumencie, a HTML 5 wprowadzadata-*
atrybuty danych specjalnie do odczytu za pomocą JavaScript, które można powiązać z określonymi elementami.Przykład realizacji
W tym celu chodzi o stworzenie elementu, który nie będzie wyświetlany użytkownikowi, ale będzie widoczny dla JavaScript.
index.php
3. Prześlij dane bezpośrednio do JavaScript
Jest to prawdopodobnie najłatwiejszy do zrozumienia.
Plusy
Cons
Przykład realizacji
Wdrożenie jest stosunkowo proste:
Powodzenia!
źródło
json_encode
?<?php $output = '<!--<script>'; echo json_encode($output); ?>
. Zobacz to pytanie, aby uzyskać szczegółowe informacje. Rozwiązanie: UżyjJSON_HEX_TAG
aby uciec<
i>
(wymaga PHP 5.3.0).Spróbuję prostszej odpowiedzi:
Wyjaśnienie problemu
Po pierwsze, zrozummy przepływ zdarzeń, gdy strona jest obsługiwana z naszego serwera:
Tak naprawdę najważniejszą rzeczą do zapamiętania jest to, że HTTP jest bezstanowy . Gdy żądanie opuści serwer, serwer nie może go dotknąć. To pozostawia nasze opcje:
Rozwiązania
Oto podstawowe pytanie, które powinieneś sobie zadać:
Czy piszę stronę internetową lub aplikację?
Strony internetowe są głównie oparte na stronach, a czas ładowania strony musi być tak szybki, jak to możliwe (na przykład - Wikipedia). Aplikacje internetowe są bardziej obciążone AJAX i wykonują wiele podróży w obie strony, aby uzyskać szybkie informacje o kliencie (na przykład - pulpit giełdowy).
Stronie internetowej
Wysyłanie większej liczby żądań od klienta po wykonaniu pierwszego żądania jest powolne, ponieważ wymaga większej liczby żądań HTTP, które mają znaczny narzut. Co więcej, wymaga asynchroniczności, ponieważ wykonanie żądania AJAX wymaga modułu obsługi po zakończeniu.
Bym nie polecam co innego żądania , chyba że witryna jest aplikacją dla uzyskania tych informacji z serwera.
Chcesz szybkich czasów reakcji, które mają ogromny wpływ na czas konwersji i ładowania. W tym przypadku wysyłanie żądań Ajax jest powolne i nie jest konieczne.
Istnieją dwa sposoby rozwiązania tego problemu
Ustawienie pliku cookie nie jest naprawdę trudne, wystarczy przypisać mu wartość:
Następnie możesz przeczytać w JavaScript za pomocą
document.cookie
:Oto krótki analizator składany z krótką ręką, ale odpowiedź, którą podałem powyżej, ma lepiej przetestowane:
Pliki cookie są dobre dla niewielkiej ilości danych. Właśnie to często robią usługi śledzenia.
Gdy mamy więcej danych, możemy zamiast tego zakodować je za pomocą JSON w zmiennej JavaScript:
Zakładając, że
$value
jest wjson_encode
stanie po stronie PHP (zwykle jest). Ta technika jest tym, co robi na przykład przepełnienie stosu na czacie (używając tylko .NET zamiast PHP).Podanie
Jeśli piszesz aplikację - nagle początkowy czas ładowania nie zawsze jest tak ważny, jak bieżąca wydajność aplikacji, i zaczyna się opłacać, aby ładować dane i kod osobno.
Moja odpowiedź tutaj wyjaśnia, jak ładować dane za pomocą AJAX w JavaScript:
Lub z jQuery:
Teraz serwer musi zawierać tylko
/your/url
trasę / plik zawierający kod, który pobiera dane i robi coś z tym, w twoim przypadku:W ten sposób nasz plik JavaScript prosi o dane i pokazuje je zamiast pytać o kod lub układ. Jest to czystsze i zaczyna się opłacać, gdy aplikacja staje się wyższa. To także lepsze rozdzielenie problemów i pozwala przetestować kod po stronie klienta bez udziału technologii po stronie serwera, co jest kolejnym plusem.
Postscriptum: Musisz być bardzo świadomi XSS wektorów ataków podczas wstrzykiwania czegokolwiek z PHP do JavaScript. To bardzo trudno właściwie uciec wartości i to od kontekstu. Jeśli nie masz pewności, jak postępować z XSS lub nie wiesz o tym - przeczytaj ten artykuł OWASP , ten i to pytanie .
źródło
{}
jest poprawnym obiektem JSON - patrz json.org\u2028
itp. Trzeba by wyraźnie powiedzieć, żeby tego nie robić.Zwykle używam atrybutów data- * w HTML.
W tym przykładzie użyto jQuery, ale można go dostosować do innej biblioteki lub waniliowego JavaScript.
Możesz przeczytać więcej o właściwości zestawu danych tutaj: https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement.dataset
źródło
div
jest w porządku, ale możesz użyć dowolnego tagu, który ci się podoba; musi być w tymbody
jednak.json_encode () wymaga:
$PHPVar
zakodowany jako UTF-8, Unicode.źródło
Po prostu użyj jednej z następujących metod.
LUB
źródło
document.onreadystatechange = () => { if (document.readyState === 'complete') { // document ready alert(js_variable) } };
Bardzo podoba mi się sposób, w jaki WordPress działa z funkcją kolejkowania i lokalizowania , dlatego zgodnie z tym modelem napisałem prostą klasę do umieszczania skryptów na stronie zgodnie z zależnościami skryptów i do udostępniania dodatkowych danych dla skryptu.
Wywołanie
enqueue_script()
funkcji służy do dodawania skryptu, ustawiania źródła i zależności od innych skryptów oraz dodatkowych danych potrzebnych do skryptu.I
print_scripts()
metoda z powyższego przykładu wyśle to wyjście:Niezależnie od faktu, że skrypt „jquery” jest kolejkowany po „jquery-ui”, jest drukowany wcześniej, ponieważ jest zdefiniowany w „jquery-ui”, że zależy od „jquery”. Dodatkowe dane dla „skryptu niestandardowego” znajdują się w nowym bloku skryptu i są umieszczone przed nim, zawiera
mydata
obiekt zawierający dodatkowe dane, teraz dostępne dla „skryptu niestandardowego”.źródło
Spróbuj tego:
-
- Po wypróbowaniu tego przez chwilę
Chociaż działa, jednak spowalnia działanie. Ponieważ PHP jest skryptem po stronie serwera, podczas gdy JavaScript jest po stronie użytkownika.
źródło
$phpVariable = '42"; alert("I am evil!");';
Nie działa, ponieważ nie
$val
jest zdefiniowany w JavaScript, tzn. Kod PHP nie wyświetlał niczego$val
. Spróbuj wyświetlić źródło w przeglądarce, a oto, co zobaczysz:I
To nie działa, ponieważ PHP spróbuje traktować
myPlugin
jako stałą, a gdy to się nie powiedzie, spróbuje potraktować go jako ciąg znaków,'myPlugin'
który spróbuje połączyć z wyjściem funkcji PHP,start()
a ponieważ nie jest to zdefiniowane, spowoduje śmierć błąd.I
Chociaż najprawdopodobniej to zadziała, ponieważ kod PHP generuje poprawny kod JavaScript z oczekiwanymi argumentami, jeśli się nie powiedzie, są szanse, że
myPlugin
nie jest jeszcze gotowy. Sprawdź kolejność realizacji.Należy również pamiętać, że dane wyjściowe kodu PHP są niepewne i należy je filtrować
json_encode()
.EDYTOWAĆ
Ponieważ nie zauważyłem brakującego nawiasu w
myPlugin.start(<?=$val?>
: - \Jak wskazuje @Second Rikudo, aby działać poprawnie,
$val
musiałby zawierać nawias zamykający, na przykład:$val="42);"
Oznacza to, że PHP będzie teraz produkować
myPlugin.start(42);
i będzie działać zgodnie z oczekiwaniami, gdy zostanie wykonane przez kod JavaScript.źródło
myPlugin.start(<?=json_encode($val)?>);
Wyszedłem z łatwą metodą przypisywania zmiennych JavaScript za pomocą PHP.
Używa atrybutów danych HTML5 do przechowywania zmiennych PHP, a następnie jest przypisywany do JavaScript przy ładowaniu strony.
Kompletny samouczek można znaleźć tutaj .
Przykład:
Oto kod JavaScript
źródło
Przykład:
KROK 1
KROK 2
źródło
Oto jeden, którego nie widzę opublikowanego jako opcji. Jest podobny do korzystania z Ajax, ale wyraźnie inny.
Najpierw ustaw źródło skryptu bezpośrednio na plik PHP.
Możesz nawet przekazać zmienną z powrotem do pliku PHP, takiego jak ten przykład:
Następnie w „twój_plik_pliku.php”:
źródło
var1=value1
. W tej chwili twój skrypt się zepsuje, jeśli dane zawierają'
znak.var1 != [some HTML code]
... WYRAŹNIEvar1=="value1"
. Mówiąc wprost, mylisz się, że coś przeoczyłem. skrypt PRZYKŁADOWY jest kompletny i, jak widać, nie generuje żadnego HTML - a OP nie wspomniał o HTML. nie zasługuje na ocenę przez jakiegoś wyzwalacza szczęśliwego bypassera$val
i który czasami działa, a czasami nie:myPlugin.start(<?=$val?> // this works sometimes, but sometimes it fails
Oto sztuczka:
Oto twój „PHP”, aby użyć tej zmiennej:
Teraz masz zmienną JavaScript o nazwie
'name'
, a oto twój kod JavaScript, aby użyć tej zmiennej:źródło
Powiedzmy, że twoja zmienna jest zawsze liczbą całkowitą. W takim przypadku jest to łatwiejsze:
Wyjście :
Powiedzmy, że twoja zmienna nie jest liczbą całkowitą, ale jeśli wypróbujesz powyższą metodę, otrzymasz coś takiego:
Ale w JavaScript jest to błąd składniowy.
Tak więc w PHP mamy wywołanie funkcji,
json_encode
które koduje ciąg znaków do obiektu JSON.Ponieważ
abcd
w JSON jest"abcd"
, wygląda to tak:Możesz użyć tej samej metody dla tablic:
Twój kod JavaScript wygląda następująco:
Wyjście konsoli
źródło
Po wielu badaniach odkryłem, że najłatwiejszą metodą jest łatwe przekazywanie wszystkich zmiennych.
W skrypcie serwera masz dwie zmienne i próbujesz wysłać je do skryptów klienta:
W dowolnym kodzie JavaScript wywoływanym na stronie wystarczy wywołać te zmienne.
źródło
Zakładam, że dane do przesłania są ciągiem.
Jak stwierdzili inni komentatorzy, AJAX jest jednym z możliwych rozwiązań, ale wady przeważają nad zaletami: ma opóźnienie i trudniej jest programować (potrzebuje kodu, aby pobrać wartość zarówno po stronie serwera, jak i klienta), gdy jest to prostsze funkcja ucieczki powinna wystarczyć.
Wracamy do ucieczki.
json_encode($string)
działa, jeśli najpierw kodujesz łańcuch źródłowy jako UTF-8, jeśli jeszcze go nie ma, ponieważjson_encode
wymaga danych UTF-8. Jeśli ciąg jest w ISO-8859-1, możesz po prostu użyćjson_encode(utf8_encode($string))
; w przeciwnym razie zawsze możesz użyćiconv
najpierw do konwersji.Ale jest duża gotcha. Jeśli używasz go w zdarzeniach, musisz uruchomić
htmlspecialchars()
wynik, aby poprawić kod. A potem musisz albo użyć podwójnych cudzysłowów, aby załączyć zdarzenie, albo zawsze dodawaćENT_QUOTES
do htmlspecialchars. Na przykład:Nie można jednak używać
htmlspecialchars
zwykłego kodu JavaScript (kod zawarty w<script>
...</script>
znacznikach). Dzięki temu ta funkcja jest podatna na błędy, zapominając ohtmlspecialchars
wyniku podczas pisania kodu zdarzenia.Możliwe jest napisanie funkcji, która nie ma tego problemu i można jej używać zarówno w zdarzeniach, jak i zwykłym kodzie JavaScript, pod warunkiem, że wydarzenia będą zawsze ujęte w pojedyncze cudzysłowy lub zawsze w podwójne cudzysłowy. Oto moja propozycja, która wymaga podwójnego cudzysłowu (co wolę):
Ta funkcja wymaga PHP 5.4+. Przykładowe użycie:
źródło
Zgodnie z Twoim kodem
Teraz możesz uzyskać wartość za pomocą DOM, użyj innerHTML span id, w tym przypadku nie musisz wykonywać żadnego połączenia z serwerem, Ajaxem lub inną rzeczą.
Twoja strona wydrukuje go za pomocą PHP, a JavaScript uzyska wartość za pomocą DOM.
źródło
<
i>
. Podobne rozwiązania zostały już zasugerowane.źródło
PHP
JS (yourexternal.js)
WYNIK
źródło
Dla tych, którzy mają problem z używaniem poniższego kodu i ciągle go wyświetla
<?php echo $username?>
lub coś takiego, edytuj httpd.conf w sekcji mime_module, dodając tę aplikację „AddType / x-httpd-php .html .htm”, ponieważ może być wyłączona domyślnie.źródło
$username === "hello"
, to masz,var myData = hello;
co okropnie się zepsuje.Posługiwać się:
i to zadziała. Po prostu przypisuje zmienną JavaScript, a następnie przekazuje wartość istniejącej zmiennej PHP. Ponieważ PHP zapisuje tutaj wiersze JavaScript, ma wartość zmiennej PHP i może przekazać ją bezpośrednio.
źródło