web-dev-qa-db-ja.com

JavaScriptからphp関数を呼び出す

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")を実行します。

74
Jason Russell

本質的に、これは AJAXforであるということです。ページがロードされ、イベントを要素に追加します。ユーザーが何かをクリックするなどしてイベントをトリガーすると、Javascriptは XMLHttpRequestオブジェクト を使用してリクエストをサーバーに送信します。

サーバーが(おそらく出力で)応答した後、別のJavaScript関数/イベントにより、他のHTMLのようにページに貼り付けるなど、その出力を操作する場所が提供されます。

プレーンなJavaScriptを使用して「手作業」で実行するか、jQueryを使用できます。プロジェクトのサイズと特定の状況に応じて、単純なJavaScriptを使用する方が簡単な場合があります。

プレーン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ライブラリー(jQueryなど)

おそらく、それは多くの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を一度書くだけで完了です。

ドキュメント

139
Chris Baker

PHPはサーバーで評価されます。 javascriptはクライアント/ブラウザで評価されるため、javascript 直接からPHP関数を呼び出すことはできません。ただし、AJAXを使用してPHP関数をアクティブにするサーバーにHTTPリクエストを発行できます。

15
Dor

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)関数を使用できます。引数として配列を取得します。

11
morsik

最近、さまざまな方法で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/"]
2
Xaxis