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

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

ただいまの
回答率

90.87%

  • PHP

    18587questions

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

PHPにて年月日制限

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 137

ryusan_012

score 6

PHPだけで入力制限をしようと思います。
前の画面でにゅうりょくしたNO、氏名、所属、生年月日を入力してこの画面で入力内容を確認します。
確認画面では入力された内容がエラーではないかを表示するんですが、下のコードではなぜか生年月日に存在する日付を入力してもtrueの値しか返ってきません。
正しい日付だとelseの処理が動いてほしいです。
特にエラーもでてませんし、URLで値も取れてきていることが確認できています。
条件とかがまちがっているのでしょうか?

regi_re.phpは登録するためのファイル、register.phpは入力するためのファイルです。
register.php→rei_ch.php→regi_re.phpの順番で処理が動きます。

<!DOCTYPE html>
<html lang="ja">

    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>register_check</title>
    </head>

    <body>
        <h2>登録情報確認</h2>

        <?php
            try{
                $n_number=$_GET['n_number'];
                $n_name=htmlspecialchars($_GET['n_name'], ENT_QUOTES,'UTF-8');
                $n_class=htmlspecialchars($_GET['n_class'], ENT_QUOTES,'UTF-8');
                //$n_birth=$_GET['n_birth'];
                $year=$_GET['year'];
                $month=$_GET['month'];
                $day=$_GET['day'];

                //PDO生成
                $dbh=new PDO('mysql:dbname=staff_manager;host=localhost;charset=utf8', 'uesr', 'passward');
                $stmt=$dbh->prepare("select count(*) from staff_master where ID = :s_number");
                $stmt->bindValue(':s_number', $n_number, PDO::PARAM_INT);
                $stmt->execute();
                $count=$stmt->fetchColumn();

                //入力チェック
                if (empty($n_number) || empty($n_name) || empty($n_class) || empty($year) || empty($month) || empty($day)) { 
                    echo "<p>未入力項目があります。</p>";
                }elseif ((trim($n_number) == false) || (trim($n_name) == false) || (trim($n_class) == false)) {
                    echo "<p>空白が入力されています。</p>";
                }elseif ($count!=0) {
                    echo "<p>社員NOが重複しています。</p>";
                }elseif(checkdate($month,$day,$year)){
                    echo "<p>指定した日付は無効です。</p>"; 
                }else {
                    //登録情報確認
                    echo '<form method="get" action="regi_re.php">';
                    echo '<table>';
                    echo '<tr><td>社員NO</td><td>:'.$n_number.'</td></tr>';
                    echo '<tr><td>氏名</td><td>:'.$n_name.'</td></tr>';
                    echo '<tr><td>所属</td><td>:'.$n_class.'</td></tr>';
                    echo '<tr><td>生年月日</td><td>:'.$year.'年'.$month.'月'.$day.'日</td></tr>';
                    echo '</table>';
                    echo '<input type="submit" value="登録" />';

                    echo "<input type='hidden' name='s_number' value='$n_number' />";
                    echo "<input type='hidden' name='s_name' value='$n_name' />";
                    echo "<input type='hidden' name='s_class' value='$n_class' />";
                    echo "<input type='hidden' name='s_year' value='$year' />";
                    echo "<input type='hidden' name='s_month' value='$month' />";
                    echo "<input type='hidden' name='s_day' value='$day' />";
                    echo '</form>';
                }
            }catch(PDOException $e){
                echo "登録に失敗しました。";
                echo "エラー", $e->getMessage();
            }

            $dbh = null;
        ?>

        <input type="submit" onClick="location.href='register.php'" value="キャンセル" />
    </body>

</html>


register.php

<!DOCTYPE html>
<html lang="ja">

    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>register</title>
    </head>

    <body>

        <h2>新規登録</h2>

            <form action="regi_ch.php" method="get" style="display: inline">
                <table>
                    <tr><td>社員NO</td><td><input type="number" name="n_number" value="" /></td></tr>
                    <tr><td>氏名</td><td><input type="text" name="n_name"  value="" /></td></tr>
                    <tr><td>所属</td><td><input type="text" name="n_class"  value="" /></td></tr>
                    <tr><td>生年月日</td><td>
                    <?php
                        // 年のプルダウン
                        echo "<select name='year'>";
                        for ($y=1900;$y<date(Y)+1;$y++) {
                            echo "<option value=" . $y . " >" . $y . "</option>\n";
                        }
                        echo "</select>年";

                        // 月のプルダウン
                        $a=array("1", "2", "3", "4", "5", "6","7", "8", "9", "10", "11", "12");
                        echo "<select name='month'>";
                        foreach ($a as $key => $value) {
                            $b=$key + 1;
                            echo "<option value=" . $b . " >" . $b . "</option>\n";
                        }
                        echo "</select>月";

                        //日のプルダウン
                        echo "<select name='day'>";
                        for ($m=1; $m<=31 ; $m++) {
                            echo "<option value=" . $m . " >" . $m . "</OPTION>\n";
                        }
                        echo "</select>日";
                    ?>

                    </td></tr>
                </table>

                <input type="submit" value="確認" />
                <input type="button" onClick="location.href='master.php'" value="キャンセル" />
            </form>

    </body>

</html>


regi_re.php

<!DOCTYPE html>
<html lang="ja">

    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>register_resulte</title>
    </head>

    <body>
        <h2>登録結果表示</h2>
    <?php
        try{
            $pdo=new PDO('mysql:dbname=staff_manager;host=localhost;charset=utf8', 'uesr', 'passward');

            $n_number=$_GET["s_number"];
            $n_name=$_GET["s_name"];
            $n_class=$_GET["s_class"];
            $n_birth=$_GET["s_year"].sprintf( '%02d', $_GET["s_month"]).sprintf( '%02d', $_GET["s_day"]);

            echo $n_birth;
            if($pdo==null){
                echo "データベースの接続に失敗しました。";
            }else{
                $stmt=$pdo->prepare("insert into staff_master (ID,name,class,birth,delete_flag) value (:s_number,:s_name,:s_class,:s_birth,0)");
                $stmt->bindValue(':s_number', $n_number, PDO::PARAM_INT);
                $stmt->bindParam(':s_class', $n_class, PDO::PARAM_STR);
                $stmt->bindParam(':s_name', $n_name, PDO::PARAM_STR);
                $stmt->bindParam(':s_birth', $n_birth, PDO::PARAM_STR);

                $stmt->execute();

                echo ("登録が完了しました。");
            }
        }catch(PDOException $e){
            echo "登録に失敗しました。"; 
            echo $e->getMessage();
        }

            $pdo=null;

    ?>
        <a href="master.php">戻る</a>

    </body>
</html>
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • mts10806

    2018/05/31 11:22

    その旨、質問に追記してください。提示コードのファイル名 あとできればその他のファイルも提示可能な範囲で結構ですので追記してください。

    キャンセル

  • m6u

    2018/05/31 12:02

    志村ぁ、DBパスワード、DBパスワード!

    キャンセル

  • ryusan_012

    2018/05/31 17:08 編集

    ありがとうございます、忘れてました!

    キャンセル

回答 2

checkベストアンサー

+2

質問のタグ間違ってますので、他の方の為にも直してくださいね^^

✕ phpMyAdmin → 〇 php


なぜか生年月日に入力してもtrueの値しか返ってきません

は、
【どのような値を入れた】時に、【どのような返り値】を期待されているのかが不明ですが

checkdate は日付の妥当性を判断するものです。

日付として正しければtrue、おかしければfalseが返って来ます。

なので、

if(checkdate($month,$day,$year)){
  echo "<p>指定した日付は無効です。</p>"; 
}else{///以下略


は、
日付が正しい場合に、エラーメッセージが表示され、
日付がおかしい場合に、elseの処理に入ってしまいます。

リファレンスも確認してみてください。
php: checkdate

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/06/01 09:04

    そもそも私が勘違いしてたんですね、解説ありがとうございます

    キャンセル

+2

既に回答があるので補足(ほぼ答え)となってしまいますが、
「日付が正しくないときにエラー」とするならこう。

}elseif(!checkdate($month,$day,$year)){
  echo "<p>指定した日付は無効です。</p>"; 
}else {

!とすることで実行結果がfalse(つまり日付として正しくない状態)を判定できます。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

関連した質問

  • 解決済

    縦型のカレンダーを出力したい PHP

    最終的には画像のように送信ボタンを押したら、選択年月が曜日と合わせて テーブルで出力されるカレンダーを作りたいのですが、 月初の曜日を月末まで連続して出力する処理の書き方がわか

  • 解決済

    jQueryでの年計算について

    jQueryでプルダウンの年計算を作っているのですがどうしてもわからないところがあります。 $(function() { for (var i = 2017; i >= 190

  • 解決済

    PHP MySQL の連携

    PHPのWEBサイトで名前、年齢を登録ボタンを押すとMYSQLのテーブルに格納させる設定方法を教えて下さい。(レンタルサーバで各ソフトはインストールしています。)  PHPとMYS

  • 解決済

    【PHPmySQL】チェックボックス・フリーワードでの検索条件の絞り込み方法

    PHPmySQLでデータベースの検索結果を出力したいです。 接続はPDOで行いました。テーブル\(適当\)の画像は下に貼っておきます。 下記コードでは、フリーワードで入力した値

  • 解決済

    データベースのデータを複数のプルダウンに入れたいです。

    現在はプルダウンを一つ表示していますが、複数のプルダウンを作成したい場合はどうすればいいでしょうか? 下記のコードを丸ごとコピーして下に張り付けばできますが、あまりにも賢くない

  • 解決済

    PHPで複数の値をGETで受け取る方法

    $param_r1 = $_GET[r1]; $param_r2 = $_GET[r2]; $param_r3 = $_GET[r3]; $param_r4 = $_GET[r4]

  • 解決済

    PHPでカレンダーを表示させたいのですが・・・

    PHPでカレンダーを表示したいのですが・・・。 表示形式は 1日(日) 2日(月) 3日(火) と続くようにしていきます。 これは実際にできました。これを使って、土曜日は青、日

  • 受付中

    PHPでカレンダーを作成しているのですが・・・

    前回の質問ではたくさんの回答者さんによる回答ありがとうございます。 その時のプログラムと大して変わらないとは思いますが、表示する日付をプルダウンメニューにより指定し、表示ボタンを押

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

  • PHP

    18587questions

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