Как я могу вызвать функцию Javascript после того, как PHP-скрипт написал XML-файл - PullRequest
1 голос
/ 06 октября 2011

У меня есть PHP-файл с оператором SELECT, который извлекает данные из базы данных MySQL. Затем он обрабатывает данные и записывает результаты в файл XML.

У меня есть файл JavaScript, который использует файл XML. Как вызвать функцию javascript, например, doStuff (), после того, как файл PHP загрузил данные и записал файл XML? Я мог бы назвать это после setTimeout (), но я надеюсь, что есть лучший способ.

XML-файл перезаписывается при каждом запуске PHP-скрипта. Таким образом, файл XML может уже существовать.

Есть ли какое-нибудь событие, после которого я мог бы запустить doStuff ()? Или способ определить, закончился ли скрипт PHP?

Есть предложения?

Спасибо.


UPDATE:

Вот еще несколько подробностей о том, что у меня есть.

У меня есть карта с формой. Когда пользователи отправляют форму, я использую Ajax для обработки формы. Вызывается функция PHP и выбираются данные из базы данных MySQL. Данные включают широту и долготу. Затем PHP-файл записывает XML-файл с этими данными. Затем файл javascript читает файл XML и размещает маркеры на карте.

PHP и JavaScript работают нормально. Проблема в том, что файл javascript запускается сразу же, как только загружается карта. Таким образом, данные в XML-файле (из предыдущего выбора формы) превращаются в маркеры. Если я удаляю XML-файл, то на карту не ставятся маркеры. JavaScript пытался использовать несуществующий XML-файл, как только он загружается. Его там нет, поэтому на карте нет маркеров. И это до того, как пользователь сделал какие-либо выборы в форме.

Мне нужен какой-то способ, чтобы функция javascript, загружающая файл XML, делала это только после того, как файл 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. Как я могу вызвать этот javascript после того, как новый XML-файл был написан?

Спасибо.

Ответы [ 3 ]

1 голос
/ 06 октября 2011

Вы можете сделать это легко, (не все необходимые вещи, такие как выполнение действий, если файл не может быть создан и т. Д., Позаботились, но основные функции здесь), вот так с этими двумя файлами:

<code><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>



и другой

<?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, функция die и т. Д., На мой взгляд, абсолютно непродуктивна (безопасность - это не то, о чем спрашивает вопрос!), Спрашивающий должен иметь возможность отделить, какой кодза то, что он ответил на его вопрос и что должно помочь ответчику подготовиться к запуску и тестированию.Например, простой mysql с dies позволит легко запустить ответ.Извините за это, но, к сожалению, мы должны прояснить некоторые очень основные основы несколько раз!

0 голосов
/ 07 октября 2011

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

Прежде всего, нет никаких причин для того, чтобыecho js от php, которому вы звоните, вы не хотите, чтобы ваш код распространялся таким образом, совсем нет!Я также повторяю некоторые js после fclose, но это строго связано с отправкой данных в виде массива вместо текста, только это, не более того.Никакой логики, никаких условий, никакого реального реального кода в конце концов!

Большие картинки в основном видны в таких строках:

request.onreadystatechange = updatePage;

Эта строка говорит, что всякий раз, когда мы вызывали скрипт phpготов, затем вызовите функцию updatePage ().

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

Практически функция, которую вы хотите выполнить после того, как php поместит ее в код на стороне клиента в этом конкретном месте, которое будет гарантировать, что ваша функция будет выполнена после того, как php будет готов, это место здесь:

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

или внутри любой другой функции такого рода, которая вызывается после того, как запрос готов.

Без этой функции, которая позволяет вернуть результат php (когда он будет готов) обратно клиенту, это не имеет значенияесли вы откроете функцию js после fclose или где-либо еще, у вас не будет возможности что-либо увидеть вообще.Вот почему я говорю, что вы видите маленькое изображение.

Вот и все, что еще .. вы можете позволить php сообщать вам, если файл успешно создан или нет, вы можете получить XML прямо на страницу, не создавая файл и т.д.... надеюсь, что вы сможете выполнять свою работу сейчас (изучите пример ... вы много выиграете).

0 голосов
/ 07 октября 2011

Хорошо, я использовал echo для вызова функции javascript в PHP сразу после fclose ($ file_handle);,Таким образом, функция javascript вызывается только после записи нового XML-файла.Спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...