スレッド表示 | フラット表示〕 全トピック 920 件中 306 番目 次≫ ≪前

親→子画面でのsubmit

created: 2005-12-09 00:38 | modified: 2005-12-12 09:29 | reply: 7

[2794] 親→子画面でのsubmit

user: たの | created: 2005-12-09 00:38
 おせわになっております。
現在、PHPでHPを作成しているのですが、行き詰って
しまったので教えてください。

親画面には、文字入力用のテキストボックスと
子画面を開くボタンがあります。

子画面には、テキストボックスがあります。

親画面のボタンをおすと、子画面が開き、子画面の
テキストボックスに親画面のテキストボックス内の
文字列が入る仕組みです。

ここまでは順調にいったのですが、子画面が開くと同時に、
子画面のテキストボックス内の文字列でSELECT文により、
抽出を行うところで、困っています。
というのは、子画面のテキストボックスの文字列を
どのようにして、PHPの変数にするかということです。

変数化にはsubmitが必要だと思いましたので、
子画面のbodyのところに、
<body onLoad="document.myform.submit();">
としたのですが、無限にサブミットがかかってしまい、
画面を閉じるしかなくなってしまいました。
しかし、サブミットができないと、変数化もできないため、
select文が発行できません。
どうしたらよいのでしょうか
reply: 2796 返信 編集 削除

[2796] サブミットされたかどうかの条件判断

user: ぱぴよん | created: 2005-12-09 09:42
たのさんはじめまして、ぱぴよんと申します。


もう少し詳しい処理が分からないです。

> <body onLoad="document.myform.submit();">
onLoadというのはページが全て読込まれたら発生するイベントです。
つまり、サブミットされ、ページが表示されればまたサブミットして・・・と繰り返されるのです。

無限にサブミットしたくないということですが、どういったことがしたいのでしょうか。
(子ウィンドウでの処理内容が分かりません)

サブミットされたことを判定してheader()などでページ遷移すれば無限にサブミットされるということはないです。
でもそういったことではないですよね?

onLoadを使わないでの子ウィンドウの処理です。
<form name="child_form" method="post">・・・</form>
// サブミットされた(POST)
if($_SERVER["REQUEST_METHOD"] == "POST") {
/* POST送信の時の処理 */

// サブミットされていないのでサブミットする
} else {
print "<language=\"javascript\">\n<!--\n".
" document.forms['child_form'].submit();\n".
"//-->\n</script>";
}

もしくは、bodyを表示するときに
if($_SERVER["REQUEST_METHOD"] == "POST") print "<body>";
else "<body onLoad=\"document.myform.submit();\">";
としてPOST送信されなければサブミットするなどです。
Parent: 2794  reply: 2801 返信 編集 削除

[2801] やりたい処理は以下の通りです

user: たの | created: 2005-12-09 21:47
ぱぴおんさん、お返事ありがとうございます。
私の説明が少々たりませんでした。
改めて説明させてもらいますと、
(DBのtableにNAME,SANKA,NOという項目があるとします。)

親画面:テキストに「test」と入っている
親画面:「子画面を開く」ボタンをおす
子画面:開く

この子画面が開くときに、初期表示として、

SELECT NAME,SANKA,NO FROM TABLE WHERE NAME = 'TEST';

の結果のNAME,SANKA,NOをそれぞれ子画面の該当のテキストに
表示させてやりたいのです。ちなみに、
このtestという文字列は、「子画面を開く」ボタンを
押したときに、子画面の該当のテキストボックスに
表示されていることは確認済みです。

あとは、この子画面のテキストボックスの内容を
どうにかして変数化させて、
SELECT文の抽出条件に設定させてやりたいわけです。
しかし、この変数化はフォームをサブミットしないと
できませんよね?子画面を開くと同時に、サブミットを
行い、テキストボックス内の文字列を変数に格納し、
SELECT文を行い、その抽出結果の3項目を子画面に
初期表示として表示させたいということなのです。
Parent: 2796  reply: 2803 返信 編集 削除

[2803] 処理の流れが理解できました

user: ぱぴよん | created: 2005-12-10 11:56
親ウィンドウで名前が選択された状態(実際はtext入力ですが)で
子ウィンドウを開くボタンが押されたら
theWin = window.open('子ウィンドウのURL', '', '');
theWin.document.forms['子ウィンドウのフォーム名'].elements['NAMEのテキスト名'].value = document.forms['親ウィンドウのフォーム名'].elements['NAMEのテキスト名'].value;
という形で子ウィンドウにNAMEの初期値ををセットしている
ということですね。

そして、子ウィンドウを自分自身にサブミットし、
SANKAとNOの情報についても初期値として表示させようということですね。


1つ提案があります。
親から子に渡すNAMEというデータが大容量でないのであれば(十数バイト)、
JavaScriptで値を渡すのではなく、GET送信するという方法です。

具体的には子ウィンドウを開くボタンが押されたときに
var name_value = document.forms['親ウィンドウのフォーム名'].elements['NAMEのテキスト名'].value;
theWin = window.open('子ウィンドウのURL?NAME='+name_value, '', '');
とし、子ウィンドウでは
<?php
$name = $_GET['NAME'];
$sql = "SELECT NAME,SANKA,NO FROM TABLE WHERE NAME = '{$name}';";



?>
とします。当然ですが、GET値が不正なものでないかなどのチェックは必要です。
(SQLインジェクション対策など想定外のデータは通さない処理)


そうではなく、どうしても子ウィンドウで自分自身にサブミットしたいのであれば、
前回私が紹介したように
サブミットされたかどうかの判断をし、
サブミットされていないのであればサブミットする仕組みを考える必要があると思います。
ただし、この場合はどういったときにサブミットが必要で
逆にいつサブミットが必要でないのかを十分に考え、
必要のないところでサブミットしてしまわないように
処理を考える必要があります。


あまり難しく考えずに対応できそうなのは
GETでNAMEを取得する方法なような気がします。
Parent: 2801  reply: 2804 返信 編集 削除

[2804] 処理ができました。

user: たの | created: 2005-12-11 15:27
ぱぴよんさん、ありがとうございます!
なんとか希望通りの処理にすることができました。

今までPOSTばっかり使っていたのですが、
GETってこういうときに使えるんだなと実感しました。

ただ、いままでなぜGETを使用しなかったかというと、
URL上に、渡す値等が表示されてしまうために、
セキュリティ上危険かなとおもっていたわけなんです。

けど、今回のHPでは特に問題がなさそうなので、
これでいくことにします。SUBMITを使うよりも、
スムーズに出来ましたので。やっぱ、このような処理を
するときには、パピヨンさんだったら、GETにしますか?
Parent: 2803  reply: 2805 2813 2815 返信 編集 削除

[2805] ふと思ったんですが

user: ach | created: 2005-12-11 16:08
親のフォームを
<form method="post" action="child.php" target="child">
ではだめなんでしょうか?
Parent: 2804  返信 編集 削除

[2813] GET

user: ごいんきょ。 | created: 2005-12-12 04:13
ページ遷移に使う場合は、GETにした方が便利な場合が多いですよ。
aタグで代替できるからです。

言わずもがな、かもしれませんが...
パスワードやアクセス権限などについては、もちろんPOSTです。
ページ内のリンクで他サイトへおもむくことで、リファラーをとられる可能性があるからです。
また、
$admin=1

で管理者と判断するような単純な構造だと、admin=1というパラメータをURLに付加するだけで、なりすましが行われてしまいます。

わかってると思いますが、POSTであっても、暗号化されない限り、経路上では丸見えなので、そこはお忘れなく。
Parent: 2804  返信 編集 削除

[2815] Re: パピヨンさんだったら、GETにしますか?

user: ぱぴよん | created: 2005-12-12 09:29
私の場合は、処理の内容とセキュリティ面について考えます。

なので今回のような場合必ずしもGETで処理をするということは
ありません^^;

ごいんきょ。さんがおっしゃるように認証にかかわるものを
GETで行うことはオススメできません。

なので処理に合わせてGET、POSTやSESSIONなどを使い分けています。


検索(データベースから特定の文字列にヒットするものを表示する)など
でHTMLにテーブル表示するような場合はGETで行っています。

ただし、そのGETが不正なものならチェックをして初期化します。
どんなデータでも自分が想定していないデータは通さないようにすることが大事だと思います。
(想定しているデータのみ通すということ)
Parent: 2804  返信 編集 削除
スレッド表示 | フラット表示〕 全トピック 920 件中 306 番目 次≫ ≪前
ページの一番上へ
Googleグックマークに登録 Yahooグックマークに登録 livedoorクリップに登録 @niftyクリップに登録 はてなブックマークに登録 deliciousに登録 Buzzurlに登録 FC2ブックマークに登録
最近更新された掲示板トピックス
管理人Blog
Yahoo Search

最近更新したNote
PHPマニュアル
今日のブックマーク
PHPマニュアル関数検索
関数名を入力し検索ボタンをクリック↑