JavaScriptからphp関数を呼び出す


80

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関数query("hello")を呼び出す「Test」というhrefをクリックすると、php関数を実行したいと思います。


4
単にいいえ、ajaxを使用して必要なメソッドを呼び出す以外にこれを行う方法はありません。
TheVillageIdiot 2011

9
ご存知のとおり、PHPはサーバー上で実行されますが、JSはクライアント上で実行されますか?これこのように機能しません
KingCrunch 2011

待って待って、<?php query("hello"); ?>ページがロードされたときにphpによってレンダリングされませんか?はいの場合、彼はquery("hello")js関数での出力を取得できます。
TheVillageIdiot 2011

上記のコードが間違っていることはわかっていますが、それを使用して必要なものを示しました
Jason Russell

回答:


144

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

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

プレーンなJavascriptを使用して「手動で」実行することも、jQueryを使用することもできます。プロジェクトのサイズや特定の状況によっては、プレーンなJavascriptを使用する方が簡単な場合があります。

プレーンJavascript

この非常に基本的な例ではmyAjax.php、ユーザーがリンクをクリックしたときににリクエストを送信します。サーバーはいくつかのコンテンツ(この場合は「helloworld!」)を生成します。idを使用してHTML要素に挿入しますoutput

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 et al)

間違いなく、それは多くのJavascriptコードです。もちろん、ブロックを締めたり、より簡潔な論理演算子を使用したりすることで、これを短縮できますが、まだ多くのことが行われています。プロジェクトでこの種のことをたくさん行うことを計画している場合は、javascriptライブラリを使用したほうがよい場合があります。

上記と同じHTMLとPHPを使用して、これがスクリプト全体です(jQueryがページに含まれています)。jQueryの一般的なスタイルとの一貫性を高めるためにコードを少し厳しくしましたが、次のようなアイデアが得られます。

// handles the click event, sends the query
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を書いてください、そして、あなたは終わりです。

ドキュメンテーション


3
-1、半分の答え、OPはjavascriptからphp関数を呼び出す方法を尋ねました。Pouは、phpPAGEの呼び出し方法のみを示しました。ajax呼び出しにpost変数を追加し、phpでそれらのpost変数をチェックしてから、それらのpost変数が存在する場合はそのphp関数を呼び出す必要があります。
MH

6
@Hanoncsサーバー側コードの配置がほぼ無限にあるため、OPが使用しているアーキテクチャを推測することは、建設的ではなく、不可能ですらあります。OPはPOST(またはGET)または値を渡す必要性を参照しないため、これは当面の問題ステートメントと密接な関係はありません。あなたの反対票は見当違いだと思います。OPに含まれていない主題についての恣意的な憶測を私の答えに追加するつもりはありません。フィードバックをありがとう。
クリスベイカー

コードを使用すると、関数宣言の前に「var」が使用されているため、エラーが発生します。「var」を削除すると機能します。
ジェイデンローソン

16

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


3
@Hanoncs:これ答えです。OPは、JSを介してPHP関数を実行できるかどうかを尋ねました。答えは-できません。彼が、PHP関数を実行するPHPスクリプトをWebサーバーにアクティブ化させるHTTP要求を発行できるかどうかを尋ねた場合、それは可能です。しかし、彼はこれを求めませんでした、エルゴ私は無関係なデータを書きません。
Dor 2015

8
ハハは男に来ます、あなたはそれがOPが彼の質問によって意味したことを知っています。もし彼がそれを正確に説明する方法を知っていれば、彼はすでにそれを行う方法を知っているでしょう。
MH

11

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


3

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

4
JavaScriptを介してPHP関数を呼び出すことに関して人々が持っている明らかなバイアスは別として、私の答えがそれと同じくらい反対票を投じられた理由を正確に説明してください。私は手元の質問に合法的に解決策で答えていますね。
xaxis 2014年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.