PHP с Javascript - Какова область действия переменных PHP внутри тега <script></script>? - PullRequest
1 голос
/ 06 ноября 2011

Я пытаюсь смешать php и javascript, потому что мой javascript должен иметь доступ к некоторым переменным php при загрузке страницы.У меня проблемы с пониманием чего-то, и я сделал пример кода.

<?php
session_start();
$test = 100;
$_SESSION['test'] = 200;
?>
<html>
<head>
<title>Test This Out</title>
</head>
<body>
<h1> Testing Javascript and PHP Mixed </h1>
<p>
<?php 
echo("The value of \$test is $test and the value of \$_SESSION['test'] is ");
?>
</p>
<p>
<script type="text/javascript">
<?php 
session_start();
if(isset($test)) echo("document.write('Non-session variable exists and is $test <br />');"); 
else echo("document.write('Non-session variable does not exist<br />');");
if(isset($_SESSION['test'])) echo("document.write('Session variable exists <br />');"); 
else echo("document.write('Session variable does not exist<br />');");
?>
</script>
</p>
</body>
</html>

Вывод выглядит так:

Testing Javascript and PHP Mixed

The value of $test is 100 and the value of $_SESSION['test'] is

Non-session variable exists and is 100
Session variable exists 

Так что я пытаюсь понять, какие типы PHPпеременные доступны для сценария.Похоже, что переменная, которую я назвал $ test, доступна, но даже если она знает, что

$_SESSION['test'] 

существует, если я попытаюсь вывести это значение (точно так же, как я вывел

$test

(переменная), вся система зависает.

Мои вопросы: 1. Может ли php, используемый в javascript, "видеть" переменные, которые я определил ранее на странице?2. Почему я пытаюсь напечатать переменную

$_SESSION['test'] 

, что приводит к краху всего (ничего не отображается)?3. Нужен ли второй

session_start(), 

тот, который указан в сценарии?

Спасибо за любую помощь.

Ответы [ 2 ]

5 голосов
/ 06 ноября 2011

PHP работает на сервере, а Javascript - на клиенте. У них совершенно разные среды выполнения, и они выполняются в разное время. Переменные PHP имеют область видимости переменных PHP и правила JS не должны вступать в игру, поскольку PHP не выполняется в «среде JS». Это невозможно.

Вы можете использовать PHP GENERATE JS-код / ​​переменные, но эти переменные не обрабатываются / не выполняются / не проверяются механизмом JS до тех пор, пока ПОСЛЕ страница не была сгенерирована PHP и отправлено в браузер клиента.

Вы также можете иметь переменные JS для "отправки" в PHP, но это делается с помощью вызова AJAX, и снова JS запускается в браузере клиента, а PHP запускается на веб-сервере. Вызовы AJAX - это всего лишь обычный HTTP-запрос в отношении PHP, и когда ответ возвращается к JS, работающему в браузере, он похож на любой другой HTTP-ответ от сервера.

Ваш второй session_start() завершится сбоем - сеансы должны быть запущены ДО того, как сервер сгенерирует какие-либо выходные данные, так как токен идентификатора сеанса отправляется в браузер клиента в виде обычного файла cookie HTTP. PHP автоматически отправляет полные заголовки HTTP всякий раз, когда сценарий производит какие-либо выходные данные, и вы выводите начало HTML-страницы и некоторый код JS до выполнения второй session_start ().

Если у вас есть что-то вроде этого:

<script type="text/javascript">
var jsvar = <?php echo $phpvar; ?>;
</script>

Что касается движка PHP, то это совершенно правильный код PHP, и он выдаст любое содержимое $phpvar на тот момент. Но помните - PHP работает на сервере - движок PHP не имеет ни малейшего представления о среде, в которую вы выводите эту переменную. Он не знает, что находится внутри блока javascript, он просто знает, что должен выводить содержимое переменной. Если $ phpvar не определен в этот момент, вы на самом деле будете производить:

var jsvar = ;

и это синтаксическая ошибка. Это полностью до ВЫ , чтобы гарантировать, что вы используете PHP для генерирования действительного JAVASCRIPT code.l

0 голосов
/ 06 ноября 2011

Код, как он у вас сейчас есть, процедурный , означающий, что он будет выполняться со строки 1 до EOF в последовательном порядке, поскольку вы не выполняете никаких вызовов пользовательских функций и т. Д.

Вам не нужен 2nd session_start (), достаточно первого, чтобы инициализировать сеанс.

Никогда не слышал о зависании системы при попытке выгрузки переменной сеанса из var. Может быть, попробуйте этот формат (одинарные кавычки вместо двойных кавычек):

echo('The value of $test is ' . $test . ' and the value of $_SESSION[test] is ' . $_SESSION['test']);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...