JS関数を介してphp関数を実行する方法はありますか?
このようなもの:
<script type="text/javascript">
function test(){
document.getElementById("php_code").innerHTML="<?php
query("hello"); ?>";
}
</script>
<a href="#" style="display:block; color:#000033; font-family:Tahoma; font-size:12px;"
onclick="test(); return false;"> test </a>
<span id="php_code"> </span>
基本的に、php関数を呼び出す「Test」というhrefをクリックすると、php関数query("hello")
を実行します。
本質的に、これは AJAX がforであるということです。ページがロードされ、イベントを要素に追加します。ユーザーが何かをクリックするなどしてイベントをトリガーすると、Javascriptは XMLHttpRequestオブジェクト を使用してリクエストをサーバーに送信します。
サーバーが(おそらく出力で)応答した後、別のJavaScript関数/イベントにより、他のHTMLのようにページに貼り付けるなど、その出力を操作する場所が提供されます。
プレーンなJavaScriptを使用して「手作業」で実行するか、jQueryを使用できます。プロジェクトのサイズと特定の状況に応じて、単純なJavaScriptを使用する方が簡単な場合があります。
この非常に基本的な例では、ユーザーがリンクをクリックしたときにmyAjax.php
にリクエストを送信します。サーバーはいくつかのコンテンツ、この場合は「hello world!」を生成します。 id output
を持つHTML要素に配置します。
javascript
// handles the click event for link 1, sends the query
function getOutput() {
getRequest(
'myAjax.php', // URL for the PHP file
drawOutput, // handle successful request
drawError // handle error
);
return false;
}
// handles drawing an error message
function drawError() {
var container = document.getElementById('output');
container.innerHTML = 'Bummer: there was an error!';
}
// handles the response, adds the html
function drawOutput(responseText) {
var container = document.getElementById('output');
container.innerHTML = responseText;
}
// helper function for cross-browser request object
function getRequest(url, success, error) {
var req = false;
try{
// most browsers
req = new XMLHttpRequest();
} catch (e){
// IE
try{
req = new ActiveXObject("Msxml2.XMLHTTP");
} catch(e) {
// try an older version
try{
req = new ActiveXObject("Microsoft.XMLHTTP");
} catch(e) {
return false;
}
}
}
if (!req) return false;
if (typeof success != 'function') success = function () {};
if (typeof error!= 'function') error = function () {};
req.onreadystatechange = function(){
if(req.readyState == 4) {
return req.status === 200 ?
success(req.responseText) : error(req.status);
}
}
req.open("GET", url, true);
req.send(null);
return req;
}
HTML
<a href="#" onclick="return getOutput();"> test </a>
<div id="output">waiting for action</div>
PHP
// file myAjax.php
<?php
echo 'hello world!';
?>
試してみてください: http://jsfiddle.net/GRMule/m8CTk/
おそらく、それは多くのJavascriptコードです。もちろん、ブロックを強化するか、より簡潔な論理演算子を使用することで短縮できますが、まだ多くのことが行われています。プロジェクトでこの種の作業をたくさん行う予定がある場合は、javascriptライブラリを使用することをお勧めします。
同じHTMLと上記のPHPを使用すると、これがスクリプト全体になります(ページにjQueryが含まれます)。 jQueryの一般的なスタイルとの一貫性を保つために、コードを少し強化しましたが、次のように考えます。
// handles the click event, sends the query
var function getOutput() {
$.ajax({
url:'myAjax.php',
complete: function (response) {
$('#output').html(response.responseText);
},
error: function () {
$('#output').html('Bummer: there was an error!');
}
});
return false;
}
試してみてください: http://jsfiddle.net/GRMule/WQXXT/
まだjQueryに手を出さないでください。ライブラリを追加しても、プロジェクトに数百行または数千行のコードが追加されているのと同じように、プロジェクトにコードを作成したかのように確実に追加されます。 jQueryライブラリファイル内には、最初の例と同様のコードに加えて、さらに多くのコードがあります。それは良いことかもしれませんが、そうでないかもしれません。プロジェクトの現在のサイズと拡張の将来の可能性、およびターゲット環境またはプラットフォームを計画し、検討します。
これで十分な場合は、プレーンなJavaScriptを一度書くだけで完了です。
ドキュメント
XMLHttpRequest
- https://developer.mozilla.org/en/XMLHttpRequestXMLHttpRequest
on MSDN- http://msdn.Microsoft.com/en-us/library/ie/ms535874%28v=vs.85%29.aspxjQuery.ajax
- http://api.jquery.com/jQuery.ajax/PHPはサーバーで評価されます。 javascriptはクライアント/ブラウザで評価されるため、javascript 直接からPHP関数を呼び出すことはできません。ただし、AJAXを使用してPHP関数をアクティブにするサーバーにHTTPリクエストを発行できます。
JSからPHPを実行する唯一の方法はAJAXです。サーバーにデータを送信して(たとえば、GET /ajax.php?do=someFunction)、ajax.phpで次のように記述できます。
function someFunction() {
echo 'Answer';
}
if ($_GET['do'] === "someFunction") {
someFunction();
}
そして、JSで答えを見つけます(AJAXリクエストを行うためにjQueryを使用しています)
おそらく、何らかの形式の回答が必要になります。 JSONまたはXMLを参照してください。ただし、JSONはJavaScriptで簡単に使用できます。 PHPでは、json_encode($ array)関数を使用できます。引数として配列を取得します。
最近、さまざまな方法でPHP関数呼び出しを行うことができるjQueryプラグインを公開しました。 https://github.com/Xaxis/jquery.php
簡単な使用例:
// Both .end() and .data() return data to variables
var strLenA = P.strlen('some string').end();
var strLenB = P.strlen('another string').end();
var totalStrLen = strLenA + strLenB;
console.log( totalStrLen ); // 25
// .data Returns data in an array
var data1 = P.crypt("Some Crypt String").data();
console.log( data1 ); // ["$1$Tk1b01rk$shTKSqDslatUSRV3WdlnI/"]