ホームページ制作 オフィスオバタ

お問合せフォームのパラメータが送信されない現象に対処

 お問い合わせフォームのテストしてみたところ、入力内容がまったく送信されないということがありました。

不思議に思い、別名でコピーしてテストしてみたところ、うまく送信できました。

同じサーバー、同じプログラムなのに、現象がでる・出ないの違いが発生しました。

これは具合が悪いと思い、いろいろ調べて試してみたところ、原因がわかり対処することができました。

忘備録として記録いたします。

現象はこのような感じです。

まず現象を見るため、正しく動作するサンプルフォームをご覧ください。
送信ボタンを押すとメッセージが表示されます。

次に現象の発生するフォームをご覧ください。
送信ボタンを押しても何も発生しません。

プログラム側で何が起こっているのか調べてみました。
現象が発生する法は、プログラム側にパラメータが何も送信されていませんでした。

ちなみにHTMLソースはこのような感じです。

<!doctype html>
<html>
<head>
<meta charset="shift_jis">
<title>投稿テスト</title>
<style type="text/css">
article 
{
	width: 800px;
	margin-right: auto;
	margin-left: auto;
	border: 1px solid #CCC;
	text-align: center;
	padding: 30px;
	border-radius: 6px;
	-webkit-border-radius: 6px;
	-moz-border-radius: 6px;

}
p
{
	text-align: justify;
}

</style>
</head>
<body>

<article>
<section>
<h1></h1>

</section>

<section>
<form action="index.php" method="post" enctype="multipart/form-data">
<p>index.php名称だと、ボタンを押しても認識されません。</p>
<input name="send" type="submit" value="送信">
<input name="reset" type="submit" value="リセット">
</form>
</section>

</article>
</body>
</html>

ブラウザフォームからパラメータそのものが送信されない?
そんなことがあり得るのでしょうか?

原因は.htaccessのリダイレクト

現象が発生するフォームのファイル名称は、index.phpなのですが、これを別の名前に変更すると正しく動作しました。

また、index.phpに名前を戻すと現象が発生しました。

index.phpだと動作しないように見えました。

そこでピンときました。

フォームを入れているサーバーに、index.htmlとindex.phpは省略表示になるように、.htaccessでリダイレクト設定をしています。

つまり、送信ボタンを押した瞬間index.phpへパラメータを渡しますが、瞬時にリダイレクトされるためただの再表示になっているのです。

リダイレクトの瞬間、何もなかったことになる・・。
パラメータがプログラムに送信されない原因でした。

index.phpではない、別の名前に変えたときは正常に動いていたのもこのためです。

次のようにして対処しました。

 index.phpリダイレクト設定があると、index.phpにパラメータ渡しをした瞬間にリダイレクトが発動します。

何とかするためには、リダイレクトが発動しないようにパラメータを渡せばよいのです。

そこで次のようにしました。

■現象が発生するHTML

<form action="index.php" method="post" enctype="multipart/form-data">

action(ボタンを押したときのとび先)がindex.phpになっています。
これを次のように変更しました。

<form action="" method="post" enctype="multipart/form-data">

“index.php” → “”と何もなしにすることでリダイレクト回避ができました。
このように変更したサンプルがこちらです。

ファイル名はindex.phpで、.htaccessでリダイレクト設定していますが、プログラム側にパラメータが送信されるようになりました。

疑問:actionを空欄にして問題ないのか?

ここで疑問がわきました。
actionを空欄にして問題ないのでしょうか?
そう思い調べてみたところ、次のようなことがわかりました。

パラメータが自身へ送信されるとは?

空欄にすると自身へ送信されるとはどういうこと?
ということで実験しました。

次のサンプルはファイル名がsample.phpでindex.phpではありません。
そのうえで、actionを空欄にしてみました。

そのサンプルがこちら。

名称がindex.phpでなくてもaction空欄で送信されます。
呼び出した自身へ送信されています。

action空欄は一部のブラウザでは強制的にindex.phpに送信されることがある。

 action空欄にはどうやら落とし穴があるとのことでした。
それが強制的にindex.phpを呼び出すというものです。

例えばsample.phpでaction空欄であったと場合、
送信ボタンを押すと、index.phpが呼び出されるというものです。

ガラケー時代のブラウザなど、ごく一部のブラウザに限定されるようです。
ただ、もともとindex.phpであれば問題はありません。

phpやHTMLに問題がなくても、意外なところに原因があるものです。

 今回の現象が発生したとき、真っ先にプログラム側の受信パラメータを確認しました。
ところがプログラム側は何も受信していませんでした。

一体どうやって調査すればよいのだろうと、途方にくれました。
何とかできたのは、同じプロググラムでも現象が出る出ないの違いがあったことです。

その違いをひとつひとつ検証していったところ、.htaccessのリダイレクトにたどり着きました。

.htaccessを削除したらどうなるかを試したところ、正しく動作するようになったことが決め手でした。

なまじ経験値があると、原因を固定概念で探ってしまいがちです。
簡単なことでしたが、解決するのに思いのほか時間がかかりました。

ただ、多角的にいろんな角度からアプローチすれば、解決できるということを実感いたしました。

モバイルバージョンを終了