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

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

新規登録して質問してみよう
ただいま回答率
85.50%
PHP

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

Q&A

解決済

3回答

5941閲覧

PHP/取得した日付から一週間分のセレクトボックスを生成する

退会済みユーザー

退会済みユーザー

総合スコア0

PHP

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

0グッド

0クリップ

投稿2016/03/28 23:54

おはようございます。
PHPにて不明な点がありますので、ご教授頂けますでしょうか。

①データベースに登録された日付を取得する。(以下$row2['ymd2'])
②重複している日付を削除。(DISTINCTで対応済み)
③残った日付郡と本日を比較し、前後1週間分の日付をセレクトボックスにて自動生成させるというパーツです。

このセレクトボックスで選択した値の返り値が$dropsomeになっています。

//サンプルコード
echo "<form action=somedays.php method=post>";
echo "日付選択:\n";
echo "<select name=inputymd>\n";
foreach ($result2 as $row2){
echo "<option value=". $row2['ymd2'];
if($dropsome == $row2['ymd2']) echo " selected";
echo ">";
echo htmlspecialchars($row2['ymd2'], ENT_QUOTES, 'UTF-');
echo "</option>\n";
echo "<br>\n";
}
echo "</select>\n";
echo "<input type=submit value=変更>" . " " . "<input type=button value=印刷 onclick=window.print(); />";
echo "</form>";

よろしくお願い致します。

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

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

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

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

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

guest

回答3

0

ベストアンサー

PHPで不明な点というのがどれのことかよくわからないんですが
前後1週間分の日付判定が不明という事なのでしょうか?
DBから日付を取得する時に今日の前後1週間分だけを抽出して
おいてphpで表示する時に余計な判断せず全部表示とすればいい
のではないかと思いますが…
phpで1週間前や後は以下のようにして参照できます。
1週間前
date("Y-m-d H:i:s", strtotime("-1 week"));
1週間後
date("Y-m-d H:i:s", strtotime("+1 week"));

投稿2016/03/29 00:28

HiroshiWatanabe

総合スコア2160

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

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

退会済みユーザー

退会済みユーザー

2016/03/29 00:40

ご回答ありがとうございます。 その手法で試そうと思い、SELECT文 BETWEEN 'a' AND 'b'で aに1週間前の関数を、bに1週間後の関数を入れてみましたが抽出できませんでした。
HiroshiWatanabe

2016/03/29 00:42

1週間前後の範囲で絞り込む例としては select * from `data` where ((curdate() - interval 1 week) < `date`) and ((curdate() + interval 1 week) < `date`); とか select * from `data` where `date` between (now() - interval 1 week) and (now() + interval 1 week) とかになるかと思いますが…できませんでした? 抽出できないというのはSQLのエラーですか?それとも結果が全部になってしまうという事でしょうか? そう言えば少し話し変わりますがDBで絞り込むのであろうと表示時に判定するのであろうと、1週間前が7日前の0時なのか 7日前の今の時間なのかの基準も決めておかないといけませんね。
退会済みユーザー

退会済みユーザー

2016/03/29 01:29 編集

自分で書いた例では $ago6 = date('Y-m-d', strtotime('+1 week', $dropname)); $later6 = date('Y-m-d', strtotime('-1 week', $dropname)); $sql2 = "SELECT DISTINCT ymd2 FROM coretime BETWEEN '$ago6' AND '$later6' order by ymd2"; 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 'BETWEEN '1970-01-08' AND '1969-12-25' order by ymd2' at line 1 となり、 ご回答いただいたコードを挿入すると SQLSTATE[42S22]: Column not found: 1054 Unknown column 'date' in 'where clause' とエラーが出ました。 ためしにstrtotimeで拾っている日付を拾得したところ、1970-01-07と全く違う日付が結果で出てきました。 こちらも現状合わせて調べています。
退会済みユーザー

退会済みユーザー

2016/03/29 01:23

見落としていました。 特に時間で絞り込む予定はありませんので、0時で良いかと思います。
guest

0

解決できました。

DBに登録された日付から1週間前後と判別しようとしましたが、strtotime関数を使用するとどうしても初期値の1970/01/01から抜け出せなかった為、諦めて本日日付からの判別にしました。

ご協力頂きましてありがとうございました。

投稿2016/03/29 02:07

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

今の状況はデータベースの日付がすべて表示されているってことでよいでしょうか?(重複を除く)

投稿2016/03/29 00:24

test0001

総合スコア224

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

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

退会済みユーザー

退会済みユーザー

2016/03/29 00:27 編集

ご質問ありがとうございます。 全て表示されている状況です。 現状だと制御がかかってないので、登録すればするほどどんどん溜まっていくという状況なので、どちらかというと制御をかけたいです。
test0001

2016/03/29 00:43

# 1週間前 select * from test_table where datediff(created_at, curdate()) = -7; select * from test_table where date(curdate() - interval 1 week) = date(created_at); select * from test_table where date(date_sub(curdate(), interval 1 week)) = date(created_at); # 1週間後 select * from test_table where datediff(created_at, curdate()) = 7; select * from test_table where date(curdate() + interval 1 week) = date(created_at); select * from test_table where date(date_add(curdate(), interval 1 week)) = date(created_at);
退会済みユーザー

退会済みユーザー

2016/03/29 00:58

ご回答有難う御座います。 初心者で申し訳御座いません。 現状は $sql2 = "SELECT DISTINCT ymd2 FROM coretime order by ymd2"; こういったSQL文を記述しているのですが、ご回答頂いたコードをどこに挿入すればいいのか分かりませんので、お手数ですがご教授お願い致します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問