🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
PHP

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

バリデーション

Validationとは特定の入力データが、求められた条件に当てまっているかをチェックするために使われます。

Q&A

解決済

1回答

2492閲覧

checkdate関数でバリデーションした時、Notice: Undefined offsetエラーが出る

退会済みユーザー

退会済みユーザー

総合スコア0

PHP

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

バリデーション

Validationとは特定の入力データが、求められた条件に当てまっているかをチェックするために使われます。

0グッド

0クリップ

投稿2021/03/07 09:01

編集2021/03/07 09:10

##解決したいこと
タイトルの通りですが、生年月日のバリデーションチェックにおいて、checkdate関数でバリデーションした時、Notice: Undefined offsetエラーが出ます。
空で送信→offsetエラー
正しい形式の2020-1-1などで送信→エラーなし
あああなど、文字列を送信→Warning: checkdate() expects parameter 3 to be intエラー

以下バリデーション

$birth = filter_input(INPUT_POST,'birth'); 以下略 生年月日のバリデーション list($Y, $m, $d) = explode('-', $birth); if(empty($birth) || !checkdate($m, $d, $Y) === true) { $errors['birth'] = "誕生日は必須です。また、存在する年月日を入力してください。※形式にも注意"; }

イメージ説明
イメージ説明
##調べたこと
Notice: Undefined offsetは、配列で存在しない位置のインデックスを参照したときに発生する。

##コードを参考にしたところ
日付型のデータをチェックする

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

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

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

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

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

guest

回答1

0

ベストアンサー

空で送信→offsetエラー

listに割り当てるだけのデータができません。

php

1<?php 2list($Y, $m, $d) = explode('-', "");

list()

nullでないこと、空でないこと など事前のチェックが必要。
省略できない引数がある機能を使うときは絶対に必要。

むしろ、前提が必要なlist()に割り当てるのは不適当な仕様ではないでしょうか。
普通に受け取って添え字0からのアクセスをしたほうが良いと思います。
一応count()でのチェックも入れておけば
想定の形と担保もできなくはないです。

あああなど、文字列を送信→Warning: checkdate() expects parameter 3 to be intエラー

PHPマニュアルの通り

checkdate()

checkdate ( int $month , int $day , int $year ) : bool

型宣言で引数の型が指定されているためのエラー。

ミニマムコード

php

1<?php 2function test(int $a){} 3test("a");

上記の通り、checkdate()は引数が数字である前提で組まれている機能なので、その前提を全てクリアしたうえでのチェックをしないとWarningが消えることはないです。

想定しているフォーマットがあるのでしたらdate()でチェックしたほうがいいのでは?

php

1if($birth != null && $date !== date('Y-n-j',strtotime($birth))){ 2 3} 4

empty()は0もtrueになるので注意が必要。
filter_input()利用しているのであれば、nullでなければフォーマットチェックに通しても差し支えないと思います。

参考にした記事も6年前の個人の記事なので、全然参考にできません。

投稿2021/03/07 09:18

編集2021/03/07 09:32
m.ts10806

総合スコア80875

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問