1

MySQL データベースからデータを取得する SELECT ステートメントを含む PHP ファイルがあります。次に、データを処理し、結果を XML ファイルに書き込みます。

XML ファイルを使用する JavaScript ファイルがあります。PHP ファイルがデータをダウンロードして XML ファイルを書き込んだ後で、doStuff() などの JavaScript 関数を呼び出すにはどうすればよいですか? setTimeout() の後に呼び出すこともできますが、もっと良い方法があることを願っています。

XML ファイルは、PHP スクリプトが実行されるたびに上書きされます。そのため、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() {}

このコードは機能しますが、PHP が新しい XML ファイルを書き込んだ後でのみこれらの JavaScript 関数を実行する必要があります。新しい XML ファイルが書き込まれた後、この JavaScript を呼び出すにはどうすればよいですか?

ありがとうございました。

4

3 に答える 3

1

簡単に実行できます (ファイルを作成できない場合にアクションを実行するなど、すべての必要な処理が行われるわけではありませんが、主な機能はここにあります)。次の 2 つのファイルを使用すると、次のようになります。

<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インジェクションのダイ関数などは、私の意見では完全に非生産的です(セキュリティは質問が求めるものではありません!)、質問者はコードが何であるかを分離できなければなりません彼の質問に答えてくれたことと、答えを実行してテストする準備をするのに何が役立つかについて。たとえば、金型を使用した単純な mysql を使用すると、アンスウェアをすぐに簡単に実行できます。申し訳ありませんが、残念ながら、いくつかの非常に基本的な基礎を明確にする必要があります。

于 2011-10-06T07:20:27.993 に答える
0

さて、fclose($file_handle); の直後に、echo を使用して PHP の JavaScript 関数を呼び出しました。. このようにして、JavaScript 関数は、新しい XML ファイルが書き込まれた後にのみ呼び出されます。ありがとうございました。

于 2011-10-06T21:09:33.367 に答える
0

あなたは絵の小さな断片を見ていると思います。fclose の後に js 関数をエコーし​​、これを信じることは、物事を実現させるのは少し不完全で誤解を招く事実です (以下に大きな写真を示します)。

まず第一に、呼び出す php から js をエコーする理由はまったくありません。コードがこのように拡散されることはまったく望ましくありません。私も fclose の後にいくつかの js をエコーし​​ますが、これはテキストではなく配列としてデータを送信することに厳密に関連しています。これだけです。結局、ロジックも条件も実際のコードもありません!

大きな写真は、主にこの種の行で見られます。

request.onreadystatechange = updatePage;

この行は、呼び出した php スクリプトの準備ができたら、updatePage() 関数を呼び出すことを示しています。

私のポイントは、クライアント側の実行フローから php スクリプトを除外し、そこに js を配置しないでください。すべての関数、ロジック、条件、およびクライアント側のワークフローをクライアント側のコードに入れる必要があるということです。

実際には、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 に答える