1

我有一个 PHP 文件,其中包含一个从 MySQL 数据库中提取数据的 SELECT 语句。然后它处理数据并将结果写入 XML 文件。

我有一个使用 XML 文件的 javascript 文件。在 PHP 文件下载数据并写入 XML 文件后,如何调用 javascript 函数,例如 doStuff()?我可以在 setTimeout() 之后调用它,但我希望有更好的方法。

每次 PHP 脚本运行时,XML 文件都会被覆盖。因此,XML 文件可能已经存在。

是否有一些事件可以让 doStuff() 触发?还是一种确定 PHP 脚本是否完成的方法?

有什么建议么?

谢谢你。


更新:

这里有一些关于我所拥有的更多细节。

我有一张带表格的地图。当用户提交表单时,我使用 Ajax 来处理表单。调用 PHP 函数并选择 MySQL 数据库中的数据。数据包括纬度和经度。然后 PHP 文件用这些数据写入一个 XML 文件。然后,javascript 文件读取 XML 文件并在地图上放置标记。

PHP 和 javascript 工作正常。问题是,一旦地图加载,javascript 文件就会立即触发。因此,xml 文件中的数据(来自先前的表单选择)变成了标记。如果我删除 xml 文件,则地图上不会放置任何标记。javascript 尝试在加载后立即使用不存在的 xml 文件。它不存在,因此地图上没有放置任何标记。这是在用户在表单中做出任何选择之前。

我需要一些方法来让加载 XML 文件的 javascript 函数只有在 XML 文件被写入之后才会这样做。

我正在关注本教程。我必须对其进行调整才能使其在 WordPress 插件中工作。

在我的 PHP 中,我有:

//Creates XML
//each marker has a lat and long
$my_xml ='<?xml version="1.0" ?>';
$my_xml .= '<markers>';

foreach($csf_data as $incident) {
    $my_xml .='<marker lat="'. $incident->latitude.'" lng="'.$incident->longitude.'" type="resto" />'; 
}

$my_xml .= '</markers>';

//Creates the XML file 
//(I've hardcoded markers.xml's path for now-- will change later)
$file_handle = fopen('/Users/myname/Sites/mysite/wp-content/plugins/myplugin/markers.xml', 'w');
fwrite($file_handle, $my_xml);
fclose($file_handle);

在javascript中,我有:

function downloadUrl(url,callback) {

 var request = window.ActiveXObject ?
     new ActiveXObject('Microsoft.XMLHTTP') :
     new XMLHttpRequest;

 request.onreadystatechange = function() {

   if (request.readyState == 4) {
     request.onreadystatechange = doNothing;
     callback(request, request.status);
   }
 };

 request.open('GET', url, true);
 request.send(null);

}


var customIcons = {
  resto: {
    icon: 'http://labs.google.com/ridefinder/images/mm_20_blue.png',
    shadow: 'http://labs.google.com/ridefinder/images/mm_20_shadow.png'
  },
  bar: {
    icon: 'http://labs.google.com/ridefinder/images/mm_20_red.png',
    shadow: 'http://labs.google.com/ridefinder/images/mm_20_shadow.png'
  }
};


downloadUrl("http://mysite/wp-content/plugins/myplugin/markers.xml", function(data) {
 var xml = data.responseXML;

  var markers = xml.documentElement.getElementsByTagName("marker");

  for (var i = 0; i < markers.length; i++) {
    var type = markers[i].getAttribute("type");
    var point = new google.maps.LatLng(
        parseFloat(markers[i].getAttribute("lat")),
        parseFloat(markers[i].getAttribute("lng")));
   
    var icon = customIcons[type];
    var marker = new google.maps.Marker({
      map: map,
      position: point,
      icon: icon.icon,
      shadow: icon.shadow
    });

 
  }});



function doNothing() {}

此代码有效,但我需要这些 javascript 函数仅在 PHP 编写新的 XML 文件后运行。编写新的 XML 文件后如何调用此 javascript?

谢谢你。

4

3 回答 3

1

您可以轻松地做到这一点,(并非所有必需的事情,例如在无法创建文件时采取行动等......但主要功能在这里)就像这两个文件一样:

<html>
<head>
<script type="text/javascript">

var sq="'"; 
var dbq="\"";
var request = false;
try { 
  request = new XMLHttpRequest(); 
} catch (trymicrosoft) {                         
  try { 
    request = new ActiveXObject("Msxml2.XMLHTTP"); 
  } catch (othermicrosoft) {
    try {
      request = new ActiveXObject("Microsoft.XMLHTTP");
    } catch (failed) {                  
      request = false;       
    }
  }
}


if (!request) 
  alert("Error initializing XMLHttpRequest!"); 
</script>

<script type="text/javascript">

   function makeFile( ) 
   {    
        var url = "createXml.php";  
        var params = "makeFile=1&limit="+document.getElementById('select').value+"";
        request.open("POST", url, true);  

        //Some http headers must be set along with any POST request.
        request.setRequestHeader("Content-type", "application/x-www-form-urlencoded;charset=utf-8");
        request.setRequestHeader("Content-length", params.length);
        request.setRequestHeader("Connection", "close");

        request.onreadystatechange = updatePage;
        request.send(params);

   }////////////////////

      //You're looking for a status code of 200 which simply means okay.
   function updatePage() {
     if (request.readyState == 4) {
       if (request.status == 200) 
       {    
            //run the js created by php
            eval(request.responseText);  
            //get tha needed info
            document.getElementById('divResults').innerHTML=response[0]+
            '<input type='+dbq+'submit'+dbq+' value='+dbq+'Get it..'+dbq+
            ' onclick='+dbq+'getXmlFile('+sq+response[1]+sq+')'+dbq+'; >' ; 
       } 
       else{
         //alert("status is " + request.status);
         }
     }
   }//////////////////////////////////////////////////////////////////


   function getXmlFile(fileName) 
   {  
        var url = fileName; 
        var params = null; 
        request.open("POST", url, true);     
        request.setRequestHeader("Connection", "close");    
        request.onreadystatechange = displayFile;
        request.send(params); 
   }////////////////////



      function displayFile() {
     if (request.readyState == 4) {
       if (request.status == 200) 
       {    
            document.getElementById('textareaResults').innerHTML=request.responseText;
            document.getElementById('divResults').innerHTML=
            'File loaded in text area below. '+
            '<font size=1>You could also load these data directly to a js variable using php '+
            'without creating a file...</font>' ;


       } 
       else{
         //alert("status is " + request.status);
         }
     }
   }

</script>
</head>
<body >


How many records from Mysql to put into XML file? <br>
<font size=2>(This is just for testing...)</font> <br> <br>
<select id="select">
  <option value="10">10</option>
  <option value="20">20</option>
  <option value="30">30</option>
  <option value="40">40</option>
</select> <span style="background-color:red;color:yellow;border: 5px solid gray;"  
onClick="makeFile( )"/> Click To Go.. </span>

<br> <br>
<div    id="divResults">Thank you!</div>


<textarea rows="10" cols="88"  id="textareaResults">
</textarea>



</pre>
</body>
</html>

和另一个

<?PHP 
/**
Mysql
*/
mysql_connect('localhost', 'root',''); 
mysql_select_db("mysql"); 
$query="select * from help_category limit ".$_POST['limit'].";";  
$resultID = mysql_query($query ) or die("Data not found."); 

$xml_output = "<?xml version=\"1.0\"?>\n"; 
$xml_output .= "<records>\n"; 

for($x = 0 ; $x < mysql_num_rows($resultID) ; $x++){ 
    $row = mysql_fetch_assoc($resultID); 
    $xml_output .= "\t<record>\n"; 
    $xml_output .= "\t\t<help_category_id>" . $row['help_category_id'] . "</help_category_id>\n";  
    $xml_output .= "\t\t<name>" . $row['name'] . "</name>\n";  
    $xml_output .= "\t\t<parent_category_id>" . $row['parent_category_id'] . "</parent_category_id>\n"; 
    $xml_output .= "\t</record>\n"; 
} 

$xml_output .= "</records>"; 

/**If an xml file wanted or not
*/
if($_POST['makeFile']==1)
{
    $dbq="\"";
    //same queries will make the same file name
    $fileName=md5($query).'.xml';
    //check if the file exists
    if(!file_exists($fileName))
    {
        //create a new file for writing
        $fp = fopen($fileName, 'w');
        fwrite($fp,  $xml_output); 
        fclose($fp);
        echo "var response = new Array( ); response[0]=".$dbq.'A new file created..'.$dbq.";  
        response[1]=".$dbq.$fileName.$dbq.";   ";
    }
    else
    {   
        echo "var response = new Array( ); response[0]=".$dbq.'File exists and waiting..'.$dbq.";  
        response[1]=".$dbq.$fileName.$dbq.";   ";
    }
}
/**If results are required directly to the page send them
*/
else
    echo 
        $xml_output;

?> 

注意 这个脚本的目的是快速展示如何完成这个人要求的这些事情。在我看来,对于 sql 注入死函数等,否决这个答案(就像以前发生的那样 - 不仅对我来说 - )完全没有生产力(安全不是问题所要求的!),提问者必须能够区分什么代码是回答他的问题以及帮助回答准备运行和测试的方法。例如,带有 dies 的简单 mysql 将使立即运行 answear 变得容易。对此感到抱歉,但不幸的是,我们有时必须明确一些非常基本的基础!

于 2011-10-06T07:20:27.993 回答
0

我想你看到的是图片的一小部分。在 fclose 之后呼应 js 函数并相信这是使事情发生的事实有点不完整和误导(将在下面说明什么是大图)。

首先,根本没有理由从您调用的 php 中回显 js,您不希望您的代码像这样传播,一点也不!我也在 fclose 之后回显了一些 js,但它与将数据作为数组而不是文本发送严格相关,仅此而已。没有逻辑,没有条件,毕竟没有真正的代码!

大图主要体现在这种线条中:

request.onreadystatechange = updatePage;

这一行表明,只要我们调用的 php 脚本准备就绪,就调用 updatePage() 函数。

我的观点是,您应该将 php 脚本排除在客户端执行流程之外,不要将 js 放在那里,您的所有功能、逻辑、条件和客户端工作流程都应该放在客户端代码中。

实际上,您希望在 php 之后执行的功能将其放入您的客户端代码中的特定位置,以确保您的函数在 php 准备好后执行,该位置在这里:

   function updatePage() {
     if (request.readyState == 4) {
       if (request.status == 200) 
       {//place me here 

或在请求准备好后调用的任何其他此类函数中。

如果没有这个可以将 php 结果(只要准备好)返回给客户端的功能,那么在 fclose 或其他任何地方回显 js 函数都没有关系,你根本没有机会看到任何东西。这就是为什么我说你看小图。

就是这样,还有什么..如果文件创建成功与否,您可以让php通知您,您可以直接将xml获取到页面而无需创建文件等...希望您现在可以完成您的工作(研究示例.. . 你会受益良多)。

于 2011-10-06T22:23:52.530 回答
0

好的,我在 fclose($file_handle); 之后使用 echo 调用了 PHP 中的 javascript 函数。. 这样,只有在编写新的 XML 文件后才会调用 javascript 函数。谢谢你。

于 2011-10-06T21:09:33.367 回答