从Javascript函数调用带有MySQL查询的PHP页面,然后将结果返回到另一个javascript函数

时间:2010-07-08 11:14:38

标签: php javascript mysql flash swfobject

我正在重构一些代码。我有一个包含MySQL查询的PHP页面,并将结果存储在PHP变量$ my_result中。然后,在使用SWFObject嵌入期间,此结果将回显到Flash SWF。

我现在想要调用这个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 个答案:

答案 0 :(得分:3)

调用是异步的。致电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。然后,在success函数中,我们使用单个参数(响应文本)调用回调。在show_tab中,我们传递一个匿名函数,该函数将单个参数(响应文本)作为getNewUploads参数传递给callback

答案 1 :(得分:0)

true中的xmlhttp.open("GET","dBaseConnect_uploadStep2.php", true);使其成为asynchronous因此错误。将其更改为:

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