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にすべての入力情報を引き渡す方法とか、実のところ他にもわからないことだらけなのですが、今回はこの点に関して、質問させていただきます。記述や考え方の間違い等、ご指摘いただければと思います。
よろしくお願いいたします。
No.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書きまくり
どちらが形式エラーか判別するのは、入力された内容も保持したいならば
セッションにしてしまえば良いでしょう。
お礼が遅くなってしまって申し訳ありません;;
丁寧なご説明、感謝いたします!
教えていただいたとおりに組んだらうまく走りました。順番がおかしかったんですね…
本当にありがとうございました!
あとは入力されたデータを確認画面にもってくとこのみです^-^;
引き続き試行錯誤しつつがんばりたいと思います。
ご回答くださった皆様、どうもありがとうございました!
No.3
- 回答日時:
<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>
思いの外ごちゃごちゃしてしまいました…すみません。
こんなところにすみません、上記の訂正です。
スクリプト内の$postcheck = 1;/0;・$telcheck = 1;/0;はこの場合不要ですね。失礼しました;
No.2
- 回答日時:
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
No.1
- 回答日時:
抜き出したのは全てa.phpで一つのファイルでしょうか。
if ($_SERVER["REQUEST_METHOD"]=="POST"){
が最初にあって、チェックしてるのが下にある状態であればおかしな感じだと思います。
これをチェックの次に入れるといいんじゃないかと思います。
また、チェックをする前に
$telcheck=1;
$postcheck=1;
のように値を入れておかないとおかしなことになりそうです。
★の部分は別にいらなそうですが、あっても良さそうです。
ご回答、ありがとうございます!
抜き出したのは、仰るとおりa.phpのみからです。
ご意見の前半部分に関して、たしかに言われてみると順番がおかしいかも、と思います。
なのですが、たしかheader()はスクリプトの一番上に書かないといけないんでしたよね…?
<html>の前のphp部分全部をチェック下に持っていくとおかしいでしょうか?
もしheader()部分だけは<html>より上に置いておかなければならないとしたら、この場合どう記述すればよいでしょうか…
それからこちらの記述ミスなのですが、$postchkは$postcheck、$telchkは$telcheckとそれぞれ同じもののつもりです。
凡ミスすみません;;
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- PHP 入力した部分を表示させたまま(保持)するにはどうすれば良いでしょうか? 1 2023/01/25 11:14
- PHP PHPで画像の渡しが上手く行きません。 1 2023/02/02 09:39
- JavaScript ①入力フォーム→②確認表示画面→③送信完了画面のコードを書いているのです、 入力フォームから受け取っ 2 2022/05/10 16:45
- PHP PHPでユーザー情報を入力して簡易ログイン機能をつくってみたのですが 1 2023/05/29 08:51
- JavaScript 入力フォームの javascript で メールアドレスの正規チェックをを行い、ボタンをクリックして 2 2022/04/27 16:06
- JavaScript フォームが空欄の時にフォームの外をクリックすると、エラーが出るコードを調べています。 1 2023/06/25 11:51
- PHP if(preg_match("/[^0-9]/",$gu_d)){意味を教えてください。 1 2022/05/06 05:37
- HTML・CSS ボタンをクリックした時に、入力フォームのすぐ下部に、「入力欄が空白です」というテキストメッセージが表 1 2022/04/27 16:25
- JavaScript sessionStorageを調べています。 1 2023/06/20 12:41
- PHP PHPのエラーの解消法について教えて下さい。 1 2023/02/06 10:48
このQ&Aを見た人はこんなQ&Aも見ています
-
プロが教える店舗&オフィスのセキュリティ対策術
中・小規模の店舗やオフィスのセキュリティセキュリティ対策について、プロにどう対策すべきか 何を注意すべきかを教えていただきました!
-
フォントの色を変えるには?
PHP
-
PHPで、エラーがない場合のみ画面遷移させたい
PHP
-
PHP ボタンが押されたら処理を実行する
PHP
-
-
4
issetでボタンが押されたかを確認するには
PHP
-
5
データ送信をボタンを押さずに行いたいのですが...
PHP
-
6
別ファイルの変数を呼び出したいのですが?
PHP
-
7
ボタンをクリックでPHP文を実行
PHP
-
8
$_SESSIONに二次元配列を使えるのですか?
PHP
-
9
条件により、リンク先に画面遷移しないようにする方法
JavaScript
-
10
PHPでURLにジャンプするには?
PHP
-
11
php mysql で WHERE句内に変数を入れる方法を教えてください。
PHP
-
12
php,mysqlにて画像パス保存/表示につい
PHP
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
phpでPEAR::DBを使っているので...
-
フォントの色を変えるには?
-
正規表現での最後尾のバックス...
-
PHPでFetalなエラーが発生した場合
-
「@$変数」の「@の意味は?」
-
bindValueエラー
-
PHPにて外部サイト内容が取得不...
-
空メールでの自動返信:ガラケ...
-
PHP8を使うと、大量のWarningが...
-
SELECTの値を保持する
-
phpでクラスのメソッドで同名の...
-
ある条件に当てはまったときに...
-
PHP 文字列を代入した配列を変...
-
phpをブラウザで表示しようとす...
-
ワードプレスサイト PHP8.0.25...
-
fsockopenの例外について
-
PHPでクラス内のpublicでエラー...
-
windows環境でphpのfopenが使用...
-
PHPでSMTPを使ってメール送信で...
-
パースエラーとは?
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
PHP8を使うと、大量のWarningが...
-
フォントの色を変えるには?
-
ワードプレスサイト PHP8.0.25...
-
トランザクションが原因?DBに...
-
PHPでfatal errorが出ても無視...
-
PHPでネットワークドライブのop...
-
「@$変数」の「@の意味は?」
-
パースエラーとは?
-
PHPで特定のURLにジャンプす...
-
正規表現での最後尾のバックス...
-
phpでクラスのメソッドで同名の...
-
error_reporting(0);にも関わら...
-
PHPで、エラーがない場合のみ画...
-
php7のhtmlentitiesはEUC-JPを...
-
phpのrenameでエラーが出ます
-
phpでget_headers()が使えない?
-
メールアドレスにメールが届い...
-
phpのエラー(T_LNUMBER)について
-
urlの直接入力を防ぐには
-
これは例外処理でしょうか?
おすすめ情報