Вызов страницы PHP с запросом MySQL из функции Javascript с последующим возвратом результатов в другую функцию Javascript - PullRequest
0 голосов
/ 08 июля 2010

Я рефакторинг некоторого кода.У меня есть страница PHP, которая содержит запрос MySQL и сохраняет результат в переменной PHP $ my_result.Этот результат затем отображается во Flash SWF во время встраивания с SWFObject.

Теперь я хочу вызвать эту страницу PHP, которая делает запрос из функции javascript следующим образом - одно изменение, которое я сделал в PHP, состоит в том, что вместо сохранения результата в переменной $ my_result я повторяю результат,

Функция Javascript для вызова страницы PHP и выполнения запроса к базе данных

function getNewUploads() {
if (window.XMLHttpRequest) {// code for IE7+, Firefox, Chrome, Opera, Safari
       xmlhttp=new XMLHttpRequest();
    }
    else {// code for IE6, IE5
       xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
    }
    xmlhttp.onreadystatechange=function() {
       if (xmlhttp.readyState==4 && xmlhttp.status==200) {
    alert(xmlhttp.responseText); // shows the correct output in an alert box
    return xmlhttp.responseText;
       }
    }
 xmlhttp.open("GET","dBaseConnect_uploadStep2.php",true);
 xmlhttp.send();    
}

Затем у меня есть встраивание Flash, которое я хочу выполнять только при нажатии определенной страницы на странице.и обрабатывается jabvascript -

function show_tab(tab_id) {

    $(tab_id).show();
    if(tab_id == "#tab_2") {
      var data_string = getNewUploads(); // CALLING THE FUNCTION TO CALL THE PHP QUERY  
      alert(data_string); // shows undefined in the alert box
      var so = new SWFObject(".....");          
      so.addVariable("theDataString", data_string); 
      so.write("flashcontent2");
    }
}

Так что, похоже, функция getNewUploads () не возвращает результат со страницы PHP.

Может кто-нибудь пролить свет на мою ошибку, пожалуйста.Спасибо

Ответы [ 2 ]

3 голосов
/ 08 июля 2010

Вызов асинхронный.После того, как вы позвоните send, вызов начнется в фоновом режиме.Тем временем getNewUploads возвращает.Позже назначенная вами функция вызывается с ответом.Когда вы делаете return xmlhttp.responseText, вы возвращаетесь из этой анонимной функции (назначенной onreadystatechange), а не из getNewUploads (что уже сделано).

Вместо этого вы можете использовать обратный вызов.Что-то вроде:

function getNewUploads(callback) {
    if (window.XMLHttpRequest) {// code for IE7+, Firefox, Chrome, Opera, Safari
       xmlhttp=new XMLHttpRequest();
    }
    else {// code for IE6, IE5
       xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
    }
    xmlhttp.onreadystatechange=function() {
       if (xmlhttp.readyState==4 && xmlhttp.status==200) {
         callback(xmlhttp.responseText);
       }
    }
    xmlhttp.open("GET","dBaseConnect_uploadStep2.php",true);
    xmlhttp.send();    
}

function show_tab(tab_id) {
    $(tab_id).show();
    if(tab_id == "#tab_2") {
      getNewUploads(function(data_string) {
        alert(data_string);
        var so = new SWFObject(".....");          
        so.addVariable("theDataString", data_string); 
        so.write("flashcontent2");
      }); // CALLING THE FUNCTION TO CALL THE PHP QUERY  
    }
}

Мы определяем getNewUploads, чтобы принимать один аргумент, callback.Затем в функции успеха мы вызываем обратный вызов с единственным аргументом - текстом ответа.В show_tab мы передаем анонимную функцию, которая принимает один параметр (текст ответа), в getNewUploads в качестве параметра callback.

0 голосов
/ 08 июля 2010

true в xmlhttp.open("GET","dBaseConnect_uploadStep2.php", true); делает его асинхронным и, следовательно, ошибкой. Измените его на:

function getNewUploads() {
  //initialize xmlhttp
  xmlhttp.open("GET", "dBaseConnect_uploadStep2.php", false);
  xmlhttp.send();    
  if(xmlhttp.status == 200) 
    return xmlhttp.responseText;
  else
    return "Oops :(";
}
...