お世話になります。

このたび、php/MySQLを使用したID/PWによる
ログイン認証のシステムを開発しようとしています。
仕様としては1時間の自動ログイン機能付きです。
(1時間クッキーを有効にする)

ネット各所で調べてみると
良く巷のWebやブログで紹介されているものは、
盗聴+クッキーの改変で容易に突破されそうに思います。

良く例にある、クッキーにID/PWを入れるものですが
これでは盗聴とクッキー改変には耐えられそうもありません。
また非常に危険に思っています。

またPOSTしたID/PWをcrypt等で暗号化しても、
結局は暗号化したデータを盗聴されたら終わりな気がします。

何か良い仕組みがありましたら
お教え願えれば光栄です。

よろしくお願いいたします。

このQ&Aに関連する最新のQ&A

A 回答 (3件)

>それともフォーム送信後に


>いちいち使用したセッション変数のみを
>一つずつunset($_SESSION['hoge']);する必要があるのでしょうか?
それが面倒だというなら、$_SESSIONに配列で放り込んでおけば?

$_SESSION['hoge']=array('zip'='000-0000','tel'='090-0000-0000','name'='山田 太郎',
'address'='東京都港区○○1-1-1'・・・・・・・・・・・);

~~~~~~~~

unset($_SESSION['hoge']);
データが1000種類あっても、一発です。

もっとも、送信フォームの内容のようなものをSESSIONに放り込むなんて事、普通はしませんけど。

自分自身にPOSTして、冒頭でPOSTか否かで送信処理か、送信フォームの表示かを判定(さらに、ワンタイムチケットでも設定しておけばなお良し)。
送信内容のエラーチェックをして(必須項目が入力されていないなど)、オールOKなら『送信しました』ページにリダイレクト、ダメならそのまま送信フォームを表示(その際にエラーメッセージを表示する)ってな感じですかね。

適当だけど、以下のような感じかな。
テストもしてないし、エラー処理もXSS対策も入れてないけど。

<?php
$errors=array();
$hoge='';
$fuga='';

if (strtolower($_SERVER['REQUEST_METHOD'])=='post'){
if ($_POST['hoge']==''){
$errors['hoge_is_null']='HOGEが入力されていません';
}else{
$hoge=$_POST['hoge'];
}
if ($_POST['fuga']==''){
$errors['fuga_is_null']='FUGAが入力されていません';
}else{
$fuga=$_POST['fuga'];
}

if (0==count($errors)){
//送信処理

//送信完了ページにリダイレクト
header("Location: ./send_complete.php");
}
}
?>
<html>
~~~
<body>
<form action="" method="post"><!--actionを空白にすることで、自分自身に送信-->
<input type="text" name="hoge" value="<?php echo $hoge;?>" />
<?php if (isset($errors['hoge_is_null'])){echo $errors['hoge_is_null'];}?>
<input type="text" name="fuga" value="<?php echo $fuga;?>" />
<?php if (isset($errors['fuga_is_null'])){echo $errors['fuga_is_null'];}?>
<input type="submit" value="送信" />
</form>
</body>
</html>
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
なるほど!そのような方法があったのですね!

私が入門時に先輩から指導を受けた制作方法としては
-----------------------------------------------------
index.php...フォームページ(入力確認含む)
ses_index.php...入力チェック~送信・DB入力処理
index_end.php...入力完了画面
-----------------------------------------------------
の三部構成で制作を進め、
index.phpからses_index.phpへPOSTした際に

$_SESSION['hoge'] = $_POST['hoge'];

とPOSTした変数をセッションに格納し、
入力チェックに引っ掛かった変数については、

include("index.php");

でindex.phpにエラー内容を表示させて
入力を済ませていたフォームは

value = "<?php print($_SESSION['hoge']); ?>

で入力済みの値を表示させるという構造でした。

これが当たり前になっていたために
余り他の方法を模索しようとも思っていませんでした。

もう少し、色々と効率的な方法を
模索して見たいと思います。

ありがとうございました。

お礼日時:2011/11/03 20:21

前の方も聞かれてますがSSLなんですか?


それであれば、盗聴に関してはそこまで意識する必要もなさそうな・・・
もちろん万全ではありませんが、そんな簡単に解析されるものではないですから

で、1時間の自動ログインというのはブラウザを閉じても有効なんですか?
(ブラウザって前提で聞いてますけど・・・)

もしそうならcookie以外には識別不能になるので、cookieを使う必要はあると思います。
ただし、cookieにIDやらパスワードを入れるのは論外です。

やるのであれば、DBを使うようなので「ログイン中テーブル」のようなものをつくればよいのではないでしょうか。
ログイン認証を通過した時点でsession_idのような推測されないランダムな文字列をDBにINSERT。
それと同時にcookieにも同じ値をセットすれば認証済みという判定は出来ると思います。

よりデリケートにやるのであれば、キーと値のペアをどちらもランダムな値で持つのもいいと思いますし、通信のたびに値を書き換えるワンタイムトークンのような使い方もよいかもしれません。

他の方も回答されているとおり、cookieの生存時間だけではなく、「ログイン中テーブル」にデータをINSERT(UPDATE)した時間を持たせればそれで判定もできます。

> 本題の質問とは外れてしまいますが、ログインチェック用のセッションとその他のフォーム用のセッションに分けて使用する方法はありませんでしょうか?
>
> それともフォーム送信後にいちいち使用したセッション変数のみを一つずつunset($_SESSION['hoge']);する必要があるのでしょうか?
>
> もしそのようなことに関する情報がありましたら
お教え願えれば光栄です。

SESSIONはそれなりに奥が深かったりもしますが、そんなにとっつきにくいものではないと思います。
よっぽどcookieよりも扱いやすいと私は思います。

$tmp = $_SESSION[login];
session_destroy();
$_SESSION[login] = $tmp;

これじゃだめですか?というか $_SESSIONすべてを破棄する必要がないなら連想配列でわけるだけで済むと思いますが・・・

> またPOSTしたID/PWをcrypt等で暗号化しても、結局は暗号化したデータを盗聴されたら終わりな気がします。

復号される前提の暗号はどこまで行っても安全ではないですよ。(不可逆でもそうですけどね)
ある程度のセキュリティは保つべきですが、終りのない世界なので・・・
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
> で、1時間の自動ログインというのはブラウザを閉じても有効なんですか?
これはブラウザを閉じても有効と言うことになります。

お教えいただいた情報と、自分で調べた情報を参考に
初回ログイン時にランダム文字列のキーを作成し、それをDBに格納、
それをクッキーにも持たせて認証という方法で制作しました。
そのキーはブラウザを閉じてからの自動ログイン時に
再度書き換えられるように設定しました。
これでかなりパフォーマンスは上がったと思っています。

また問題になっていたセッションの問題ですが、

$tmp = $_SESSION[login];
session_destroy();
$_SESSION[login] = $tmp;

上記の方法で問題なく対応できています。

色々とご丁寧にありがとうございました。
奥の深い部分でこれがゴールと言うものはないと思いますが、
日々精進を続けてまいります。

お礼日時:2011/11/03 20:10

>盗聴+クッキーの改変で容易に突破されそう



まずはhttpsで処理することは前提でよいですね?
クッキーの生存期間で時間を区切るのはNGです。
1時間と決めるのであれば、サーバー側でDBなりでユーザー管理が必須でしょう。
そのうえで、各ページにログイン情報のチェッカーを埋め込めば
最低限時間+ユーザーを指定したログインシステムは構築できそうです。
ただセッションハイジャックの問題などもあるので、
完璧にやりたいということであれば、より厳密な個体を判断するような
仕組みを組み込まなくてはいけません。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
当初はセッションによる管理を考えていましたが、
私のセッションに関する知識が乏しいため、
下記のような問題により、
ログイン認証ではセッションを使用していません。

ログインチェックで
例えば$_SESSION['login']に
ログインチェック関係の変数を入れるとします。

これを使用したプログラムを全てのページに埋め込めば
確かにログインチェックができるかと思います。

ところがログイン後のページの各所で
登録フォームや送信フォームが多数あり、
その中で多数のセッション変数を使用しています。

それらのフォームの送信完了後に、
そのフォームで使用したセッション変数のみをクリアしたいのですが、
session_unsetやsession_destroyなどを使用すると、
ログインチェック用のセッション変数までクリアしてしまうため、
この辺りがうまくいかずにログイン認証にはセッションを使用していませんでした。

本題の質問とは外れてしまいますが、
ログインチェック用のセッションとその他のフォーム用のセッションに
分けて使用する方法はありませんでしょうか?

それともフォーム送信後に
いちいち使用したセッション変数のみを
一つずつunset($_SESSION['hoge']);する必要があるのでしょうか?

もしそのようなことに関する情報がありましたら
お教え願えれば光栄です。

ちなみに、ID/PWはcryptで暗号化して、
DBに格納されており、ログイン時のみ比較を行っています。

お礼日時:2011/11/02 22:08

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qフォントの色を変えるには?

こんにちは。PHPでのフォントの色の変更について質問があります。
任意の文字列の色だけを変更したいのですが、下のコードではエラーになってしまいます。
どこがまずいのかご指摘いただければ幸いです。
------------------------------
<HTML>
<HEAD>
<TITLE>TEST</TITLE>
</HEAD>

<BODY>

<?PHP
ECHO "<FONT COLOR="BLUE"> HELLO </FONT>";
ECHO "<FONT COLOR="RED"> GOOD BYE </FONT>";
?>

</BODY>
</HTML>

Aベストアンサー

BLUEやREDについてるダブルクォーテーションがエスケープされてないですね。
いろいろやりかたはありますが以下のどちらかがよいでしょう。

<?PHP
ECHO "<FONT COLOR=\"BLUE\"> HELLO </FONT>";
ECHO "<FONT COLOR=\"RED\"> GOOD BYE </FONT>";
?>

もしくは

<?PHP
ECHO '<FONT COLOR="BLUE"> HELLO </FONT>';
ECHO '<FONT COLOR="RED"> GOOD BYE </FONT>';
?>

Q個人HPにログイン機能付けられる?

無料のホームページ(GOO、ジオシティーズ等)を利用して個人HPを作ろうと思っています。単身地方在住で、限られた友人、遠くに住む家族以外には公開したくありません。それなら、インターネットを使うなと言われそうなのですが、あえてインターネットで限られたサークルの人間にだけ公開したいのです。実は若くしてガン告知を受けました。その近況、治療進度などを知っている友人家族だけに公開したいのです。小さな田舎町で、人によく接する仕事上、素性がばれたくないというか、プライバシーを守りたい、しかしHPで友人と家族にまとめて伝えたいという意向です。なんせ、田舎町で家族や馴染みの友人が遠くに住んでいます。

ログイン機能でログインネームとパスワードでそういった事ってできますよね?それって商用のサイトで見たことがありますが、個人サイトでするにはどうすればいいのかご存知の方いらっしゃいませんか。

ソフトを買うのか、シェアウェアであるのか、プログラムが分からないとできないのか、全然分かりません。誰か教えて下さい。宜しくお願いします。

Aベストアンサー

「無料のサイト」という事で、CGIが使えないかもしれません。その場合は「JavaScript」の機能を使って、簡易的にパスワードをつける事もできます。
ちょっとわかりにくいかもしれませんが、プリントアウトなどされて、良く読まれるとわかると思います。

■JavaScriptで簡易パスワードをかけるスクリプトについて。
1)パスワードを入れるページ(入り口) /public_html/pass.html
2)認証された時に表示するページ    /public_html/member/frendsmember.html
3)認証が拒否されたときのページ    /public_html/member/member.html
とします。
入力するべきパスワードは「frends」とします。
(ファイル名、パスワードを変える時は、スクリプト内の記述も変える事)
このほかに、URLで /public_html/member/ とだけURL欄に入力したときに、
そのフォルダ内のファイル一覧を表示されてしまうのを避けるために、
/public_html/member/index.html という適当なファイルを用意しておきます。(このファイル名は変えない事。意味がなくなるので....)

■pass.html ■
<HTML>
<HEAD><TITLE>パスワード入力</TITLE>
</HEAD>
<SCRIPT Language="JavaScript">
function enter(pass)
{
location.href="./member/"+pass+"member.html";
}
</SCRIPT>
<BODY bgcolor="#ffffff">
<div align="center">
<h1>パスワードを入力してください</h1>
<h3>ここから先はメンバー専用です<br>パスワードを入力してください</h3>
</div>
<FORM>
<div align="center">
<INPUT type="password" name="Pass">
<INPUT type="button" value="Enter"
onClick="enter(this.form.Pass.value)">
</FORM>
</div>
<hr width="80%">
<div align="center">
<a href="./index.html">
<font style="font-size:12px;color="#000055">
memberではないので退室する
</font>
</a>
</div>

</BODY>
</HTML>

*解説 
<BODY>内のフォームにより、設定したパスワード(frends)を入力させます。
「Enter」をクリックすると、<SCRIPT>内の指定により、入力した文字
(frends)と、(member)を合体させたファイル名「frendsmember.html」に
ジャンプします。
万一、なにも入力しないで「Enter」を押した場合は、「member.html」
というファイルを表示します。

■/member/frendsmember.htmlの中身(適当で良いが、ようするに認証OKの画面■
<HTML>
<HEAD><TITLE>メンバー専用メニュー</TITLE>
</HEAD>

<BODY>
<div align="center">
<h1>メンバー専用メニュー</h1>
<font size="3">
あなたは認証されました
<Ul>
<a href="ファイル名">
<li>メンバーの掲示板
</a>
<a href="ファイル名">
<li>メンバーの共有情報
</a>
<a href="ファイル名">
<li>近況報告
</a>
<ul>
</font>
</BODY>
</HTML>

■/member/member.htmlの中身(適当で良いがようするに空で「Enter」された時)■
<HTML>
<HEAD><TITLE>退室願います</TITLE>
</HEAD>

<BODY>
<div align="center">
<h1>退室願います</h1>
<font size="3">
あなたは認証されません
<a href="../index.html">
<font style="font-size:12px;color="#000055">
memberではないので退室する
</font>
</BODY>
</HTML>

■/member/index.htmlの中身(適当で良いが、ようするにフォルダの中身を表示され
ないようにするため■
<HTML>
<HEAD><TITLE>404 ERROR</TITLE>
</HEAD>

<BODY>
<div align="center">
<h1>404 ERROR</h1>
<font size="3">
ファイルが表示できません<br>
このエラーについての詳細は
<a href="mailto:xxxxx@xxxx.ne.jp">
WEBMASTER
</a>
までお問い合わせください
</font>
</BODY>
</HTML>



================================================
以上です。
(今適当に書いたので、キー入力エラーなどがあるかもしれません。)

なお、サーバーに置いたページをロボット検索が拾わないようにするために、
ホームディレクトリ(たぶん「public_html」かな?)に

User-agent*
Disallow:/member/

と書いた「robots.txt」というテキストファイルを置いておくこと。

「無料のサイト」という事で、CGIが使えないかもしれません。その場合は「JavaScript」の機能を使って、簡易的にパスワードをつける事もできます。
ちょっとわかりにくいかもしれませんが、プリントアウトなどされて、良く読まれるとわかると思います。

■JavaScriptで簡易パスワードをかけるスクリプトについて。
1)パスワードを入れるページ(入り口) /public_html/pass.html
2)認証された時に表示するページ    /public_html/member/frendsmember.html
3)認証が拒否されたときのページ   ...続きを読む

QPHPからHTMLへの変数の受け渡し

form.html→page1.php→page2.php
というようなページをつくり、form.htmlでテキストエリア等<form>を使いpage1.phpにデータ:nameを送るとします。
その際$name = $_POST['name'];とするとphpでの変数になってしまってpage1のhtml上では認識されませんよね?
page1からpage2に移動するときにform.phpでいれたnameのデータも
<input type="hidden" name="名前" value="name">
というように使いたいのですがその際page1内でphpでの$nameをhtmlのnameに代入というかデータの受け渡しが必要になるかと思うのですがそれはどのように記述すればいいのでしょうか?

ご教授よろしくお願いいたします。

Aベストアンサー

1.hiddenで値を回す(大抵は「値を引き継ぐ」と呼ばれます)
[form.php]
<form action="page1.php" method="POST">
<input type="text" name="name" />
<input type="submit" />
</form>

[page1.php]
<form action="page2.php" method="POST">
↓そのまま$_POSTの値を突っ込むとxssなどバグの温床になるんだけど。
<input type="hidden" name="name" value="<?php echo htmlspecialchars($_POST['name']); ?>" />
<input type="submit" />
</form>

[page2.php]
上記だとHTMLを排除された値が渡ってくることに注意
<?php echo $_POST["name"]; ?>


2.sessionを使って値を保持する
[form.php]
(snip)

[page1.php]
<?php
session_start();
$_SESSION['name'] = $_POST['name'];
?>

[page2.php]
<?php
session_start();
echo $_SESSION['name'];


sessionを使った方がセキュリティ的には強固 かつ 作成者的に負担が少ないので
個人的には2.をお勧めしたいところ。
cookieが使えないのであれば1.しか手法がありませんが。

1.hiddenで値を回す(大抵は「値を引き継ぐ」と呼ばれます)
[form.php]
<form action="page1.php" method="POST">
<input type="text" name="name" />
<input type="submit" />
</form>

[page1.php]
<form action="page2.php" method="POST">
↓そのまま$_POSTの値を突っ込むとxssなどバグの温床になるんだけど。
<input type="hidden" name="name" value="<?php echo htmlspecialchars($_POST['name']); ?>" />
<input type="submit" />
</form>

[page2.php]
上記だとHTMLを排除された値が渡っ...続きを読む

Qデータベース接続 ログインフォーム

PHPにてログインフォームを作成しています。

PHPは初心者のため、ご教授いただけたらと思います。

下記の記述方法はPHP逆引きレシピという参考書を元に作成しています。

<?php
//DB設定
$DB_HOST = 'localhost';
$DB_USER = 'root';
$DB_PASS = '0000;
$DB_NAME = 'members';

if (count($_POST) == 0) {
echo <<< EOL
<form method="post" action="./main.php">
ユーザーID: <input name="id" />
PASSWORD: <input name="password" type="password" />
<input type="submit" value="ログイン" />
</form>
EOL;
} else {
$link = mysqli_connect($DB_HOST, $DB_USER, $DB_PASS, $DB_NAME);
if (mysqli_connect_errno()) {
die('データベースエラー');
}
// クエリを準備
$sql = 'SELECT * FROM members WHERE id=? AND password=?';

$msg = '認証NG';
if ($stmt = mysqli_prepare($link, $sql)) {
mysqli_stmt_bind_param($stmt, 'ss', $_POST['id'], $_POST['password']);
mysqli_stmt_execute($stmt);
mysqli_stmt_store_result($stmt);
$count = mysqli_stmt_num_rows($stmt);
mysqli_stmt_close($stmt);
if ($count == 1) {
$msg = '認証OK' ;
}
}
echo $msg;
}
?>

という記述ですが、IDとPASSWORDがあっていれば「認証OK」と表示されます。
文字の表示ではなく次のページ(main.php)が表示されません。

どこを編集、記述したらmain.phpが表示されるのでしょうか?

また、間違っていたら「認証NG」と表示されるのですが、
この文言のみの表示でフォームが表示されません。
間違っていたらフォームの上に表示させたいのですが、どのように編集、記述したらよろしいでしょうか?

例↓

*ここに間違っていたら認証NGと表示させる
<form method="post" action="./main.php">
ユーザーID: <input name="id" />
PASSWORD: <input name="password" type="password" />
<input type="submit" value="ログイン" />
</form>

質問ばかりで申し訳ありません。
本やネットなどで色々としらべたのですが、自分の求めているサイトや記述方法が見つかりませんでした。

大変申し訳ないのですが、参考記述または参考サイトなどがありましたらご教授ください。
宜しくお願いいたします。

PHPにてログインフォームを作成しています。

PHPは初心者のため、ご教授いただけたらと思います。

下記の記述方法はPHP逆引きレシピという参考書を元に作成しています。

<?php
//DB設定
$DB_HOST = 'localhost';
$DB_USER = 'root';
$DB_PASS = '0000;
$DB_NAME = 'members';

if (count($_POST) == 0) {
echo <<< EOL
<form method="post" action="./main.php">
ユーザーID: <input name="id" />
PASSWORD: <input name="password" type="password" />
<input type="submit" valu...続きを読む

Aベストアンサー

***さんこんにちはを出す処理です。
まず、ログイン出来た時にidをセッションに保存します。
login.phpの最後のほうで、

session_start();
$_SESSION["login_flg"] = 1;
$_SESSION["login_id"] = $_POST['id']; //この行を追加
header ("location: ./main.php");

で、main.phpで、そのidを使ってmembersデータを呼び出し、
名前を表示すればOKです。


以下、main.php のサンプル
<?php
session_start();
if ($_SESSION["login_flg"] != 1){
header("location: login.php");
}


//DB設定
$DB_HOST = 'localhost';
$DB_USER = 'root';
$DB_PASS = '0000';
$DB_NAME = 'members';

$ok_flg = 0;
$msg = "";

$link = mysqli_connect($DB_HOST, $DB_USER, $DB_PASS, $DB_NAME);
if (mysqli_connect_errno()) {
die('データベースエラー');
}

$sql = 'SELECT namae FROM members WHERE id=?';
if ($stmt = mysqli_prepare($link, $sql)) {
mysqli_stmt_bind_param($stmt, 's', $_SESSION['login_id']);
mysqli_stmt_execute($stmt);
mysqli_stmt_store_result($stmt);
mysqli_stmt_bind_result($stmt,$namae);
while (mysqli_stmt_fetch($stmt)) {
$members_name = $namae;
}
mysqli_stmt_close($stmt);


?>
<html>
<head>
<title></title>
</head>
<body>
<?php echo $members_name?>さんこんにちは
</body>
</html>

こんな感じでしょうか。
名前がどんなフィールド名か分からないので、仮に namae としておきました。

で、
Call to undefined function mysqli_connect()
に関してですが、私自身普段 mysqli_hogehoge のような関数を使わないので、
良くわかりません。また、sakuraのサーバもどうなっているか分からないので、
これはこれでまた質問してみてはどうでしょうか。

***さんこんにちはを出す処理です。
まず、ログイン出来た時にidをセッションに保存します。
login.phpの最後のほうで、

session_start();
$_SESSION["login_flg"] = 1;
$_SESSION["login_id"] = $_POST['id']; //この行を追加
header ("location: ./main.php");

で、main.phpで、そのidを使ってmembersデータを呼び出し、
名前を表示すればOKです。


以下、main.php のサンプル
<?php
session_start();
if ($_SESSION["login_flg"] != 1){
header("location: login.php");
}


//DB設定
$DB_HOST = 'localhost...続きを読む

QHTMLフォームのSELECTの幅を一定にするためには?

HTMLフォームのSELECTの幅を一定にするためにはどのようにすれば
いいのでしょうか?

CSS等で設定できるとありがたいのですが、やり方がわかりません。

Aベストアンサー

<select style="width: 200px">

QPHP ボタンが押されたら処理を実行する

PHPプログラミングをしています。
「はい」というボタンが押されたらこの処理を行い、
「いいえ」というボタンが押されたらこの処理を行う
ということはどうすれば実装できるのでしょうか?

Aベストアンサー

どういう環境下で作っておられるのかが全然わかりませんが、
PHPというこですので、Webベースのフォームですよね。

たとえば、「はい」ボタンと「いいえ」ボタンをそれぞれフォームのSubmitにしておいて、
POST先のフォームで処理を分ければどうでしょうか。

送信元
<form name="Hai" method="POST" action="hoge.php">
<input type="hidden" name="answer" value="1">
<input type="submit" value="はい">
</form>

<form name="Hai" method="POST" action="hoge.php">
<input type="hidden" name="answer" value="0">
<input type="submit" value="いいえ">
</form>


送信先
$answer = $_POST["answer"];

if($answer == 1){
// 「はい」の時の処理
}else{
// 「いいえ」の時の処理
}


ちなみに、自分から自分へPOSTすればPHPスクリプトも2つに分けずにできると思います。
また、POSTじゃなくGETでも同様のことはできると思います。

どういう環境下で作っておられるのかが全然わかりませんが、
PHPというこですので、Webベースのフォームですよね。

たとえば、「はい」ボタンと「いいえ」ボタンをそれぞれフォームのSubmitにしておいて、
POST先のフォームで処理を分ければどうでしょうか。

送信元
<form name="Hai" method="POST" action="hoge.php">
<input type="hidden" name="answer" value="1">
<input type="submit" value="はい">
</form>

<form name="Hai" method="POST" action="hoge.php">
<input type="hidden" name="answer" ...続きを読む

Qtableタグとformタグの組み合わせ

tableタグとformタグの組み合わせでどのように記述すれば、構文上正しいのでしょうか?
私は下のパターンで書いておりますが、間違いでしたら早めに改めたいので
お聞きしました。

<table>
<form>
<input type="hidden" name="a" value="1">
<tr>
<td>
<input type="text" name="b" value="">
</td>
</tr>
<tr>
<td>
<input type="submit" value="OK" value="">
</td>
</tr>
</fomr>
</table>

Aベストアンサー

恐らく、<form>タグを入れると1行分の隙間ができるのでそのように記述しているのでしょう。私も4年ほど前に何かの雑誌でそのように記述しましょう、を確かに見ました。W3Cの理論を無視すれば別に表示するのだから構わないとも思います。
しかし、私の場合、今は、前者様の回答のように<table>の外に記述します。そして、スタイルシートで
<form style="margin:0px;">
とすれば、隙間が無くなります。

Q1つのformで複数のactionを実行できますか?

フォーム内に商品の購入ボタンがあります。同じフォーム内に商品名でグーグルのサイト内を検索させるボタンを設置し、横に並べることは可能ですか?
フォームの入れ子はよくないようなので、検索をJava scriptでできればよいのですが・・・
スタイルシートではデザイン上無理でした。

<form id="fm" name="fm" action="URL" method="POST">
<input type="hidden" name="shouhinmei" value="商品名">
<input type="hidden" name="kakaku" value="500">
<input type="image" src="kounyuu.gif value="購入">

<form method=get action="http://www.google.co.jp/search">
<input type=hidden class="q" name=q value="商品名"><input type=hidden name=ie value=UTF-8><input type=hidden name=oe value=UTF-8><input type=hidden name=hl value="ja"><input name=btnG type="image" src="検索.gif value="検索"><input type=hidden name=sitesearch value="サイトのURL"></form>
</form>
</form>

+----+  +----+
|購入|  |検索|
+----+  +----+

フォーム内に商品の購入ボタンがあります。同じフォーム内に商品名でグーグルのサイト内を検索させるボタンを設置し、横に並べることは可能ですか?
フォームの入れ子はよくないようなので、検索をJava scriptでできればよいのですが・・・
スタイルシートではデザイン上無理でした。

<form id="fm" name="fm" action="URL" method="POST">
<input type="hidden" name="shouhinmei" value="商品名">
<input type="hidden" name="kakaku" value="500">
<input type="image" src="kounyuu.gif value="購入">...続きを読む

Aベストアンサー

では、以下のような感じで。
なるべく多くのブラウザで動くように書いたつもりですが検証は充分行ってください。

<html>
<head>
<title></title>
<script type="text/javascript">
<!--
function searchGoogle(q) {
document.forms['searchForm'].elements['q'].value=q;
document.forms['searchForm'].submit();
return false;
}
//-->
</script>

</head>
<body>

<form action="URL">
~~
<input type="image" src="kounyuu.gif value="購入">
<a href="http://www.google.co.jp/" onclick="return searchGoogle('商品名')"><img src="検索.gif" border=0></a>
</form>

<form action="http://www.google.co.jp/search" id="searchForm" style="display:none;">
<input type=hidden name="q">
<input type=hidden name=ie value="UTF-8">
<input type=hidden name=oe value="UTF-8">
<input type=hidden name=hl value="ja">
<input type=hidden name=sitesearch value="サイトのURL">
</form>

</body>
</html>

では、以下のような感じで。
なるべく多くのブラウザで動くように書いたつもりですが検証は充分行ってください。

<html>
<head>
<title></title>
<script type="text/javascript">
<!--
function searchGoogle(q) {
document.forms['searchForm'].elements['q'].value=q;
document.forms['searchForm'].submit();
return false;
}
//-->
</script>

</head>
<body>

<form action="URL">
~~
<input type="image" src="kounyuu.gif value="購入">
<a href="http://www.google.co.jp/" onc...続きを読む

Q配列をPOSTで受けとる

タイトルのまんまですが
配列をformで送って
それをPOSTで受け取りたいのですが
うまくいきません

具体的に言うと
<?php
print"<form method=POST action=action.php>";

for($i=0; $i<$n; $i++){
   print"<input type=text name=foo[$i]>";
}
print"<input type=hidden name=n value=$n>";
print"<input type=submit value=go>";
print"<form>";
?>


///////////以下action.php//////////////////
<?php
$n = $_POST["n"];
for($j=0; $j<$n; $j++){
   $foo[$j] = $_POST["foo[$j]"];
   print"$foo[$j]";
}
?>


こんな感じのことがしたいのですが
うまくいきません
どうもPOSTされてないみたいでfoo[$j]はnullです
凡ミスな気がしなくもないんですが...プログラム初心者なんで↓↓
教えてください
よろしくお願いします

タイトルのまんまですが
配列をformで送って
それをPOSTで受け取りたいのですが
うまくいきません

具体的に言うと
<?php
print"<form method=POST action=action.php>";

for($i=0; $i<$n; $i++){
   print"<input type=text name=foo[$i]>";
}
print"<input type=hidden name=n value=$n>";
print"<input type=submit value=go>";
print"<form>";
?>


///////////以下action.php//////////////////
<?php
$n = $_POST["n"];
for($j=0; $j<$n; $j++){
   $foo[$j] = $_POST["foo[$j...続きを読む

Aベストアンサー

atsuGTさんこんにちは。


受け取り側は

$foo = $_POST["foo"];

とするだけで$fooに送信された配列が格納されます。


$_POST["foo[添え字]"] ではなく、
$_POST["foo"][添え字] となります。

QリダイレクトでPOST

教えてください。

リダイレクトの際、POSTで次のページにデータを渡すことは可能でしょうか?

GETだと
header("Location: "a.php?no=".$no);
と、問題なくできるのですが、
できれば、パラメータを隠したいと思います。

以上ですが、よろしくお願いします。

Aベストアンサー

多分できないです。
それに、結局クライアント側に情報を送信しているのだから、POSTにしたところでパラメータを隠した事にはならないですし。
本当に隠すならサーバ側でセッション情報を引き継ぐような形にしないとダメでしょう。

AJAXのかたちにして、ページ遷移を見えなくするというのが手っ取り早いかも。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報