На форумах очень часто можно встретить вопросы вроде:
Как передать переменную в JavaScript из PHP? или Как передать данные из PHP в JavaScript?
Эти вопросы выдают новичков и сейчас я постараюсь объяснить почему. А также ответить как же все-таки это сделать.
Почему вопрос о передаче переменной из языка в язык — вопрос новичка? Потому что невозможно это сделать! Языки программирования работают каждый самостоятельно. А передача напрямую между ними невозможна. Сейчас объясню почему.
Дело в том, что PHP и JavaScript связаны лишь условно. PHP работает на сервере, а JavaScript — в браузере.
Напомню алгоритм работы интернета. То есть, что происходит, когда вы запрашиваете адрес. Например, что должно произойти чтобы выполнилась JavaScript функция на странице http://dayte2.com.
Если посмотреть внимательно на этот порядок работы, можно ответить на вопрос
Нужно во время выполнения скрипта PHP просто сформировать такой текст, чтобы он потом мог выполниться в браузере. Например.
<?php
$var = 'Hello, world';
print '<script language="javascript">alert("'.$var.'");</script>
?>
Если вы создадите файл php с таким содержимым и запустите его из браузера — вы увидите пустую страницу и сообщение alert.
Разумеется, нужно помнить, что синтаксис должен быть JavaScript. Фактически, когда мы формируем код JS на PHP — мы должны помнить, что сначала php что-то сгенерирует и это что-то должно быть валидным JS.
В данном случае наш php-скрипт формирует строку:
<script language="javascript">alert("Hello, wordl");</script>
А это — вполне корректный JavaScript, который будет выполнен браузером.
Можно догадаться, тут дела обстоят труднее. Ведь php генерирует JS, а вот обратная связь не подразумевается особо. Так что хочешь-не хочешь, а придется формировать новый запрос к серверу, передавая в нем данные для скрипта. У нас есть два основных метода передачи данных. Реализация может быть как через синхронные, так и через асинхронные запросы. Синхронные вызовут перезагрузку страницы, а асинхронные используют Ajax.
<script language="javascript">
var message = encodeURIComponent('Hello, server!');
window.location.href = 'http://dayte2.com/index.php?message'+message;
</script>
Этот код немедленно перенаправит пользователя по адресу http://dayte2.com/index.php?message=Hello%2C%20server!
PHP-код в файле index.php получит данные из GET и сформирует суперглобальные массивы.
<?php
print $_GET[message];
?>
Это подразумевает использование Ajax. По сути, осуществляется то же, что и в предыдущем случае, но не перезагружается страница браузера. Проще всего это проиллюстрировать используя библиотеку jQuery.
<script src="http://yandex.st/jquery/1.5.0/jquery.min.js" type="text/javascript"></script>
<script language="javascript">
var message = 'Hello, server!';
$.get('http://dayte2.com/index.php', {message:message}, function(data) {
alert('Сервер ответил: '+data);
});
</script>
Как видим, все еще проще. Не нужно применять функцию encodeURIComponent, ее применяет за нас jQuery. Мы описываем функцию, которая принимает ответ сервера и складывает его в переменную data. Если index.php возвращает просто значение переменной $_GET[message], то мы увидим alert с текстом "Сервер ответил: Hello, server!".
Мы помним, что при генерации JavaScript из php, нужно придерживаться синтаксиса JavaScript. Поэтому нужно перевести данные из представления PHP в представление JavaScript. Проще всего это сделать, воспользовавшись форматом JSON и функцией json_encode(), которая превратит объект или массив php в строку, которая при выполнении движком JavaScript, даст объект JavaScript.
<?php
$arr = array('test'=>'123','key'=>'value');
$js_obj = json_encode($arr);
print "<script language='javascript'>var obj=$js_obj; alert(obj.test);</script>";
?>
Тут можно начать путаться. Но ничего страшного нет. Достаточно помнить последовательность. Сперва выполняется php, затем — JavaScript. После выполнения php получится:
<script language="javascript">var obj={"test":"123","key":"value"}; alert(obj.test);</script>
Что при выполнении выведет нам alert с текстом '123'.
Нужно помнить что php генерирует JS, поэтому передавать из него данные довольно просто. Нужно формировать JS так же, как формируется html. С соблюдением синтаксиса JavaScript.
Для передачи данных из JS в PHP всегда используется дополнительный запрос. Как он осуществляется — дело десятое. Например, может формироваться и отправляться форма. Или открываться iframe. Но суть остается. Понимая эту суть, можно перекидывать любые данные из браузера на сервер и обратно довольно просто.