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

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

ただいまの
回答率

88.59%

POSTの値チェック

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 3,097

Z-TALBO

score 493

フォームからPOSTで値を飛ばした際に、値がNullかどうかとかをチェックしていくのをやっていきたいのですが、どうもあと一歩がうまく行かない部分もあったので、質問いたします。

<form action="" method="POST">
<input type="text" name="name">
<input type="password" name="password">
<select name="color">
  <option></>
  <option></>
  <option></>
  <option></>
</select>
<input type="submit" value="送信">
</form>


簡単に上記のようなフォームがあるとします。
全ての項目は必須項目としたいと思います。

値があるか無いかのチェック後、値が全てあればDBに挿入するという仕組みを考えています。

【表示方法】
<input type="text" name="name"> // 名前に関するエラー
<input type="text" name="password"> // パスワードに関するエラー
<select name="color"> // 色に関するエラー
このようにフォームの横にそれぞれエラーが出るのが理想です。

それぞれ、未入力のまま送信されると、そのフォーム横に未入力ですとエラーメッセージが出るようにし、エラーが無かった場合に値を変数に代入して、DBに接続してInsertという流れです。

※DBへの接続とInsertに関しては動作確認できております。

【チェック内容】
値が入力されているかどうか?
名前に関してはabc123などのアルファベットや数字はNGとしたいので、表現はOKか?
パスワードに関してはabc123などのアルファベットや数字のみにしたいので、表現はOKか?

※カラーに関してはselectで選ぶという方法にしていますので、表現に関する部分は大丈夫?なのかなとおもうんです。


[追記]
こういう書き方はどうなのか?なのですが、、、

if ($_POST['name'] === "") {
$error['name'] = "名前が無い";
}
// 同じようにpasswordとcolorも

<input type="text" name="name"><?= h($error['name']); ?>
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

0

isset($_POST['name'])もしくはarray_key_exists('name', $_POST)でパラメータを受信できているかをチェックした上で$_POST['name']を評価するのがエラー(ワーニング)回避できそう。

$err_msgsっていう配列にエラーが見つかるたびにエラーメッセージをためていく例:

$err_msgs = array();
if (!array_key_exists('name', $_POST)) :
  $err_msgs[] = 'nameなし';
elseif (...) :  // nameがある場合
  $err_msgs[] = '...';
endif;
if (!array_key_exists('age', $_POST)) :
  $err_msgs[] = 'ageなし';
elseif (...) :
  $err_msgs[] = '...';
endif;

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/02/27 00:18

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

    参考にさせていただきます!

    キャンセル

0

エラーフラグをもっといて
各項目に対して入力されているかのチェックを行ってフラグ管理します。
エラー出力はエラーがある場合に表示したい箇所に対象エラー文を表示させればよいです。

あと早いうちから
「xss対策」を把握しておいたほうが吉です。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/02/26 14:36

    エスケープはなんとなく、いろいろ見ていてfunctionで関数作ってやることができます。

    一応、値があるかどうかに関しては追記してみたんですが、そんな感じで良いのですかね?

    キャンセル

  • 2016/02/26 17:45

    Wordpressにおいては、
    esc_html()とesc_attr()を使えばひとまずは大丈夫かと。
    エラーチェックは別の方が掲示されているのでそちらを参考に。

    キャンセル

  • 2016/02/27 00:17

    wordpressやってないんです、、、
    やってみたいとは思ってるんですが、、、

    キャンセル

  • 2016/02/27 00:19

    すみません、別件と混同してました…

    キャンセル

0

こんなのどうでしょう?

/**
 * postデータを検証
 *
**/
function validate(array $postData)
{
   $errorMessage = array();
   if (! $postData) {
       return $errorMessage['all_empty'] = '不正なpost通信です';
   }
   $checkedData = array_filter($postData, 'isBlank');

   foreach($checkedData as $key => $value) {
      $errorMessage[$key] = $key . 'が空です';
   }
   return $errorMessage;
}

/**
 * 空文字とnullを判別
 *
**/
function isBlank ($v) {
   return is_null($v) || $v === '';
}


validate() で中身の入った配列が帰ってきたら、エラー表示。
そうでない場合はDB登録処理を走らせる的な。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/02/27 00:19

    こういうのが、すっとできるようになりたい、、、そう思ってしまいます、、、

    ありがとうございます!参考にさせていただきます!

    キャンセル

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

  • ただいまの回答率 88.59%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る