PHP+PostgreSQL(+Javascript)の質問です。


データベースを更新するだけのPHPファイル(update.php)を作成しました。
(update.phpのソースは、<?php から始まりレコードを更新する記述のみです。HTMLに関するタグなどは一切書いていません。)
あるページからボタンをクリックしたときにupdate.phpを裏で動作させたいのですが、何か良い方法はありませんでしょうか。

今は、あるページからJavascriptのwindow.open()でupdate.phpを開いてwindow.close()で閉じている状態です。
どうもすっきりしないので、PHPでもJavascriptでもいいので他に方法があったら教えてください。

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:2005/05/26 22:31:43
  • 終了:--

回答(10件)

id:jouno No.1

jouno回答回数280ベストアンサー獲得回数02005/05/26 22:40:50

ポイント10pt

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.hawk.34sp.com/stdpls/xml/xmlhttprequest.html

Hawk's W3 Laboratory : XML : XMLHttpRequestについて

id:ktoshi

ありがとうございます。

起動させる側のページのほうもphpにしています。

update.phpはincludeして使った方が良いのかなぁって気はしていたのですが、、、

SSIもXMLも使うような環境にないので、他に方法がなければincludeして使うことにします。

2005/05/26 22:50:53
id:jouno No.2

jouno回答回数280ベストアンサー獲得回数02005/05/26 22:44:13

ポイント10pt

訂正。こちらはポイント不要です。

SSIとPHPはつかえませんね。すいません。


ajaxともうひとつは、隠しIFRAMEをつくっておいて、

クリックのタイミングでjavascriptでよびだすという方法もあります。

id:ktoshi

了解しました。

ajaxというのまで勉強する余裕がないので、、、すみません。

後の方へ。PHPかJavascriptでできる別の方法をお待ちしています。

2005/05/26 22:54:20
id:PaulYamamoto No.3

Paul回答回数113ベストアンサー獲得回数22005/05/26 22:53:50

ポイント13pt

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 - ゼンド・ジャパン株式会社 技術情報コンテンツ

id:ktoshi

ありがとうございます。

私の方法ですと無意味なウィンドウが一瞬開かれてしますので「すっきり」しません。

標準的(何が標準かわかりませんが)なPHPのみで、対応できる方法があればいいのですが、、、でもありがとう。

2005/05/26 23:00:06
id:PaulYamamoto No.4

Paul回答回数113ベストアンサー獲得回数22005/05/26 23:10:31

ポイント10pt

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してるかどおかも分からない

id:ktoshi

なるほど。具体的な説明ありがとうございます。

このようにiFrameを使えばいいのですね。今までiFrameを使ったことがなかったのでこのようなやり方を想像できませんでした。

試してみます。

他にも方法がありましたらお願いします。

2005/05/26 23:20:48
id:upride No.5

upride回答回数220ベストアンサー獲得回数12005/05/26 23:11:10

ポイント23pt

1) update.php をupdate.inc にする

2) update.incの中身全体をfncUpdate{ 中身 } とする

3) 呼び元のphpに include( ”update.inc” ); を記述する

4) inc という拡張子をweb上からアクセスできない設定をwebサーバに施す

5) 関数fucUpdateを呼ぶ処理を書く


update.phpはおそらく更新処理だと思うので

勝手に直に呼ばれたくない処理ですよね

こんな感じにすると簡単で安全かと・・。

(この方法以外にもいい方法はたくさんありますが)

id:ktoshi

ありがとうございます。

関数化してそれを呼び出してデータベースを更新できるような事もできるんですね。

ちょっとやり方を調べてみます。

2005/05/26 23:30:33
id:english No.6

english回答回数304ベストアンサー獲得回数02005/05/26 23:12:47

ポイント20pt

<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に戻し、何も表示しないこと(=現在のウインドウを閉じるという動作に相応)も可能だと思います。

id:ktoshi

ありがとうございます。

今の私のレベルではちょっと理解するのが難しいです。

画像を呼び出すとみせかけてupdate用URLを無理やり開いてしまおう、っていう感じでしょうか。

2005/05/26 23:41:21
id:ke_ishi No.7

ke_ishi回答回数269ベストアンサー獲得回数02005/05/27 00:37:32

ポイント10pt

<script type=”text/javascript” src=”update.php”></script>


とか書いておくと、空のjavascriptファイルを読み込むような感じでphpファイルが処理されます。

id:ktoshi

ありがとうございます。

これだけだとどうやっていいのか分からないです、、、

includeと同じような意味合いでしょうか。

2005/05/27 08:21:48
id:wintarsnow No.8

wintarsnow回答回数103ベストアンサー獲得回数22005/05/27 01:12:38

ポイント10pt

「あるページ」は固定なのでしょうか?

もし固定なら、update.phpの最後に「あるページ」にリダイレクトする記述を加えるというのは如何でしょうか。

id:ktoshi

ありがとうございます。

この方法でいくとupdate.php(のウィンドウ)を開いてそのウィンドウに「あるページ」を表示させることになるので同じページが2つ表示されてしまいませんか?

すみません。リダイレクトするというのがどのような記述になるのかわからないので、、、

2005/05/27 08:31:01
id:typista No.9

typista回答回数359ベストアンサー獲得回数72005/05/27 12:52:58

ポイント24pt

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

id:ktoshi

ありがとうございます。

とりあえずincludeを使ってみました。

include_once、require_onceという命令もあるのですね。知りませんでした。

include_onceを使うほどでもなさそうですので、includeで対応することにします。

includeするupdate.phpに余分な改行が1つあったために、headerの呼び出しでエラーが出たのを探し当てるのに時間がかかってしまいました。1つ1つ調べながらやっているので苦労しています、、、みなさんに教えて頂けて助かります。

2005/05/27 22:25:24
id:wintarsnow No.10

wintarsnow回答回数103ベストアンサー獲得回数22005/05/27 13:53:53

ポイント10pt

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をまた読み込むので、見た目には裏で動作しているようになります。

id:ktoshi

ありがとうございます。

なんとか上手くできそうです。

2005/05/27 22:30:09

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません