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から渡された結果は、結果欄に表示するという仕様です。
受け渡し際のクエリは下記のような感じで飛んでいきます。
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関数を呼び出してみる
ってことで、実行イメージ。
引数は、関数内に直接代入されるため、””でくくる必要があります。
一応、複数の引数を与えることも可能。
ただ、PHPの関数の戻り値がばらばらだったりするので、関数によってはこれではうまく動作しません。
sortとかは与えた配列に対して直接ソートを実行するという仕様なので、うまくいかなったり。
下記のように、関数からの戻り値を返さないようにPHP側の処理を変更すれば一応対応できますが。
$const = "$method($args);";
その代わり受け渡し方もちょっと特殊になる。
しかも、これじゃさっきのdate関数のように関数の実行結果を返すようなことには対応できなくなりますが・・・。
あと、セキュリティ度返しにしたやりかたなんで、その辺考慮しておかないと外部からPHPの処理ができてしまうということにももちろんなりますけどね。
[PR]
[PR]
関連記事
PHPのセッションアダプションによって任意のセッションIDが受入れられる
jQuery UI Sortableを使ってドラッグ&ドロップでリストを並び替える
Twitter入力フォームのように文字カウントしてくれるcharacter count
[jQuery] 外部JavaScriptファイル読込みに関する考察
Googleサジェストが実装できるjQuery Autocomplete Mod
高機能でカスタマイズも容易なWYSIWYGエディタ [CKEditor]