質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.95%

CGIでのログイン情報保持について

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 2,603
退会済みユーザー

退会済みユーザー

保存チェックボックスにチェックが入っていれば
ログイン情報をクッキーに保存し、ログイン情報が次回から自動で入力されているという
システムを書いています。
CGIには全くの無知で以下の様に記述しましたが、うまく思った通りの挙動になりません。
どうすれば良いでしょうか。。。

if($cook[2] eq "off"){
print "<tr>";
print "  <th>ID </th><td><input type=\"text\" name=\"id\" value=\"\" /></td><td><input type=\"checkbox\" name=\"id_save\" value=\"on\" /> 保存</td></tr>";
print "<tr>";
print "  <th>パスワード </th><td><input type=\"password\" name=\"pswd\" value=\"\" /></td><td><input type=\"submit\" value=\"ログイン\" /></td></tr>";
}
else{
print "<tr>";
print "  <th>ID </th><td><input type=\"text\" name=\"id\" value=\"$cook[0]\" /></td><td><input type=\"checkbox\" name=\"id_save\" value=\"on\" checked=\"checked\" /> 保存</td></tr>";
print "<tr>";
print "  <th>パスワード </th><td><input type=\"password\" name=\"pswd\" value=\"$cook[1]\" /></td><td><input type=\"submit\" value=\"ログイン\" /></td></tr>";
}

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • Mr_Roboto

    2016/06/29 00:40

    どう動くのが思った通りの挙動なのかを書いていただかないと回答が出来ないと思いますよ。

    キャンセル

  • 退会済みユーザー

    退会済みユーザー

    2016/06/29 00:45

    思った通りの挙動についても書いていましたが、わかりづらかったので改定しました。

    キャンセル

  • Mr_Roboto

    2016/06/29 00:59

    う、サクっと動かそうと思ったらCGIが動かないw
    ちなみに今どういう動きなのかと、あと先頭に
    #!/usr/bin/perl
    print “Content-Type: text/plain\n\n”;
    とかいると思いますが、その辺は書いてありますか?
    とか、確認してみて足りなければ追記お願いします。
    睡魔に負けたら明日調べるかもですw

    キャンセル

  • 退会済みユーザー

    退会済みユーザー

    2016/06/29 01:02

    ご返信有難う御座います。
    ご指摘の文は記述しております。

    また、現在の挙動ですが、チェックボックスのonの値がうまくCokkieに保存されずif文がずっとFALSEの状態でログイン情報が保存されない状態です。

    ご回答はお時間のある時で大丈夫です!
    有難う御座います。

    キャンセル

回答 1

checkベストアンサー

0

ちょっと情報が少なかったので、勝手に解釈して、雑に書いてみましたが、こんな感じですかね?
後、コードはマークダウンで囲っていただけると見やすいです><

test.cgiというファイルで保存していただくと、そのまま実行できます。

#!/usr/local/bin/perl

print "Content-type: text/html\n\n";
print '<meta charset="utf-8">';

# チェックボックスがチェックされているか
use CGI;
my $cgi  = CGI::new();
my $ck = $cgi->param('checkbox_name');        # チェックボックスがチェックされているかの取得
my $text = $cgi->param('text');                    # フォームの内容


# チェックされていたらCookieを書き込む
if ( $ck eq "on" ){
    # Cookieの書き込み
    print '<meta http-equiv="Set-Cookie" content="INFO='.$text.'; Tue, 31-Dec-2030 23:59:59;\n">';            # HTMLのmetaタグを使った書き込み
    #print "Set-Cookie: INFO=$text; Tue, 31-Dec-2030 23:59:59;\n";        # PerlのCookie関数…何故か使えない。
    print "\n";
}



# クッキーの取得
my $cookie = $ENV{'HTTP_COOKIE'};            # 全てのCookieデータが入ってくる。Cookieごとの終わりは「; 」なので
my @cdata = split(/; /, $cookie);                    # 「; 」でsplitしてあげると良いかなと。
my $info = "";
for ( my $i=0; $i<@cdata; $i++ ){                # データの数だけループを回す
    print "$cdata[$i]<br>";                            # とりあえずの出力

    my @sp = split(/=/, $cdata[$i]);            # データは、「Cookie名=Cookieの値」で取得できるので、「=」でsplit

    if ( $sp[0] eq "INFO" ){                        # Cookie名が「INFO」なら、Cookieの値を取得
        $info = $sp[1];
    }
}
print "<hr>";


# 適当なフォームの出力(HTML部分)
print '<form action="test.cgi" method="post">';

if ( $info ne "" ){
    # フォームの表示
    print '<input type="text" name="text"  value="'. $info .'"><br>';
    print '<input type="checkbox" name="checkbox_name" value="on" checked>情報の記録';
}else{
    print '<input type="text" name="text"  value=""><br>';
    print '<input type="checkbox" name="checkbox_name" value="on">情報の記録';
}

print '<input type="submit">';


# フォームの終わり
print '</form>';

print "<hr>フォームの値:$text";

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/06/29 10:02

    おおお、おはようございます (=_=;)
    仕事が早い人登場ですね、ありがとうございます。
    一方私は、まだMacでCGIが動きませんw
    よく見てませんが、多分大丈夫そうなので老兵は消え去ります ε≡≡ヘ( ´Д`)ノ

    キャンセル

  • 2016/06/29 12:42

    おはようございます。
    当方、Macも持ってますがWindowsユーザなので、Windowsで作ってますw

    そして是非ともチェックしていただけるとありがたいですw
    当方、完全独学ですので、フレームワークなどは一切触ったことがない上に、文法にかなり癖があるかなぁと思ってます故……

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.95%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る