これから1ヶ月の間に誕生日を迎える社員を抽出して表示する
データベースを作成してここ1ヶ月に誕生日を迎える社員を表示したいです。
12月05日 木村
12月21日 佐々木
01月02日 加藤
上記のように表示したいです。日付が12月6日になったら12月5日生まれの木村は消える。
テーブル名 shop
name VARCHAR型
birth DATE型
name | birth
-----------------
田中|1992-11-15
吉田|1990-10-01
佐藤|1885-08-02
検索してみて似たようなものを真似してみたのですが、何も表示されない状態です。
--------------------------------------------------------------------
$stmt = $dbh -> query("SELECT * FROM shop WHERE birth BETWEEN curdate() - interval 1 month + interval 1 day AND curdate()");
while($row = $stmt -> fetch()){
print date('m月d日',strtotime($row['birth']));
print($row['name']);
}
--------------------------------------------------------------------
これはどのようにしたら抽出して表示できるでしょうか?
ご存知の方いらっしゃいましたらご教示ください。
よろしくお願いします。
No.1
- 回答日時:
相互リンク
http://detail.chiebukuro.yahoo.co.jp/qa/question …
同じことしか書きませんww
以下、質問者さんにならって私もコピペ
-------------------------------------------------------
少なくとも年月日で保持しているbirthをそのまま使うのは無理だと思いますね。date_formatで月日だけ切り出すべきでしょ
$stmd = date('m/d');
$endmd = date('m/d', strtotime('+1month'));
if ($stmd < $endmd) {
$sql = "SELECT * FROM shop where date_format(birth, '%m/%d') >= '$stmd' and date_format(birth, '%m/%d') <= '$endmd'";
} else {
$sql = "SELECT * FROM shop where date_format(birth, '%m/%d') >= '$stmd' or date_format(birth, '%m/%d') <= '$endmd'";
}
少なくとも、こちらで(テストデータを登録して)試した限りでは上記ソースで問題なく抽出されますので・・・
以下がテストに使ったソース全文です。最終的には同じSQLが生成されるハズです(上記のソースで生成したSQL文をphpMyAdminでSQL実行した結果も確認しています)。
<?php
$pdo = new PDO("mysql:host=localhost;dbname=test;charset=utf8", "root", "");
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$stmd = date('m/d');
$endmd = date('m/d', strtotime('+1month'));
$join = $stmd < $endmd ? 'and' : 'or';
$sql = "SELECT * FROM shop where date_format(birth, '%m/%d') >= ? " . $join . " date_format(birth, '%m/%d') <= ?";
try {
$sth = $pdo->prepare($sql);
$sth->execute(array($stmd, $endmd));
while ($row = $sth->fetch(PDO::FETCH_ASSOC)) {
print "<pre>";
var_dump($row);
print "</pre><hr />";
}
} catch (PDOException $e) { die($e->getMessage()); }
回答ありがとうございます。
こちらの方が何度もやり取りできるので良いですね。
実行してみた結果、下記のように配列のコードがずらっと表示されます。
1ヶ月以内に誕生日を迎える社員だけ配列に格納できているんですが、ここからどうやって「月日」と「名前」を並べられるかが分かりません。
array(19) {
["フィールド名"]=>
string(2) "値"
・
・
・
}
array(19){
["フィールド名"]=>
string(2) "値"
}
・
・
・
よろしくお願いします。
・
No.2
- 回答日時:
>1ヶ月以内に誕生日を迎える社員だけ配列に格納できているんですが、
>ここからどうやって「月日」と「名前」を並べられるかが分かりません。
$row['birth']と$row['name']に生年月日と名前が取得できているんですから、それを表示するだけです。
ご自分が最初に書かれたソースにはその部分が含まれていますよ(理解しないでコピペだけしたのでしょうか)。さすがにそこから説明するのは・・・とも思いますし、どういう表示にしたいかは好みの問題です。
while ($row = $sth->fetch(PDO::FETCH_ASSOC)) {
print date('m月d日', strtotime($row['birth'])) . '' . $row['name'] . '<br />' . PHP_EOL;
}
この回答への補足
ORDER BY date_format(birth, '%m/%d')でソートはできました。
しかし現時点では下記のように1月が頭にきてしまいます。
これを防ぐ方法はないでしょうか?
01月02日 佐々木
12月05日 伊藤
12月15日 佐伯
よろしくお願いします。
再度回答ありがとうございます。
ご教示頂いた方法で表示されたのですが、日付がテレコになってしまいます。
SQL文の最後に「ORDER BY birth」を追加してみましたが何も変わらず。
どのようにすれば日付順に並べることができるでしょうか?
何度も申し訳ないですが、よろしくお願いします。
No.3
- 回答日時:
>ご教示頂いた方法で表示されたのですが、日付がテレコになってしまいます。
>SQL文の最後に「ORDER BY birth」を追加してみましたが何も変わらず。
>どのようにすれば日付順に並べることができるでしょうか?
質問者さんが考えている『日付順』とはどういう並びなんでしょうか?「ORDER BY birth」なら生年月日順になっているハズです。
>ORDER BY date_format(birth, '%m/%d')でソートはできました。
>しかし現時点では下記のように1月が頭にきてしまいます。
>これを防ぐ方法はないでしょうか?
「防ぐ」とは?そう並ぶようにSQL文をかいているのですから、それを防ぐことは出来ませんよ。
取り出してから(php側で配列に格納するなどしてから)好きな順に並び替えて表示してもいい話ではないですかね(そもそも、現状ではphpは無関係でSQLの書き方の話になってます)。
#そもそも最初の質問では order に関しては何も書かれていません。後出しされても困ります。
#こちらも相手がクライアントなら気をつけますが、少なくとも質問者さんは「作る側」ですよね。
もしどうしてもデータベースからの取り出し時に「誕生日が近い順」に取り出したいのであれば
$stmd = date('m/d');
$endmd = date('m/d', strtotime('+1month'));
$join = $stmd < $endmd ? 'and' : 'or';
$sql = "SELECT shop.*, (case date_format(birth, '%m/%d') <= ? then 1 else 0 end) as sw FROM shop where date_format(birth, '%m/%d') >= ? " . $join . " date_format(birth, '%m/%d') <= ? order by sw, date_format(birth, '%m/%d')";
try {
$sth = $pdo->prepare($sql);
$sth->execute(array($stmd, $stmd, $endmd));
while ($row = $sth->fetch(PDO::FETCH_ASSOC)) {
print date('m月d日', strtotime($row['birth'])) . '' . $row['name'] . '<br />' . PHP_EOL;
}
} catch (PDOException $e) { die($e->getMessage()); }
でいいと思います。
swの値が誕生日が当年なら0, 翌年なら1 になるのはわかりますよね(月日が現在の月日以前で抽出対象になるのは「翌年」のものなので)。$joinを"and"と"or"で使い分けているのが理解出来ていれば自明だとは思いますが・・・
この回答への補足
回答ありがとうございます。
実行してみましたが、エラー文がでるだけです。
エラー文は下記のようになっています。
SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'then 1 else 0 end) as sw FROM shop where date_format(birth, '%m/%d') >= '12/04' at line 1
No.4ベストアンサー
- 回答日時:
失礼。
whenを書き漏らしてましたね。$pdo = new PDO("mysql:host=localhost;dbname=test;charset=utf8", "root@localhost", "");
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$stmd = date('m/d');
$endmd = date('m/d', strtotime('+1month'));
$join = $stmd < $endmd ? 'and' : 'or';
$sql = "SELECT shop.*, (case when date_format(birth, '%m/%d') <= ? then 1 else 0 end) as sw FROM shop where date_format(birth, '%m/%d') >= ? " . $join . " date_format(birth, '%m/%d') <= ? order by sw, date_format(birth, '%m/%d')";
try {
$sth = $pdo->prepare($sql);
$sth->execute(array($stmd, $stmd, $endmd));
while ($row = $sth->fetch(PDO::FETCH_ASSOC)) {
print date('m月d日', strtotime($row['birth'])) . '' . $row['name'] . '<br />' . PHP_EOL;
}
} catch (PDOException $e) { die($e->getMessage()); }
(前回との違いは$sqlへ代入する文字列リテラルだけです)
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- PHP PHP MySql ページング 2 2022/09/20 06:38
- Excel(エクセル) Excel2019、2021の日付、曜日の表示について 2 2022/11/29 15:01
- Visual Basic(VBA) 列 A に同じ日が2つが必要です。 1 2023/03/28 07:25
- PHP if(preg_match("/[^0-9]/",$gu_d)){意味を教えてください。 1 2022/05/06 05:37
- Access(アクセス) アクセス 有効なフィールド名、または式として認識できませんのエラー 3 2022/08/19 11:53
- Access(アクセス) アクセス where句を使用して複数条件抽出をするには 2 2022/08/29 13:24
- Excel(エクセル) PHPプログラムをエクセルに張り付けると検索ボックスがでてくる! 3 2022/05/08 07:10
- Visual Basic(VBA) ①ExcelVBAでカレンダーを作り、別のユザーフォームで日付を入力したいのですがエラーになります。 1 2023/02/17 18:39
- Visual Basic(VBA) ExcelのVBAでシフト表を作っていますが、バグが出て困っています 2 2022/09/13 11:33
- Excel(エクセル) エクセルの数式で教えてください。 2 2023/01/10 09:15
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルVBAについて
-
PHPでMY SQLの連想配列をリンク...
-
phpでmysqlを使ってデータベー...
-
アラートでyes noを作りたいです。
-
SQLのSUM関数で取得した値を参...
-
連想配列、オブジェクト配列の...
-
mysql_fetch_objectの書き方を...
-
DBで検索結果に該当するデータ...
-
phpとSQLでアクセスカウンタと...
-
phpでデータリスト作成
-
php 投票システム
-
PHPで[]の使い方について
-
トランザクション処理
-
VBAをつかってクエリの情報を抽...
-
実行時エラー3131 FROM 句の構...
-
PHP + MySQLを使用して詳細画面...
-
クエリObjectをforeachで回す時...
-
php データ削除
-
SQLインジェクション対策
-
Q&Aサイトを作成していてURLの...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
PHPで[]の使い方について
-
php テーブルが作成できない
-
dbに登録したデータをphpのプル...
-
アラートでyes noを作りたいです。
-
phpでmysqlを使ってデータベー...
-
DBで検索結果に該当するデータ...
-
文字化けが解決できません。お...
-
SELECT結果から動的にコンボボ...
-
checkboxクリック時、SQLを実行...
-
PHPでMySQLデータを呼び出し、w...
-
while文の中にwhile文を書きた...
-
sortable ギブアップです…助け...
-
重複レコードをグループ化した...
-
PHP と MySQL でテーブルの行数...
-
PHPでMySQLのデータを2次元配...
-
mysql>PHPにデータ表示、10件ご...
-
PHPについてなのですが未定義の...
-
VBA初心者です。
-
ラジオボタンをループすること...
-
PHP+MySQLでの配列のinsert文に...
おすすめ情報