JavaScriptからPHPの関数呼び出し | A Day In The Boy's Life

A Day In The Boy's Life

とあるエンジニアのとある1日のつぶやき。

javascriptからphpの関数呼び出し @ 楽天 みんなで解決!Q&A


こういうのを見つけて、PHP側で処理をまとめてそれを呼び出すのってよくあったりしますが、PHP関数自体を直接呼び出すのってニーズってあんのかな?とか思いつつもちょっと面白そうだったので書いてみることに。



JavaScriptからPHPの関数と引数を渡す


まずは、クライアント側のJavaScript。

直接書くと色々面倒なのでjQueryでAjax使ってます。


<html xmlns="http://www.w3.org/1999/xhtml" lang="ja" xml:lang="ja">
<head>
<meta http-equiv="content-language" content="ja" />
<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
<script type="text/javascript" src="http://www.google.com/jsapi"></script>
<script type="text/javascript">google.load("jquery", "1.4");</script>
<script>
$(document).ready(function(){
    $("#btn").click(function() {
        var method = $(":input").serializeArray();
        $.ajax({
            dataType: "json",
            data: method,
            url: "http://www.example.com/do.php",
            success: function(data) {
                $.each(data, function(i,item){
                    $("#result").append(item);
                });
            }
         });
    });
});
</script>
</head>
<body>
関数名<input type="text" name="method" size="30" /><br />
引数  <input type="text" name="args" size="30" />
<input type="button" value="送信" id="btn" />
<br />
<b>結果</b><span id="result"></span>
</body>
</html>


jQueryのソースはGoogleにホストとしているものを呼び出しています。

関数名と引数名はあえて分けてますが、一緒にしてコードそのものを書いてしまってもよいかもしれません。


serializeArray()によって、テキストボックスに入力された値をJSON形式に変換し、$.ajaxによってdo.phpにそのデータを渡しています。

do.phpから渡された結果は、結果欄に表示するという仕様です。

受け渡し際のクエリは下記のような感じで飛んでいきます。


A Day In The Boy&#39;s Life-JavaScriptからPHP関数を利用する-1


JavaScriptから渡された値を元にPHPで関数を実行する


次は、PHP側の処理。

受け取ったリクエストを元に関数と引数を結合してevalで実行するような仕様です。


<?php

if (!empty($_GET['method'])) {
    $method = $_GET['method'];
    $args   = empty($_GET['args']) ? "" : $_GET['args'];

    $const = "\$val = $method($args);";

    $flg = @eval($const);
} else {
    $flg = FALSE;
}

if ($flg === FALSE) {
    echo "syntax error";
} else {
    echo json_encode($val);
}


実行結果は、jQuery側で処理しやすいようにJSON形式に変換して戻してます。

後述しますが、関数の仕様によっては上記の仕様でうまく結果が返らない場合もあります。



JavaScriptからPHP関数を呼び出してみる


ってことで、実行イメージ。


A Day In The Boy&#39;s Life-JavaScriptからPHP関数を利用する-2


引数は、関数内に直接代入されるため、””でくくる必要があります。

一応、複数の引数を与えることも可能。


A Day In The Boy&#39;s Life-JavaScriptからPHP関数を利用する-3


ただ、PHPの関数の戻り値がばらばらだったりするので、関数によってはこれではうまく動作しません。

sortとかは与えた配列に対して直接ソートを実行するという仕様なので、うまくいかなったり。

下記のように、関数からの戻り値を返さないようにPHP側の処理を変更すれば一応対応できますが。


    $const = "$method($args);";

その代わり受け渡し方もちょっと特殊になる。


A Day In The Boy&#39;s Life-JavaScriptからPHP関数を利用する-4

しかも、これじゃさっきのdate関数のように関数の実行結果を返すようなことには対応できなくなりますが・・・。

あと、セキュリティ度返しにしたやりかたなんで、その辺考慮しておかないと外部からPHPの処理ができてしまうということにももちろんなりますけどね。