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

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

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

4回答

284閲覧

PHPのバリデーション

TakehiroArakaki

総合スコア13

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2019/02/07 06:12

##PHPのバリデーション

##PHPのバリデーションで名前の欄から入力エラーを出したいのですが、先にメール欄からのエラーメッセージが発生します。

名前入力欄のエラーが後回しになっている

メールアドレスの形式が不明です ↑↑これから先に出てしまい困っています

該当のソースコード

<?php session_start(); $err = []; $char = []; $alpha = []; $many = []; $_SESSION = $_POST; function validation_name($name){ if ( strlen($name) > 5) { $many[] = "文字数が多すぎます"; return $many; } } function validation_email($email){ if ( $email == "" ) { $err[] = "メールアドレスを入力してください"; return $err; // 検証フィルタメールが正しくない場合実行処理 }elseif (!filter_var($_SESSION["email"], FILTER_VALIDATE_EMAIL)){ $err[] = "メールアドレスの形式が不明です"; return $err; } } if (isset($_POST["send"])) { unset($_POST); $char = validation_name($_SESSION["name"]); $alpha = validation_email($_SESSION["email"]); // 入力が正常の場合戻り値がNULLのためNULLでない場合$errに代入する if($char !== NULL) ($err = $char); if($alpha !== NULL) ($err = $alpha); if(count($err) === 0){ header("Location:confirm.php"); } } ?> <!DOCTYPE html> <html lang="ja" dir="ltr"> <head> <meta charset="utf-8"> <title></title> </head> <body> <?php if($err >= 0){ echo "<ul>"; foreach ($err as $error) { echo "<p>$error</p>"; } echo "</ul>"; }?> <form action="input.php" method="post"> <table> <tr> <h1>名前</h1> <input type="text" name="name" value="<?php echo ($_SESSION["name"])?$_SESSION["name"]: "" ?>"> </tr> <tr> <h1>メールアドレス</h1> <input type="text" name="email" value="<?php echo ($_SESSION["email"])?$_SESSION["email"]: "" ?>"></br> <div> <input type="submit" name="send"value="送信する"> </div> </tr> </table> </form> </body> </html>

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

ベストアンサー

php

1 // 入力が正常の場合戻り値がNULLのためNULLでない場合$errに代入する 2 if($char !== NULL) ($err = $char); 3 if($alpha !== NULL) ($err = $alpha);

このようになっていますので、両方エラーだった場合は$errが後の行で上書きされています。名前の方を優先したいなら、順番を逆にしましょう。


なお、これ以外にもおかしなところがあります。

  • strlenバイト数を返しますので、漢字2文字でもUTF-8であれば6バイトで> 5の条件を満たしてしまいます。
  • if($char !== NULL) ($err = $char);の箇所ですが、本来は後半のカッコが中括弧であるのが適切です(ここではたまたまうまく動いていますが)。

投稿2019/02/07 06:21

maisumakun

総合スコア145183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

TakehiroArakaki

2019/02/07 06:38

回答ありがとうございます。 さらに質問させてください! strlen以外の方法で、この場合の文字数制限方法はあるのでしょうか? それと逆にすると順番が変わるのは理解しました。 ですが、二つ同時にエラーを表示させる方法はないのでしょうか? 返答いただけると嬉しいです。
maisumakun

2019/02/07 06:40

> strlen以外の方法で、この場合の文字数制限方法はあるのでしょうか? strlenでも、長さを十分に確保すれば問題なく運用できます。 > 二つ同時にエラーを表示させる方法はないのでしょうか? メッセージを連結するなりしてください。
TakehiroArakaki

2019/02/07 06:44

早い返答ありがとうございます。 助かりました。 さっそくやってみます!
guest

0

バリデーションの作り方、参考と言うことで過去質問の私の回答をあげてみます(本質問への直接の回答ではないです)

https://teratail.com/questions/156171#reply-234441
https://teratail.com/questions/156612#reply-235175

というか下記のような作り最近見たような。
if (isset($_POST["send"])) { ~~~ header("Location:confirm.php");
これと同じ人じゃないですよねぇ?

投稿2019/02/07 07:32

m.ts10806

総合スコア80850

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

TakehiroArakaki

2019/02/07 07:35

参考の回答をありがとうございます。 同じ人ではないです。 初めてここに質問を投稿してみました。
m.ts10806

2019/02/07 07:37

なるほど。作りが非常に酷似していたもので。同じ資料を参照したんでしょうかね(お世辞にも良い資料とは言えませんが) 1人による複数アカウント所持は禁止行為なので気を付けてくださいね。
guest

0

$_SESSION = $_POST;

これはない・・・
$_POSTのデータを個別にバリデートして
成功したものだけ$_SESSIONに入れるのが筋。

その上で

if($char !== NULL) ($err = $char);

if($alpha !== NULL) ($err = $alpha);

のところでnameのエラーがでたものをメールのエラーが上書きしてますね
validation_nameやvalidation_emailも戻り値があったりなかったり
意味なく配列を返そうとしたりちょっと雑すぎます

投稿2019/02/07 06:33

yambejp

総合スコア114769

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

TakehiroArakaki

2019/02/07 06:57

そうなんですね! 初めてバリデーションを作るのでそういう基本的なことを教えてくれて助かります。
guest

0

PHP

1if (isset($_POST["send"])) { 2 unset($_POST); 3 4 $char = validation_name($_SESSION["name"]); 5 $alpha = validation_email($_SESSION["email"]); 6 7 // 入力が正常の場合戻り値がNULLのためNULLでない場合$errに代入する 8 if($char !== NULL) ($err = $char); // A 9 if($alpha !== NULL) ($err = $alpha); // B 10

$char と $alpha のどちらもが NULL でないとき、
A の if 文で $err に設定していますが、次の B も成立するので $err が $alpha に上書きされます。
ですから最後に NULL チェックした方が優先されてしまいます。

こうすれば望む動作かな?

// 入力が正常の場合戻り値がNULLのためNULLでない場合$errに代入する if($char !== NULL) ($err = $char); // A if($err == NULL && $alpha !== NULL) ($err = $alpha); // B

投稿2019/02/07 06:21

tacsheaven

総合スコア13703

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

TakehiroArakaki

2019/02/07 06:41

ifの順番を逆にする方法以外にもこの方法があったのですね。ありがとうございます。 さらに質問させてください。 名前とメールのエラーを二つ同時に出力したい場合はどのようにすればよろしいでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問