- 締切済み
PHPで期間指定の実装
PHPで期間指定の検索機能を実装しています。var_dump($year)で値は取り出せていますが、SQL文の部分が分かりません。SQL文の部分をどのように修正すればいいですか? テーブルの構造は以下の通りです。 (timecardテーブル :id、 begin、 finish 、date ) (userテーブル :user_id、user_name、password) if ($_SERVER['REQUEST_METHOD'] === 'POST') { if (isset($_POST['year'])) { $year = filter_input(INPUT_POST, 'year'); try { // 該当する日付をSELECT文で検索する $sql = 'SELECT * FROM timecard WHERE date = ?'; $stmt = $dbh->prepare($sql); $stmt->bindValue(1, $year, PDO::PARAM_STR); $stmt->execute(); //全て取得するのでfetchALLでレコードを取得する $result = $stmt->fetchALL(); // phpmyadminには、2021-10-03の形式で保存されているので、2021の部分だけを抽出して$yearと比較する。 if(count($result) > 0 && $year === substr($result['date'], 0, 4)) { $msg[] = ('指定の出退勤の記録は以下の通りです。'); }else { $err_msg[] = ('指定の出退勤の記録はありません。'); } } catch (PDOException $e) { $err_msg[] = '出退勤の記録を取得できませんでした。'; } } } <div class="search"> <form method="post"> <?php for ($i=2000; $i <= 2021; $i++) { $year .= '<option value="'.$i.'">'.$i.'年</option>'; } ?> <input type="hidden" name="year" value="<?php $year;?>"> <select name="year">'.<?php echo $year;?> .'</select> <input type="submit" value="検索する"> </form> </div>
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- dell_OK
- ベストアンサー率13% (766/5720)
質問とは関係ありませんが、年の選択が2000~2021なのはこの範囲のデータしかない、あるいは、あっても無視するということでしょうか。 来年になったら、プログラムの修正が必要になってきます。 なので、 SELECT DISTINCT DATE_FORMAT(date, '%Y') AS year FROM timecard ORDER BY year などとして、<option>のための年の集まりをデータから取得してみるのはどうでしょうか。
- dell_OK
- ベストアンサー率13% (766/5720)
データベースはMySQLでしょうか。 でしたらDATE_FORMAT関数を使って年を取り出せるので、 以下のような記述で日付の中から年が一致するものが抽出できます。 WHERE DATE_FORMAT(date,'%Y') = ? 試してみたところ、dateが文字列型でも日付型でも抽出できました。
- hogehoge78
- ベストアンサー率80% (433/539)
逆に理由をお伺いしてもよろしいですか? 1年は1/1から12/31で変動がないので、date型でテーブルに保存されているのであれば、BETWEENで日付範囲を絞り込むのが妥当だと思います。 $min = $year . '-01-01'; $max = $year . '-12-31'; とかして文字列生成すればいいだけですから。 また、勤怠の打刻ということであれば、年で絞り込むは社会通念上、年度のことを指すと思います。 そうなると、年の数値だけで絞り込むと、2021-04-01~2022-03-31となる年度で絞り込むの難しくなるとおもいますよ。 それでもSUBSTRINGしたいのだ、ということであれば、それはSELECTのフィールド名指定の場所で書きます。 $sql = "SELECT SUBSTRING(date, 0, 4) AS year FROM timecard WHERE year = '{$year}';" 計算値を書いて、それの後ろに「AS」キーワードを入れて、別名「year」を設定する、という感じになります。 基本的にフィールド名に列挙されたところに、WHERE句で絞り込む、という仕様です。
- hogehoge78
- ベストアンサー率80% (433/539)
「期間指定」の定義は、 利用者には「年」を入力してもらい、その年のすべての打刻記録を取得したいということですか? 少なくとも、WHERE句にuser_idは必要だと思いますが、ログインして利用するものなら、user_idはセッションからとってくる感じですかね。 本題の、年に関してですが、単純に日付範囲で絞り込む必要があるかと。 ■年の定義が、その年である場合($year = 2021) WHERE date BETWEEN '2021-01-01' AND '2021-12-31' ■年の定義が、年度である場合($year=2021) WHERE date BETWEEN '2021-04-01' AND '2021-03-31' と、なるんじゃないですかね。
補足
phpmyadminには、2021-10-03の形式で保存されているので、「2021の部分だけを抽出し、$yearと一致するものを検索」します。 $sql = 'SELECT date FROM timecard WHERE SUBSTRING(date, 0, 4) = $year'; のように、dateの年の部分と$yearを比較できるようにしたいです。