人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

PHPの質問です。現在PHPはページが読みこまれるときに実行され、何か処理を行った場合リロードしてその結果を反映させてますが、Javascriptなど任意のタイミングで実行できるプログラムにPHPの関数を実行させ、リロードさせずに結果を得る事は可能でしょうか。

例えば、JavascriptのonChangeハンドラでPHPの関数を実行させフォームに入力されたデータをクエリ送信が押される前に検証しその結果をリロードせずに表示するということは可能でしょうか。

よろしくお願いします。

●質問者: sleepyhead
●カテゴリ:ウェブ制作
✍キーワード:JavaScript PHP クエリ タイミング データ
○ 状態 :終了
└ 回答数 : 5/5件

▽最新の回答へ

1 ● JULY
●30ポイント

http://www.php.net/manual/ja/function.eval.php

PHP: eval - Manual

原理的には、

JavaScript をブラウザで実行されるプログラム

PHP は Web サーバで実行されるプログラム

なので、JavaScript から PHP の関数を呼ぶことは出来ません。

それでも、なにか方法、となると、下記の eval という PHP の関数を使うと、擬似的に呼び出すことができる

でしょう(実証していません(^^;)。

原理としては、JavaScript からは、eval を使った PHP のページを呼び出すようにします。PHP 側は、POST

もしくは、GET で与えられた文字列を eval に与えてその結果を JavaScript 付きの HTML として出力します。

その HTML の JavaScript で HTML に埋め込まれている PHP の結果を取得し、必要な処理をする、といった

ことは出来そうな気がします。

ただし、重要な問題があります。POST や GET で指定された文字列をそのまま eval に渡すのは、

セキュリティ上、最悪のプログラミングです。もし実装するのであれば、eval に渡す前の処理や、

アクセス制限など、かなりの対策が必要だと思います。

それと、結局、必要な情報を Web サーバへ送ってその答えを取得するわけですから、「例えば〜」で

書かれているような、クエリ送信前にチェック、ということにはなりません。素直に、フォームのデータを

送って、PHP 側でチェックする方が良いでしょう。

◎質問者からの返答

ありがとうございます。Javascriptに実際画面には表示しない新しいウィンドウを生成させて処理を行い、値を取得して閉じると言う事でしょうか。(だと処理内容が決まってるのであればeval使う必要はない気がしますが)

どうにか一つのページで出来ないでしょうか…


2 ● yowatari
●40ポイント

yowatariです。答えは、「不可能」と思います。その理由は、PHPスクリプトは、Webサーバが、ソースのHTML文を解釈して実行して、クライアントにクライアント用HTML文を送信して、セッションを切ってしまいます。クライアントが、HTML文を受けて、JavaScriptを実行する時には、サーバから切り離されているので、サーバに連絡すつ手立てがsりません。

◎質問者からの返答

なるほど、ありがとうございます。

確かに考えてみればその通りです(汗


3 ● やちまう
●110ポイント

http://netw.ath.cx/postal2addr/

『郵便番号→住所』サンプル

JavaScriptはあくまでもクライアントサイド、PHPはサーバサイドであって、基本的には変数の連携は不可能です。ですので、イベントハンドラによってPHPが実行されても、その結果をJavaScriptに渡すことは出来ません。

あまりオススメ出来ませんが、PHP処理用のダミーのフレームを用意してサーバサイドの結果をクライアント側に受け渡し、そこからJavaScriptのコードの実行させるという方法を用いれば、入力フォームのページをリロードさせずに間接的に値を受け渡すことは可能です。

URLは『郵便番号→住所』の動作サンプルです。

◎質問者からの返答

ありがとうございます。ビックリしましたw

いいですねこれ!オモシロイです。

>>イベントハンドラによってPHPが実行されても、その結果をJavaScriptに渡すことは出来ません。

つまりJSで”PHPの関数を実行する”事は可能と言う事でしょうか?


4 ● JULY
●30ポイント

先に回答した JULY です。

任意の PHP 関数を実行、の話は、まぁ、無理やり考えると、なんで実用的じゃないのですが(^^;、

本来の目的は「JavaScript」でのチェックと、PHP でのチェックを一つにまとめたい、ということでは

ないかと思います。

であれば、PHP 側で工夫して、フォーム側の JavaScript を、PHP とうまく合うように生成してやる、という

ことになると思います。例えば、フォームの必須項目が満たされているかは、必須となる項目のパラメータ名

を列挙した配列を PHP 側に用意して、その配列を元に JavaScript で必須チェックをするプログラムを PHP で

自動的に生成することは、比較的容易だと思います。

ただ、使える文字種やパターンなど、こったチェックをしようとすると、とてつもなく難しくなる可能性が

高いです。それと、元になる Form とは無関係に、HTTP でデータを POST することは可能なので、JavaScript

でチェックしているから、受け取る PHP 側でチェックしなくても良い、ということはありません。ですので、

先に書いたような、「PHP 側で JavaScript を生成する」という辺りが、妥協点になると思います。

◎質問者からの返答

ありがとうございます。

>>PHP 側でJavaScriptを生成する

データベースの中身が相手にばれてしまう事になるので…(汗


5 ● やちまう
●30ポイント

http://netw.ath.cx/postal2addr/

『郵便番号→住所』サンプル

↑の説明補足です。

■メイン(入力フォーム)のフレーム

・各種フォーム部品

こちらのフォームに入力された値をダミーフレームのhidden属性のフォーム値に格納します。

onChangeなどのイベントハンドラによるJavaScriptコードはこちらで実行しますが、この時、

イベントハンドラによってメインではなくダミーフレームのフォームをsubmit()します。

■ダミー(非表示)のフレーム(PHP)

・hidden属性のフォーム

メイン(入力フォーム)のフレームのJavaScriptのコードの実行によって、

こちらのフォームがsubmitされて、実行結果が返されます。

このとき、実行結果の中にメインフレームのフォーム値を書き換えたり、

入力内容の訂正などを促したりするJavaScriptのコードを吐き出させます。

つまり、JavaScriptでPHPの関数を実行するのではなく、JavaScriptでダミーのフォームを

submitさせ、ダミーのフレーム(PHP)で新たにJavaScriptのコードを生成して、

それが実行されると、メインのフレームのフォーム値が書き換えられるということです。

◎質問者からの返答

ありがとうございます。なるほど、互いに実行しあってるって事ですね。

確かに値を取得するという動作はちょっと難しく、思いつかないですね…今回はそういう意味では諦めです(^^;

しかしイイ情報が得られたと思います。みなさんありがとうございました。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ