WEB相談室

Webページ作成に関しての何でも掲示板です。

タイトル:JavaScriptで実行させたcgi(perlで記述)に引数を渡したい

0:[投稿] ぴぴ [2004/03/12 21:30 ][環境:Windows2000、IE6.0 Linux(Turbo)、CGI、Apache1.3.26、perl5.6.1]

こんばんは、ぴぴと申します。
以前にも投稿させていただきました。
その際はお世話になり、ありがとうございました。
再度相談させて下さい。

今回は、perlの中にJavaScriptを埋め込ませているのですが、
そのJavaScriptからaction属性でcgiを起動した際に付けたパラメーターを、アクション先のcgiで受け取るということをしたいのですが、上手くいきません。(なおcgiを起動させるためのボタンは別フレームにありますので下記のような記述です)

document.form_f2.target = "_blank";
document.form_f2.action = "./delete.cgi?no_id="+enq_value+"user_id=$u_id";(引数として渡して実行)
document.form_f2.submit();

この中にあるenq_valueに格納されている変数とuser_idを渡したいのです。$u_idはperlですでに上位のプログラムから引きついているものなので問題なく渡せます。なお、no_idを格納しているenq_valueはJavaScript側で初めて定義したものです。

受け取る側のcgiの記述は下記です。
my $no_id              = $in{'no_id'};
my $u_id             = $in{'u_id'};
これだと$u_idだけが上手く渡せます。
おそらくこれを実行するためのJavaScriptが定義されているcgiの中に、すでに<input type = "hidden"…>で定義してあるからだと思います。
なので$no_idの値を受け渡すには、別の方法じゃなきかとダメかと思い、調べたらCGI.pmのparamメソッドがあったので試しました。

my $no_id          = param("no_id");
$no_id             = int($no_id);
そうしたら「&main::paramは定義されていません(undefined)」の意味の文がアパッチのエラーログに出ていました。
なおマシンの中のCGIモジュールディレクトリ、CGI.pmファイルには読み取り権限はありました。useでCGIモジュール取り込みもしています。

このno_idが上手くaction先のcgiに渡せないと、
これを基にして実行されるSQL文が発行できない状態です。

また、SQL文を発行した後に、その状態が反映された表(table)を再表示したいと思っています。この場合、SQL文が発行し終わったら再度自分自身を呼び出す処理を行うと思うのですが、このいった場合はどのようにしたらよろしいのでしょうか?

重ね重ね申し訳ありませんが、どなたかご存知の方がいましたら、ご教授願えませんでしょうか?
よろしくお願い致します。


1:[回答] AC [2004/03/12 22:10 ]

投稿では、form要素のmethod属性やform要素の内容のinput要素などが不明ですが、
フォーム form_f2 の中身のHTMLソースはどのようになっていますか?

それと、
document.form_f2.action = "./delete.cgi?no_id="+enq_value+"user_id=$u_id";
no_idとuser_idのパラメータ区切りが無いようです。


2:[関連] ぴぴ [2004/03/13 13:43 ]

AC様
ご返答ありがとうございます。
HTMLソースは以下のようになっています。

<form method="post" action="" name = "form_f2">
<br>
<table width="" border="0" height="" align = "center">
<tr>
<td>部署名</td>
<td>最終更新時間</td>
<td>状態</td>
<td>タイトル</td>
<td>開始</td>
<td>〜</td>
<td>終了</td>
</tr>
<!--DBから取得した値を変数で受け取りここで表示-->
               $record
</table>
<input type = "hidden" name = "user_id" value = "$u_id">
<input type = "hidden" name = "window" value = "$window">
<input type = "hidden" name = "auth" value= "$auth">
</form>

hiddenの箇所には、enq_idは記述されていません。
(enq_idはJavaScriptの中で、初めて定義したので)
(radioボタンのvalue値で、アンケートIDの値を持たせて、
選択したラジオボタンのenq_idをもっていくようにしています)
formのaction属性は、このform_f2の中には、
delete.cgiだけでなく、update.cgiを起動させるスクリプトなども
あるため、空にしております。
なお、ご指摘のあったパラメータ区切り「&」は、
記載忘れでした。申し訳ありません。

よろしくお願いします。


3:[回答] AC [2004/03/13 15:27 ]

CGI.pm を使うのであれば、 formから投稿された内容の取得には、
paramメソッドを使用し、URL中のパラメータ取得にはurl_paramを使用します。
(print_error関数は適当に作って下さい。)

use CGI;
if ($ENV{'REQUEST_METHOD'} ne 'POST') {
   print_error "POSTメソッド以外では削除できません";
   exit;
}
$query = new CGI;

$form_user_id = $query->param('user_id');
$form_window = $query->param('window');
$form_auth = $query->param('auth');
$query_no_id = $query->url_param('no_id');
$query_user_id = $query->url_param('user_id');

なお、パラメータ区切り文字は&ではなく、セミコロン(;)を使用することをお薦めします。


4:[関連] ぴぴ [2004/03/13 19:23 ]

ACさま
ご返答いただき、ありがとうございます。
URLから取得する際は、paramではなく、url_paramですね。
ありがとうございます。勉強になりました。

しかしご返答いただいた後で申し訳ないのですが、action属性の際にurlに書いたものではなく、no_idもuser_idのようにpostで渡す際のhidden属性にできないかどうかという話が出てしまいまして…(T_T)
そこで図々しいのは承知でお伺いしますが、もしご存知でしたらご教授願いたいことがあります。

no_idを格納している、enq_valueという変数を、$u_idとかと共にhiddenで隠してpostで送って、delete.cgiで取得する際に、paramまたは
my $enq_id = $in{'enq_id'}
my $user_id = $in{'user_id'}
という形で飛ばし先のdelete.cgiで取得したいのです。
ただno_idを格納した変数enq_valueは、JavaScriptの記述のところで初めて出てきたものです。今まで上位のperlソースから引き継がれてきた$u_idなどは問題ないのですが、ここで初めて出てきたno_idを格納している変数enq_valueをperl変数$u_idのようにhiddenで隠してpostでdelete.cgiに渡すことは可能でしょうか?
ダメ元で<input type="hidden"  name="no_id" value="enq_value">とやりましたが、案の定、文字列としてのenq_valueが見事に渡されていました…(T_T)
JavaScriptの処理で発生した変数を、perlで発生した変数$u_idと共にhiddenで渡せる方法をご存知でしたら、お聞かせ願いたいのです。

重ね重ね申し訳ありませんが、ご返答いただいたACさま、あるいは、この掲示板をご覧になった方で、この件に関してご存知の方がいましたらご教授願えませんでしょうか?
よろしくお願い致します。


5:[回答] AC [2004/03/13 20:13 ]

<input type="hidden" name="no_id" value="">
としておき、 document.form_f2.submit(); の前に
document.form_f2.no_id = env_value;
とします。


6:[保留] ぴぴ [2004/03/13 20:26 ]

ACさま

重ね重ねのご返答、感謝致します(m_m)
こんな記述が可能なんですね。
分からなかった…(←やばいくらい無知なぴぴです…)
早速お手本にさせていただきます。
ありがとうございました。
失礼します。


7:[質問] ぴぴ [2004/03/15 16:08 ]

こんにちは。ぴぴです。
いつもこの掲示板にはお世話になっております。
度々の質問にも答えてくださり、大変ありがたく思っております。
再度、質問させて下さい。

@ACさまのアドバイスを参考にさせていただき、submitの前に
上記の内容を記述させていただき、HTMLの最後でhidden属性の内容を書かせていただきましたが、上手くいきませんでした(T_T)
教えていただいたのに、申し訳ありません…。
document.form_f2.no_id = enq_value; でエラーが出てしまいます。ラジオボタンにvalue値としてno_idの値を持たせ、クリックされたラジオボタンのvalue値を元にno_idを取得します。なお、ラジオボタンのname属性は、r_enqです。(別フレームのボタンを押すとラジオボタンのvalue値の値をenq_valueに格納します。この処理はJavaScriptです)
ここでの受け渡しが上手くいけば、実行先のCGIで後は値を受け取って、その値にしたがってSQL文を実行すればいいのですが…。
(「オブジェクトでサポートされていないプロパティまたはメソッドです」と表示されます)

Acgiをボタンから実行し、DBから対象データを削除して、
最新テーブルを出力するために、再度テーブルを表示するcgiを呼び出したい。

仮に上記@の引数の受け渡しが上手くいったとして、今度はそれを元にDELETE文を実行して、テーブルから対象レコードを消します。
(またはUPDATEします)その後、対象レコードが削除された状態の最新テーブルを再表示するために、テーブルを表示するcgiを再実行(呼び出し)したいのです。例えば下記のように、

********テーブルから、no_idを元にしてDELETE文を実行。
********その後、DB接続解除。

#ここで再度table_enq.cgiを読み込み、最新状態テーブルを表示させたい!!
******ここで再度、table_enq.cgiを読み込ませる処理********

exit;(プログラム終了)

このtable_enq.cgiは現在ログインしているユーザーのIDを元に、
SELECT文でユーザーがすでに登録してあるものを表示します。
(なおテーブル表示のcgiは引数をhidden属性のPOSTで受けてますので、こでもPOSTで渡す形にしたいと思っています)
「``」で囲んで実行するのかとも思いましたが、これはコマンド実行なので違うようです。(第一、これだとPOSTで渡せませんよね…)

度々恐れ入りますが、ご教授頂けませんでしょうか?
よろしくお願い致します。


8:[回答] AC [2004/03/16 00:57 ]

>>5 では嘘を書いていました。正しくは
document.form_f2.no_id.value = env_value;
です。失礼しました。


9:[関連] ぴぴ [2004/03/16 09:45 ]

ACさま

回答ありがとうございます。
すいません、こちらこそもう少し深く調べるべきでしたね。
ご教授感謝致します。

回答(必須): 状態:

お名前(必須):

e-mail:

URL:




[戻る]

ChaichanPAPA's World