意図しない変数の内容 - PHPプロ!Q&A掲示板

2811

  • 0P

意図しない変数の内容

質問日時 / 2010年7月16日 19:09    回答数 / 3件

Questioner:  partagas  このエントリーをはてなブックマークに追加 

キーワード / 変数    意図    内容   

初心者です。フォームからの入力値(年月日)のチェックを行っています。「月」、「日」のチェック部分で$year、$monthがそれぞれ「1」になってしまい、エラーになります。定義以外で変数の中身をいじっている箇所は無いと思うのですが、原因がわかりません。

また、タイトル部分のif (isset($_POST['title']) && $_POST['title'])の右辺の必要性がわかりません。
(ソースは、このサイトの基礎講座を自分なりに手を加えたものです。)
お手数ですが、どなたかご教授お願いします。

  1. <?php
  2. if (isset($_POST['regit'])) {
  3. //入力内容のチェック
  4. $err_msg = array();
  5. $today = array(date('Y')date('n')date('d'));
  6. //全角→半角 数字以外、値の範囲外はエラー
  7. //年
  8.     if (isset($_POST['year'])) {
  9.         $year = mb_convert_kana($_POST['year']'a');
  10.         if (!is_numeric($year)) {
  11.             $err_msg[] = '「年」が数字ではない';
  12.         }
  13.         if ($year < $today[0] || $year > 2050) {
  14.             $err_msg[] = '「年」の入力値がおかしい';
  15.         }
  16.     } else {
  17.         $err_msg[] = '「年」が入力されていない';
  18.     }
  19. //月
  20.     if (isset($_POST['month'])) {
  21.         $month = mb_convert_kana($_POST['month']'a');
  22.         if (!is_numeric($month)) {
  23.             $err_msg[] = '「月」が数字ではない';
  24.         }
  25.         if ($month < 1 || $month > 12) {
  26.             $err_msg[] = '「月」の入力値が範囲外';
  27.         } elseif ($year = $today[0] && $month < $today[1]) {
  28.             $err_msg[] = '「月」の入力値がおかしい';
  29.         }
  30.     } else {
  31.         $err_msg[] = '「月」が入力されていない';
  32.     }
  33. //日
  34.     if (isset($_POST['day'])) {
  35.         $day = mb_convert_kana($_POST['day']'a');
  36.         if (!is_numeric($day)) {
  37.             $err_msg[] = '「日」が数字ではない';
  38.         }
  39.         if ($day < 1 || $day > 31) {
  40.             $err_msg[] = '「日」の入力値が範囲外';
  41.         } elseif ($year = $today[0] && $month = $today[1] && $day < $today[2]) {
  42.             $err_msg[] = '「日」の入力値がおかしい';
  43.         }
  44.     } else {
  45.         $err_msg[] = '「日」が入力されていない';
  46.     }
  47. //タイトル
  48.     if (isset($_POST['title']) && $_POST['title']) {
  49.         $title = $_POST['title'];
  50.     } else {
  51.         $err_msg[] = 'タイトルを入力';
  52.     }

この質問への意見の募集は締め切られ、ポイントは既に配分されました。
意見を投稿することはできますが、ポイントを受け取ることはできません。



ツリー一覧

┣A01shimix27: } elseif ($year = $today[0] && $month <
┣A02signal$_POST['title'] これは 【$_POST['title']】 の値
┗A03partagasお二人とも有難うございました! 最初の問題は単に

回答一覧

並び替え:

A01 満足
answerershimix [7月18日 01:28]

27:        } elseif ($year = $today[0] && $month < $today[1]) {
41:        } elseif ($year = $today[0] && $month = $today[1] && $day < $today[2]) {

この部分は代入(=)じゃなくて比較(==)ですよね?

27:        } elseif ($year == $today[0] && $month < $today[1]) {
41:        } elseif ($year == $today[0] && $month == $today[1] && $day < $today[2]) {


>タイトル部分のif (isset($_POST['title']) && $_POST['title'])の右辺の必要性がわかりません。

では、右辺を削除してタイトルが未入力の場合にキチンと検知できるかどうか試してみてください。左辺のisset()がどういうものかはマニュアルを読めばわかると思いますが・・

  http://jp.php.net/manual/ja/function.isset.php

この意見に回答する

ツリーへ TOPへ

A02 満足
answerersignal [7月19日 10:29]

$_POST['title']

これは 【$_POST['title']】 の値が真となるかのチェック

しかし $_POST['title'] が "0" だった場合、偽となるため
タイトルが "0" は許されなくなります

$_POST['title'] === ""
正確には空文字ならエラーとなるはずです


スペースやらなにやらの対策を入れるとすれば
trim($_POST['title']) === ""
もしくは
strlen(trim($_POST['title'])) === 0

この意見に回答する

ツリーへ TOPへ

A03
answererpartagas [7月19日 18:38]

お二人とも有難うございました!

最初の問題は単に演算子のミスでしたか。おっちょこちょいでした。

二番目は、型のキャストをするので、$_POST['tiltle']は空文字と"0"のときFALSEとなり、条件全体としては、
NULL,空文字,"0"がFALSEとなるのですね。ただ、スペースは受け入れるので、それを回避するには、右辺を
trim($_POST['title']) === "" や
strlen(trim($_POST['title'])) === 0
としなさいよ、と。

勉強になりました。有難うございました。
また、質問するかもしれませんが、その時はお付き合い頂ければと思います。

この意見に回答する

ツリーへ TOPへ

<<質問一覧へ



Pick Up Q&A

Q
動的なURLを静的に見せる方法
 このエントリーをはてなブックマークに追加 
A
普通に考えて、mod_rewrite でしょうね。 http://www.nishishi.com/blog/2006/01/mod_rewrite_url.html...

>>続きを読む

GETのままでは検索エンジンのロボットが拾ってくれなかったためにSEO対策として有効だと言われていますね。

▲解説者:岡本(アシアル株式会社 教育コーディネーター兼 システムエンジニア)