У меня есть переменная в PHP, и мне нужно ее значение в моем коде JavaScript. Как я могу получить свою переменную из PHP в JavaScript?
У меня есть код, который выглядит так:
<?php
...
$val = $myService->getValue(); // Makes an API and database call
?>
У меня есть код JavaScript, который нуждается val
и выглядит следующим образом:
<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
Призрак Мадары
источник
источник
myPlugin.start(<?=$val?>
умышленном? Правда ли, что «это иногда работает»?"42)"
это будет хорошо работать: DОтветы:
Есть несколько подходов для этого. Некоторые требуют больше накладных расходов, чем другие, а некоторые считаются лучше, чем другие.
В произвольном порядке:
В этом посте мы рассмотрим каждый из вышеперечисленных методов и рассмотрим плюсы и минусы каждого из них, а также способы их реализации.
1. Используйте AJAX, чтобы получить необходимые данные с сервера
Этот метод считается лучшим, потому что сценарии на стороне сервера и на стороне клиента полностью разделены .
Pros
Cons
Пример реализации
В AJAX вам нужны две страницы: одна - где PHP генерирует выходные данные, а вторая - где JavaScript получает эти выходные данные:
получить-data.php
index.php (или как называется настоящая страница)
Приведенная выше комбинация двух файлов предупредит
42
об окончании загрузки файла.Еще немного материала для чтения
2. Перенесите данные на страницу и используйте JavaScript для получения информации из DOM.
Этот метод менее предпочтителен, чем AJAX, но все же имеет свои преимущества. Он все еще относительно разделен между PHP и JavaScript в том смысле, что в JavaScript нет прямого PHP.
Pros
Cons
<input type=hidden>
для хранения информации, потому что легче извлечь информациюinputNode.value
, но это означает, что у вас есть бессмысленный элемент в вашем HTML. HTML имеет<meta>
элемент для данных о документе, а HTML 5 вводитdata-*
атрибуты для данных специально для чтения с помощью JavaScript, которые могут быть связаны с конкретными элементами.Пример реализации
При этом идея состоит в том, чтобы создать какой-то элемент, который не будет отображаться пользователю, но будет видимым для JavaScript.
index.php
3. Вывод данных напрямую в JavaScript
Это, наверное, проще всего понять.
Pros
Cons
Пример реализации
Реализация относительно проста:
Удачи!
источник
json_encode
?<?php $output = '<!--<script>'; echo json_encode($output); ?>
. Смотрите этот вопрос для деталей. Решение: используйтеJSON_HEX_TAG
для выхода<
и>
(требуется PHP 5.3.0).Я собираюсь попробовать более простой ответ:
Объяснение проблемы
Во-первых, давайте разберемся с потоком событий, когда страница обслуживается с нашего сервера:
В общем, главное, что нужно помнить, это то, что HTTP не имеет состояния . Как только запрос покинул сервер, сервер не может его коснуться. Итак, это оставляет наши варианты:
Решения
Вот основной вопрос, который вы должны задать себе:
Я пишу веб-сайт или приложение?
Сайты в основном основаны на страницах, и время загрузки страницы должно быть максимально быстрым (например, Википедия). Веб-приложения более тяжелы в AJAX и выполняют множество обходных шагов, чтобы быстро получить информацию о клиенте (например, панель инструментов).
Веб-сайт
Посылка большего количества запросов от клиента после того, как начальный запрос сделан, медленна, поскольку это требует большего количества запросов HTTP, которые имеют значительные накладные расходы. Более того, он требует асинхронности, поскольку для выполнения AJAX-запроса требуется обработчик, когда он завершается.
Я не рекомендовал бы делать еще один запрос, если ваш сайт не является приложением для получения этой информации с сервера.
Вам нужно быстрое время отклика, которое оказывает огромное влияние на конверсию и время загрузки. В этом случае выполнение запросов Ajax является медленным для начального времени безотказной работы и не требуется.
У вас есть два способа решения проблемы
Настройка cookie действительно не очень сложна, вы просто присваиваете ей значение:
Затем вы можете прочитать его с помощью JavaScript, используя
document.cookie
:Вот краткий парсер, но ответ, который я привел выше, лучше проверен:
Файлы cookie хороши для небольших данных. Это то, что сервисы отслеживания часто делают.
Как только у нас будет больше данных, мы можем вместо этого кодировать их с помощью JSON внутри переменной JavaScript:
Предполагая
$value
,json_encode
может на стороне PHP (обычно это так). Эта техника - то, что Stack Overflow делает, например, со своим чатом (только с использованием .NET вместо PHP).заявка
Если вы пишете приложение - внезапно начальное время загрузки не всегда так важно, как текущая производительность приложения, и оно начинает окупаться, загружая данные и код отдельно.
Мой ответ здесь объясняет, как загрузить данные с помощью AJAX в JavaScript:
Или с помощью jQuery:
Теперь сервер просто должен содержать
/your/url
маршрут / файл, который содержит код, который захватывает данные и что-то делает с ним, в вашем случае:Таким образом, наш файл JavaScript запрашивает данные и показывает их, а не запрашивает код или макет. Это чище и начинает окупаться, когда приложение становится выше. Это также лучшее разделение проблем и позволяет тестировать код на стороне клиента без какой-либо технологии на стороне сервера, что является еще одним плюсом.
Постскриптум: вы должны очень хорошо знать векторы атак XSS, когда вводите что-либо из PHP в JavaScript. Это очень трудно избежать ценности должным образом , и это контекстная. Если вы не знаете, как обращаться с XSS, или не знаете об этом - прочитайте эту статью OWASP , эту и этот вопрос .
источник
{}
является допустимым объектом JSON - см. json.org\u2028
и т. Д. Вы должны явно сказать, чтобы это не делалось.Я обычно использую атрибуты data- * в HTML.
В этом примере используется jQuery, но его можно адаптировать для другой библиотеки или обычного JavaScript.
Вы можете прочитать больше о свойстве набора данных здесь: https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement.dataset
источник
div
это хорошо, но вы можете использовать любой тег, который вам нравится; должно быть вbody
то же время.json_encode () требует:
$PHPVar
кодируется как UTF-8, Unicode.источник
Просто используйте один из следующих методов.
ИЛИ
источник
document.onreadystatechange = () => { if (document.readyState === 'complete') { // document ready alert(js_variable) } };
Мне очень нравится, как WordPress работает с функциями создания и локализации , поэтому, следуя этой модели, я написал простой класс для размещения сценариев на странице в соответствии с зависимостями сценариев и для предоставления дополнительных данных для сценария.
Вызов
enqueue_script()
функции предназначен для добавления сценария, установки источника и зависимостей от других сценариев, а также дополнительных данных, необходимых для сценария.И
print_scripts()
метод вышеприведенного примера отправит этот вывод:Независимо от того, что скрипт «jquery» ставится в очередь после «jquery-ui», он печатается раньше, потому что он определен в «jquery-ui», что он зависит от «jquery». Дополнительные данные для «custom-script» находятся внутри нового блока сценария и помещены перед ним, он содержит
mydata
объект, который содержит дополнительные данные, теперь доступные для «custom-script».источник
Попробуй это:
-
-После попытки это некоторое время
Хотя это работает, однако это замедляет производительность. Так как PHP - это серверный скрипт, а JavaScript - это пользовательская.
источник
$phpVariable = '42"; alert("I am evil!");';
Это не работает, потому что
$val
не определено в отношении JavaScript, то есть код PHP ничего не выводил$val
. Попробуйте просмотреть источник в своем браузере, и вот что вы увидите:А также
Это не работает, потому что PHP будет пытаться обрабатывать
myPlugin
как константу, а в случае неудачи он будет пытаться рассматривать ее как строку,'myPlugin'
которую попытается объединить с выводом функции PHP,start()
и поскольку она не определена, это приведет к фатальной ошибке. ошибка.А также
Хотя это, скорее всего, сработает, так как код PHP создает допустимый JavaScript с ожидаемыми аргументами, в случае неудачи, скорее всего, потому, что он
myPlugin
еще не готов. Проверьте ваш порядок исполнения.Также вы должны заметить, что вывод PHP-кода небезопасен и должен фильтроваться
json_encode()
.РЕДАКТИРОВАТЬ
Потому что я не заметил пропущенных скобок в
myPlugin.start(<?=$val?>
:Как указывает @Second Rikudo, для его правильной работы
$val
потребуется заключительная скобка, например:$val="42);"
Это означает, что PHP теперь будет производить
myPlugin.start(42);
и будет работать так, как ожидается, при выполнении кода JavaScript.источник
myPlugin.start(<?=json_encode($val)?>);
Я выступил с простым методом назначения переменных JavaScript с помощью PHP.
Он использует атрибуты данных HTML5 для хранения переменных PHP, а затем присваивается JavaScript при загрузке страницы.
Полный учебник можно найти здесь .
Пример:
Вот код JavaScript
источник
Пример:
ШАГ 1
ШАГ 2
источник
Вот тот, который я не вижу в качестве опции. Это похоже на использование Ajax, но явно отличается.
Сначала установите исходный текст сценария непосредственно в файл PHP.
Вы даже можете передать переменную обратно в файл PHP, например, в следующем примере:
Затем в "your_php_file.php":
источник
var1=value1
. В существующем состоянии ваш скрипт сломается, если данные содержат'
символ.var1 != [some HTML code]
... ЯСНОvar1=="value1"
. Проще говоря, вы не правы, что я что-то пропустил. Сценарий EXAMPLE завершен и, как вы можете видеть, не генерирует никакого HTML-кода, а OP не упоминал HTML. это не заслуживает понижения голосов каким-то триггером, счастливым пропущенным$val
и который иногда работает, а иногда нет:myPlugin.start(<?=$val?> // this works sometimes, but sometimes it fails
Вот хитрость:
Вот ваш 'PHP' для использования этой переменной:
Теперь у вас есть переменная JavaScript
'name'
, и вот ваш код JavaScript для использования этой переменной:источник
Допустим, ваша переменная всегда целочисленная. В этом случае это проще:
Выход :
Допустим, ваша переменная не является целым числом, но если вы попробуете описанный выше метод, вы получите что-то вроде этого:
Но в JavaScript это синтаксическая ошибка.
Так что в PHP у нас есть вызов функции,
json_encode
которая кодирует строку в объект JSON.Так как
abcd
в JSON есть"abcd"
, это выглядит так:Вы можете использовать тот же метод для массивов:
И ваш код JavaScript выглядит так:
Консольный вывод
источник
После долгих исследований я обнаружил, что самый простой способ - легко передавать все виды переменных.
В сценарии сервера у вас есть две переменные, и вы пытаетесь отправить их клиентским сценариям:
В любом коде JavaScript, который вызывается на странице, просто вызывайте эти переменные.
источник
Я предполагаю, что данные для передачи являются строкой.
Как отмечали другие комментаторы, AJAX является одним из возможных решений, но его недостатки перевешивают плюсы: он имеет задержку и его сложнее программировать (ему нужен код для извлечения значения как на стороне сервера, так и на стороне клиента), когда проще Функция выхода должна быть достаточной.
Итак, мы вернулись к побегу.
json_encode($string)
работает, если вы сначала закодируете исходную строку как UTF-8, если это не так, потому чтоjson_encode
требуются данные UTF-8. Если строка в ISO-8859-1, вы можете просто использоватьjson_encode(utf8_encode($string))
; в противном случае вы всегда можете использовать,iconv
чтобы сделать преобразование первым.Но есть большая ошибка. Если вы используете его в событиях, вам нужно запустить
htmlspecialchars()
результат, чтобы сделать его правильным кодом. И затем вы должны быть осторожны, чтобы использовать двойные кавычки для включения события, или всегда добавлятьENT_QUOTES
в htmlspecialchars. Например:Однако вы не можете использовать
htmlspecialchars
обычный код JavaScript (код, заключенный в<script>
...</script>
теги). Это делает использование этой функции склонной к ошибкам, забываяhtmlspecialchars
результат при написании кода события.Можно написать функцию, у которой такой проблемы нет, и которую можно использовать как в событиях, так и в обычном коде JavaScript, если вы всегда заключаете события в одинарные или двойные кавычки. Вот мое предложение, требующее, чтобы они были в двойных кавычках (что я предпочитаю):
Функция требует PHP 5.4+. Пример использования:
источник
Согласно вашему коду
Теперь вы можете получить значение с помощью DOM, использовать innerHTML для span id, в этом случае вам не нужно делать никаких обращений к серверу, или Ajax, или другим способом.
Ваша страница напечатает его с помощью PHP, а ваш JavaScript получит значение с помощью DOM.
источник
<
и>
. Также аналогичные решения уже были предложены.источник
PHP
JS (yourexternal.js)
ВЫВОД
источник
Для тех, у кого есть проблемы с использованием приведенного ниже кода, и он продолжает показываться
<?php echo $username?>
или что-то вроде этого, отредактируйте httpd.conf в разделе mime_module, добавив этот «AddType application / x-httpd-php .html .htm», потому что он может быть отключен по умолчанию.источник
$username === "hello"
, то у васvar myData = hello;
что будет ужасно сломаться.Использование:
и это сработает. Это просто присвоение переменной JavaScript, а затем передача значения существующей переменной PHP. Поскольку PHP пишет здесь строки JavaScript, он имеет значение переменной PHP и может передавать ее напрямую.
источник