データベースを更新するだけのPHPファイル(update.php)を作成しました。
(update.phpのソースは、<?php から始まりレコードを更新する記述のみです。HTMLに関するタグなどは一切書いていません。)
あるページからボタンをクリックしたときにupdate.phpを裏で動作させたいのですが、何か良い方法はありませんでしょうか。
今は、あるページからJavascriptのwindow.open()でupdate.phpを開いてwindow.close()で閉じている状態です。
どうもすっきりしないので、PHPでもJavascriptでもいいので他に方法があったら教えてください。
http://sagittarius.dip.jp/~toshi/Ajax/yui.html
~JavaScriptでXMLHttpRequest~
PHPならば、起動させる側のページのほうもphpにしてupdate.phpはなかみを関数化して、includeして関数呼び出ししては。
SSIでコマンド呼び出しができれば可能ですが、つかえないところがおおいようです。
汎用的なのはajaxで、クリックしたときに、javascriptで、update.phpを呼び出すことでしょうか。
http://d.hatena.ne.jp/keyword/Ajax
Ajaxとは - はてなダイアリー
http://www.scollabo.com/banban/ssi/
SSI$BF~Lg(B
http://www.hawk.34sp.com/stdpls/xml/xmlhttprequest.html
Hawk's W3 Laboratory : XML : XMLHttpRequestについて
訂正。こちらはポイント不要です。
SSIとPHPはつかえませんね。すいません。
ajaxともうひとつは、隠しIFRAMEをつくっておいて、
クリックのタイミングでjavascriptでよびだすという方法もあります。
了解しました。
ajaxというのまで勉強する余裕がないので、、、すみません。
後の方へ。PHPかJavascriptでできる別の方法をお待ちしています。
http://www.zend.co.jp/tech/index.php?PHP%A5%A2%A5%D7%A5%EA%A5%B1...
PHPアプリケーション - ゼンド・ジャパン株式会社 技術情報コンテンツ
「すっきり」の意味がよく分かっていませんが、
Smartyがひとつの解決策になるかと思います。
javaScriptからDB更新のphpを呼ぶのではなく、
DB更新のphpにそのまま遷移して、
DB更新のphpでは、更新処理後にSmartyを使って画面を表示する。
こうするとHTMLをSmartyのテンプレートに分けれるので、
僕的には「すっきり」感があります。
(実際そうしています)
http://www.zend.co.jp/tech/index.php?%A5%B3%A1%BC%A5%C7%A5%A3%A5...
コーディング指針/5.Smarty - ゼンド・ジャパン株式会社 技術情報コンテンツ
ありがとうございます。
私の方法ですと無意味なウィンドウが一瞬開かれてしますので「すっきり」しません。
標準的(何が標準かわかりませんが)なPHPのみで、対応できる方法があればいいのですが、、、でもありがとう。
http://www.devx.com/Java/Article/27685/0
iFrames + JSP = Enhanced Web Content Retrieval
すいませんやっと意味が分かりました。
隠しIframeが簡単でお勧めです。
具体的にはiFrameには
update.phpにsubmitするFormしかないHTML
を表示させ、
(Formしかないので見た目にはFrameがあるかどおかも分からない)
下のようなScriptでそのiFrameのなかのFormをSubmitする。
function checkName()
{
// Some Validation
//Set login_name field in the iframe’s page.
//Submit iFrame’s page.
window.frames[’iframe1’].document.forms[0].submit();
}
そうすると、見た目はpostしてるかどおかも分からない
なるほど。具体的な説明ありがとうございます。
このようにiFrameを使えばいいのですね。今までiFrameを使ったことがなかったのでこのようなやり方を想像できませんでした。
試してみます。
他にも方法がありましたらお願いします。
1) update.php をupdate.inc にする
2) update.incの中身全体をfncUpdate{ 中身 } とする
3) 呼び元のphpに include( ”update.inc” ); を記述する
4) inc という拡張子をweb上からアクセスできない設定をwebサーバに施す
5) 関数fucUpdateを呼ぶ処理を書く
update.phpはおそらく更新処理だと思うので
勝手に直に呼ばれたくない処理ですよね
こんな感じにすると簡単で安全かと・・。
(この方法以外にもいい方法はたくさんありますが)
ありがとうございます。
関数化してそれを呼び出してデータベースを更新できるような事もできるんですね。
ちょっとやり方を調べてみます。
<script type=”text/javascript”>
function updateSQL(image_name){
var url_sql = ”http://www.example.com”;
if(window.sidebar || document.layers || window.opera){
document.images[image_name].src = url_sql;
} else if(document.getElementById && navigator.userAgent.indexOf(”Win”) != -1){
document.getElementById(image_name).src = url_sql;
} else if(document.all){
document.all(image_name).src = url_sql;
}
}
</script>
<form>
<input type=button onClick=”updateSQL(’img1’);” value=”アップデートする”>
</form>
<img src=”/dummy.gif” width=1 height=1 id=”img1”>
のようにして、見えない画像のパスをJavascriptで動的に変えることで、サーバサイドのSQLにアクセスさせることが可能です。
(※全角のダブルクォテーションは半角に変えて読み替えてください。hatenaで投稿するとエスケープ処理がされるので・・・。)
ただし、この場合、SQLがアップデートできたかどうか、画像のパスとなるupdate用URLの結果を受け取るためには、もう一工夫必要になります。
その場合は、iframeタグを使い、<iframe src=”初期設定用のURL”></iframe>などとして、このiframe用のURLをJavascriptで動的に変えさせ、その内容を種とkするようにします。ウインドウを開かずに、同一ページ内のiframeで処理する方法です。処理が終われば、また、初期設定のURLに戻し、何も表示しないこと(=現在のウインドウを閉じるという動作に相応)も可能だと思います。
ありがとうございます。
今の私のレベルではちょっと理解するのが難しいです。
画像を呼び出すとみせかけてupdate用URLを無理やり開いてしまおう、っていう感じでしょうか。
<script type=”text/javascript” src=”update.php”></script>
とか書いておくと、空のjavascriptファイルを読み込むような感じでphpファイルが処理されます。
ありがとうございます。
これだけだとどうやっていいのか分からないです、、、
includeと同じような意味合いでしょうか。
「あるページ」は固定なのでしょうか?
もし固定なら、update.phpの最後に「あるページ」にリダイレクトする記述を加えるというのは如何でしょうか。
ありがとうございます。
この方法でいくとupdate.php(のウィンドウ)を開いてそのウィンドウに「あるページ」を表示させることになるので同じページが2つ表示されてしまいませんか?
すみません。リダイレクトするというのがどのような記述になるのかわからないので、、、
http://x-web.pobox.ne.jp/fphp/fphp_09.html
初めてのPHP 第3章 PHPの基本 P9
希望されているような動作を、ユーザIDを
登録するページと仮定して説明します。
★の付いている箇所がユーザIDをテキストボックスで
入力してから、DBを更新する処理にパラメータ渡し
するためのものです。
→ 情報渡しが必要なければ、★は削除してください。
①update.phpの処理を関数化
function updateDB() {
処理内容
}
②ボタンを押すとPOSTするページ
<form action=”userEntry.php” method=”POST”>
★<input type=”text” name=”usrID”>
<input type=”submit” value=”更新”>
</form>
③userEntry.php
include_once(”update.php”);
★if( $_POST[’usrID’] ) {
★$usrID = $_POST[’usrID’];
★updateDB($usrID);
header(”Location: http://hoge.php”);
} else {
★header(”Location: http://err.php”);
}
[補足1]
includeのほかに、include_once/require/require_onceがありますので、参考にしてください。
PHPのファイルが増えていくと、includeでは(多重に呼び出されることで)エラーとなる場合があります。
その場合は、include_onceを使うと、1度のみの読み込みが保証されるので、エラーを回避できます。
また、類似でrequireというのもありまして、この違いは、参考URLを見てください。
かえって難しくなってしまったら、ゴメンナサイ。
[補足2]
header(”Location: http://hoge.php”);
は、指定のURLへページをリダイレクト(転送)する関数です。
※header呼び出し以前に、printやechoをしていると
エラーになるのでご注意ください。
http://www.scollabo.com/banban/php/ref/ref_header.html
header()$B4X?t(B/PHP$B4X?t%j%U%!%l%s%9(B
ありがとうございます。
とりあえずincludeを使ってみました。
include_once、require_onceという命令もあるのですね。知りませんでした。
include_onceを使うほどでもなさそうですので、includeで対応することにします。
includeするupdate.phpに余分な改行が1つあったために、headerの呼び出しでエラーが出たのを探し当てるのに時間がかかってしまいました。1つ1つ調べながらやっているので苦労しています、、、みなさんに教えて頂けて助かります。
2回目失礼致します。1回目の補足ですが、
例えば、arupage.htmlに、update.phpへのリンクをはり、
update.phpには
<?php
DB更新処理
header(”Location: /arupage.html”);
?>
という風に、最後にarupage.htmlへリダイレクトする記述を加えます。
/arupage.htmlの部分はルートからのパスか、http://で始まるURLにします。
こうすると、arupage.htmlからupdate.phpをクリックすると、update.phpを実行してからarupage.htmlをまた読み込むので、見た目には裏で動作しているようになります。
ありがとうございます。
なんとか上手くできそうです。
ありがとうございます。
起動させる側のページのほうもphpにしています。
update.phpはincludeして使った方が良いのかなぁって気はしていたのですが、、、
SSIもXMLも使うような環境にないので、他に方法がなければincludeして使うことにします。