Как вызвать функцию PHP в JavaScript?

У меня есть

index.php

<select id="year_list" name="year_list" onchange="check_year_event('year_list', 'event_list');" > . . .  </select>

<select id="event_list" name="event_list" onchange="check_year_event('year_list', 'event_list');" > . . . </select>
.
.
.
<?php 
 function checkYearandEvent($year, $event) {
  $year_event = mysql_query("SELECT * FROM year_event WHERE year = '$event' AND event = '$event'")

  if (mysql_num_rows($year_event) > 0) {
   // do this
  }

 }
?>

myscripts.js

function check_year_event(year_id, event_id) {
 var year = document.getElementById(year_id).value;
 var event = document.getElementById(event_id).value;

 // call PHP function (but I don't know how): checkYearandEvent(year, event);

}

Мой вопрос заключается в том, как мне вызывать функцию PHP каждый раз, когда пользователь изменяет значение любого элемента select.


person Newbie Coder    schedule 12.05.2011    source источник


Ответы (6)


Вам нужно использовать аякс. Есть базовый пример:

myscripts.js

function AjaxCaller(){
    var xmlhttp=false;
    try{
        xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
    }catch(e){
        try{
            xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
        }catch(E){
            xmlhttp = false;
        }
    }

    if(!xmlhttp && typeof XMLHttpRequest!='undefined'){
        xmlhttp = new XMLHttpRequest();
    }
    return xmlhttp;
}

function callPage(url, div){
    ajax=AjaxCaller(); 
    ajax.open("GET", url, true); 
    ajax.onreadystatechange=function(){
        if(ajax.readyState==4){
            if(ajax.status==200){
                div.innerHTML = ajax.responseText;
            }
        }
    }
    ajax.send(null);
}

function check_year_event(year_id, event_id) {
 var year = document.getElementById(year_id).value;
 var event = document.getElementById(event_id).value;

    callPage('file.php?year='+year+'&'+'event=+'+event,document.getElementById(targetId));
}

файл.php

<?php 

     function checkYearandEvent($year, $event) {
      $year_event = mysql_query("SELECT * FROM year_event WHERE year = '$event' AND event = '$event'")

      if (mysql_num_rows($year_event) > 0) {
       // do this
      }

     }
    echo checkYearandEvent($_GET['year'], $_GET['event']);
?>
person Galled    schedule 12.05.2011
comment
что, если checkYearandEvent() нужно что-то вернуть в переменную javascript? - person Romantic Electron; 17.05.2013
comment
Вы можете распечатать <script type="text/javascript"> var foo=<? Php echo $yourvariable; ?>; </ Script> - person Galled; 17.05.2013
comment
я хочу использовать переменную javascript, а не отображать ее пользователю - person Romantic Electron; 17.05.2013
comment
Вы не можете скрыть переменные javascript для пользователей. - person Galled; 17.05.2013

Вы не сможете сделать это так, как вы, возможно, ожидаете. PHP выполняется на сервере до того, как браузер получит HTML. С другой стороны, JavaScript работает в браузере и не знает PHP (или любого другого языка на стороне сервера), используемого для создания HTML.

Чтобы «вызвать» функцию php, вы должны отправить запрос обратно на сервер (часто называемый AJAX). Например, у вас может быть сценарий checkYear.php, который проверяет событие и возвращает некоторый HTML-код, указывающий, прошла ли проверка успешно. Когда фрагмент HTML возвращается к JavaScript, вы вставляете его на страницу.

Надеюсь это поможет!

person jimbo    schedule 12.05.2011

JavaScript — это клиентский язык, PHP — серверный язык. Поэтому вы не можете вызывать функции PHP напрямую из кода JavaScript. Однако то, что вы можете сделать, это опубликовать запрос AJAX (он вызывает PHP-файл за кулисами) и использовать его для запуска вашего PHP-кода и возврата любых данных, которые вам нужны, обратно в JavaScript.

person RichW    schedule 12.05.2011

По сути, вы смешиваете сценарии на стороне сервера (PHP) и на стороне клиента (JS).

Однако это возможно - спасибо, например. в АЯКС. Поскольку вы не указали, что именно вам нужно сделать после изменения поля выбора, я могу только указать вам на некоторые ресурсы и предложить следующее:

  • изучить и начать использовать jQuery (jquery.com) — это поможет вам начать работу и поддерживать кроссбраузерную совместимость,
  • узнайте, как делать запросы AJAX (например, в функции, которую вы только что запускали, когда было запущено событие onchange) - например. используя функцию jQuery .post(),
  • научитесь возвращать данные из PHP (например, используя json_encode() в PHP, но необработанный HTML тоже подойдет) и использовать их в JS,
person Tadeck    schedule 12.05.2011

Способов сделать это может быть много. Я предпочитаю использовать объект MooTools Request.

Например, у вас есть скрипт с именем ajaxCallable.php, который получает через переменные $_REQUEST некоторые параметры, затем вы делаете (на стороне Javascript):

function check_year_event(year_id, event_id) {
    var year = document.getElementById(year_id).value;
    var event = document.getElementById(event_id).value;

    var myRequest = new Request({method: 'get', url: 'ajaxCallable.php'});
    myRequest.send('yearVar=' + year + '&eventVar=' + event);
}

тогда ваш ajaxCallable.php сможет получить доступ к переменным: $_REQUEST['yearVar'] и $_REQUEST['eventVar'].

person Nicolás Ozimica    schedule 12.05.2011

На этой неделе я работал над проектом и придумал простой способ вызова php-скрипта из onclick(). Это происходит так.

В этом случае я определяю вызов onclick() для элемента div с именем «sidebarItem»…

<a><div class="sidebarItem" onclick="populate('#content', 'help', 'open')">Click me for new content</div></a>

Затем я сделал простенькую JS-функцию, которая загружает внешний файл в целевой контейнер…

function populate($container, $page, $item){
$($container).load('cyclorama/includes/populate.php?$page='+$page+'&$item='+$item);}

Затем я пишу небольшой php-файл, который получает $page и $item, запрашивает базу данных и возвращает новый контент.

<?php
$page = $_GET['$page'];
$item = $_GET['$item'];
$getContentQuery = "SELECT content FROM myTable WHERE page='".$page."' AND item='".$item."'";
$content = mysql_query($getContentQuery, $db);
$myContent = mysql_fetch_assoc($content);
echo $myContent['content'];?>

PHP-скрипт повторяет новый контент, и он загружается в контейнер. Я думаю, что есть много мест, где это могло бы служить. Мне было бы интересно узнать, есть ли какие-то очевидные причины НЕ делать этого. Он не использует AJAX, только javascript и php, но он быстрый и относительно простой.

person e.w. parris    schedule 31.01.2013