プロが教える店舗&オフィスのセキュリティ対策術

PHPを勉強し始めて日の浅い初心者です。
恐らくとても初歩的な質問で恐縮なのですが、おわかりになる方がいらっしゃればぜひご教授いただきたいです(>_<。

今、試験的に個人情報入力の画面を作ってみているのですが、困っているのが、「入力された郵便番号と電話番号に半角数字とハイフン以外の文字が使われていないかチェックして、使われていた場合はエラーページに飛んで『郵便番号(or電話番号)に半角数字とハイフン以外の文字が使われています』というメッセージを表示する」というものです。
半角数字とハイフン以外が使われていなかった場合(このふたつの項目の他に名前・住所の欄もあるので、それらを含めた全てがきちんと入力された場合、ということなのですが)は、確認画面に飛んですべての入力情報を出力、で完了です。

使うファイルは3つで、a.php(入力画面・エラーチェック)、b.php(入力結果表示画面)、error.php(上記、郵便or電話番号のエラーがひっかかったとき飛ぶ画面)です。(ファイル数はこの数に指定されているのですが、上記a,bのファイルが負う役割は自分が割り当ててみたものです。)

正規表現を使ってエラーチェック自体はできたのですが、そのエラーの場合に別のページに飛ばせる、というのがどういう操作をすればいいのかわかりません;;
こちらで過去の質問を参考にして、headerを使えばいいのかなと思ったのですが…
リンクやボタンのように『どこかをクリックすると飛ぶ』ならわかるんですけど、『ある条件に合ったときに自動で(?)飛ぶ』というのをどう組めばいいのかうまく想像できなくて困っています…。そもそもそういう操作自体が可能かどうなのかもわからなくて。

以下、とりあえず今打ってみたところまでです。↓ 必要と思われるところのみ抜き出します。

<?php
if ($_SERVER["REQUEST_METHOD"]=="POST"){
if($postchk=="0" or $telchk=="0"){
header("Location: error.php");
exit;
}
}
?>

<html>
<body>

<?php


if(isset($_POST['post'])){
$post=htmlspecialchars($_POST['post']);
if(get_magic_quotes_gpc()) $post = stripslashes($post);

if(isset($_POST['tel'])){
$tel =htmlspecialchars($_POST['tel']);
if(get_magic_quotes_gpc()) $tel = stripslashes($tel);


if($post==""){
echo "郵便番号を入力してください<br>";
}elseif(ereg("[^0-9\-]",$post)){
$postcheck="0";
}

if($tel==""){
echo "電話番号を入力してください<br>";
}elseif(ereg("[^0-9\-]",$tel)){
$telcheck="0";
}

?>

■個人情報を入力して確認ボタンを押してください<br>
<form method="POST" action="a.php">
郵便番号 : <input type="text" name="post"><br>
電話番号 : <input type="text" name="tel"><br><br>
<input type="submit" value="確認" name="submit"> <input type="reset" value="取り消し">
</form>

</body>
</html>

『郵便/電話番号に半角数字・ハイフン以外が使われている場合』に、それぞれの事象に用意した変数$postchk、$telchkにゼロを当てはめておいて、そのどちらか一方、もしくは両方の条件がそろえばエラー画面に遷移、と考えて打ったつもりなのですが、いかがでしょう…

今はxamppを使って勉強しているので、header()内は相対パスでもかまわないかなと思ったのですがどうなのでしょうか。(どちらを書いても、現時点ではそもそもどこかおかしくて上手くいかないので判断のつけようがないのです;)

それと、余談ですが、★~★の部分というのはこの場合(…入力を半角数字限定に促す場合、でしょうか…)必要でしょうか?参照したスクリプトから引っ張ってきて真似して書いたものなのでちょっとよくわからないでいます…名前や住所の欄の分も書いてあるのですが、いかがでしょうか。


長い上に話の焦点が左右してしまってすみません…
エラー画面に飛べてもそのとき表示するメッセージをまた区別しないといけないとか、最終的にb.phpにすべての入力情報を引き渡す方法とか、実のところ他にもわからないことだらけなのですが、今回はこの点に関して、質問させていただきます。記述や考え方の間違い等、ご指摘いただければと思います。
よろしくお願いいたします。

A 回答 (4件)

なるほど。

未入力エラーはページ遷移をさせないのですね。
入力されたスクリプトだと、<html>タグの前にエラーメッセージが
出てしまいますよ。
手順としては、以下のような方法などでいいと思います。

1.[ここからPHP]POSTデータの取得
2.郵便番号の未入力&形式チェック
  正常ならフラグを0、未入力エラーならフラグを1、形式エラーならフラグを2
3.電話番号の未入力&形式チェック
  正常ならフラグを0、未入力エラーならフラグを1、形式エラーならフラグを2
4.未入力エラーが存在せず形式エラーが存在する場合はheader(エラーページ)
  [ここまでPHP]
5.<html><head><body>(PHPスクリプトで出してもいいけど)
6.[ここからPHP]郵便番号、電話番号の未入力エラーが存在していたら
  エラーメッセージを出力[ここまでPHP]
7.HTML書きまくり

どちらが形式エラーか判別するのは、入力された内容も保持したいならば
セッションにしてしまえば良いでしょう。
    • good
    • 0
この回答へのお礼

お礼が遅くなってしまって申し訳ありません;;

丁寧なご説明、感謝いたします!
教えていただいたとおりに組んだらうまく走りました。順番がおかしかったんですね…
本当にありがとうございました!
あとは入力されたデータを確認画面にもってくとこのみです^-^;
引き続き試行錯誤しつつがんばりたいと思います。

ご回答くださった皆様、どうもありがとうございました!

お礼日時:2007/06/19 16:24

<html>


<body>

こいつらは、入力チェックが通った後に記述すればいいでしょう。
つまり、<?php ~ ?>の括りは上部1つ、以降は全てHTMLという形。
チェックして、チェックにひっかかったらheader()の流れでは?
それと、エラーチェックするのはいいのですが、エラーだったら
エラーページに飛んでエラーである旨を記すんですよね?
そしたら、echoの~を入力して下さいというメッセージは
ここで出すべきメッセージではないのでは?
そこにechoではなくheader()が来るんではないのですか?
そこでメッセージを出しているからheader()が先頭にないと
などと悩むのだと思います。
a.phpで一度エラーメッセージを出してから、自動的に
error.phpへ飛ばしたいという事ですか?

この回答への補足

ご回答ありがとうございます。

<?php~?> はひとつにまとめてしまっても構わないのですね。
<HTML>上部に書かないと動かないものは大体わかるのですが、<HTML>内に書くものとそれとの区別が頭の中でいまいちつけられていないのです…。

エラーメッセージについてですが、エラーページで出すメッセージは『郵便/電話番号に半角数字とハイフン以外の文字が使われています』というメッセージで、上記スクリプトの中にechoされてる『郵便/電話番号を入力してください』のメッセージは、a.php側で処理しようと思っているものです。
質問に直接関係ないと思ったので省いたのですが、その場合はfunction(){}とJavascriptを使ってポップアップでメッセージが出るように設定してあります(こちらはできたのですが・・・)。
なので実際打ってるスクリプトでは、上記のecho"";の代わりにそれを実行する命令を入れています。言葉足らずでわかりづらくてすみません。

『郵便/電話番号に半角数字とハイフン以外の文字が使われています』のメッセージは、naktakさんのご意見のように、a.phpではなくerror.phpのほうでメッセージを出すよう命令する方法を考えていました。
そのとき、エラーメッセージは『郵便番号に~』と『電話番号に~』と、それぞれの場合で出力されるものを区別したいのですが、ただチェックに引っかかったときエラーページに飛ばしただけではそれはできないですよね…?
この操作というのは、エラーにひっかかったらエラーページに遷移、と共に、それぞれの値(?)をセッションでerror.phpに引渡し、それらを使ってerror.php側で出力するメッセージを設定する、という形では可能なのでしょうか。ちょっと、伝わりにくいかもしれないのですが・・・

とりあえず書き直してみたのですけれど、いかがでしょう;;↓
ひとまずerror.phpで出すメッセージは無視で、単に、半角数字とハイフン以外が使われていたときにこの記述でerror.phpに飛べるのかどうかを見ていただけますでしょうか。
お願いします。

<?php

if ($_SERVER["REQUEST_METHOD"]=="POST"){

$postcheck = 1;
if(($post!="") and (ereg("[^0-9\-]",$post))){
$postcheck = 0;
header("Location: error.php");
}elseif($post!=""){
echo "郵便番号 : ". $post; //本当はこの処理はb.phpでしたいのですが、今は自分がわかりやすいようにこれでやってみてます><;
}else{
echo "郵便番号を入力してください<br>"; //ここの処理が、実際はポップアップで出そうとしているところです。
}

$telcheck = 1;
if(($tel!="") and (ereg("[^0-9\-]",$tel))){
$telcheck = 0;
header("Location: error.php");
}elseif($tel!=""){
echo "電話番号 : ". $tel;
}else{
echo "電話番号を入力してください<br>";
}

}

?>

<html>
<body>

■個人情報を入力して確認ボタンを押してください<br>
<form method="POST" action="a.php">
郵便番号 : <input type="text" name="post"><br>
電話番号 : <input type="text" name="tel"><br><br>
<input type="submit" value="submit" name="確認"> <input type="reset" value="取り消し">
</form>

</body>
</html>


思いの外ごちゃごちゃしてしまいました…すみません。

補足日時:2007/06/14 11:11
    • good
    • 1
この回答へのお礼

こんなところにすみません、上記の訂正です。
スクリプト内の$postcheck = 1;/0;・$telcheck = 1;/0;はこの場合不要ですね。失礼しました;

お礼日時:2007/06/14 11:25

header()をうまく先頭配置に出来ないときは、出力をバッファリングして、先にheader情報が送信されるようにします。


バッファリング用関数 ob_start ()
ページの最後に出力 ob_end_flush()
http://php.s3.to/man/function.header.html
http://php.s3.to/man/function.ob-start.html

参考URL:http://php.s3.to/man/function.header.html,http://php.s3.to/man/function.ob-start.html
    • good
    • 0
この回答へのお礼

ご意見ありがとうございます!

添えていただいたURL,しっかり読んで試してみたいと思います。
どうもありがとうございました*

お礼日時:2007/06/14 09:52

抜き出したのは全てa.phpで一つのファイルでしょうか。



if ($_SERVER["REQUEST_METHOD"]=="POST"){

が最初にあって、チェックしてるのが下にある状態であればおかしな感じだと思います。

これをチェックの次に入れるといいんじゃないかと思います。

また、チェックをする前に

$telcheck=1;
$postcheck=1;

のように値を入れておかないとおかしなことになりそうです。

★の部分は別にいらなそうですが、あっても良さそうです。
    • good
    • 0
この回答へのお礼

ご回答、ありがとうございます!

抜き出したのは、仰るとおりa.phpのみからです。

ご意見の前半部分に関して、たしかに言われてみると順番がおかしいかも、と思います。
なのですが、たしかheader()はスクリプトの一番上に書かないといけないんでしたよね…?
<html>の前のphp部分全部をチェック下に持っていくとおかしいでしょうか?
もしheader()部分だけは<html>より上に置いておかなければならないとしたら、この場合どう記述すればよいでしょうか…


それからこちらの記述ミスなのですが、$postchkは$postcheck、$telchkは$telcheckとそれぞれ同じもののつもりです。
凡ミスすみません;;

お礼日時:2007/06/13 10:12

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

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