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

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

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

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

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

Q&A

解決済

2回答

3967閲覧

複数のレコードの値を取り出すには

leoairen

総合スコア122

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

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

0グッド

0クリップ

投稿2016/06/25 06:44

編集2016/06/25 07:35

初心者です。あるカラムから複数のレコードの値を取り出すにはどのように書けばよいかどなたか教えていただけますでしょうか。

下記のコードではcalendartblというテーブルから1レコードのみ取り出せます。

テーブル:calendartbl

holiday(カラム名)
2016/9/12(レコード1行目)
2016/9/14(レコード2行目)
2016/9/20(レコード3行目)
2016/9/26(レコード4行目)
2016/9/28(レコード5行目)

コード:

$sql = "SELECT calendartbl.holiday FROM calendartbl"; $ret = f_db_select($sql); foreach ($ret as $h){ $holiday = $h['holiday']; }

結果=2016/9/12

では複数のレコード、つまり「2016/9/12、2016/9/14、2016/9/20、2016/9/26、2016/9/28」を取り出して、上記の$holidayに代入させるにはどのように書けばよいでしょうか。

また、$holidayに入った複数の日付がカレンダーにある日付と一致したときにある処理を実行したいのですが、その場合、下記のような書き方をどう修正すればよろしいでしょうか。

if (date("Y-m-d", mktime(0, 0, 0, $m, $d, $y)) == $holiday){ 処理 }

どなたか教えて頂けたら幸いです。

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

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

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

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

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

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

guest

回答2

0

ベストアンサー

データベースにおいて複数レコードを取得するには、FETCH(フェッチ)という仕組みの理解が必要です。
要は、クエリの結果が複数あって、それを1件ずつ取得する仕組みです。
ファイルの読み込みで、1行ずつ読み込む処理と同じような感じです。
という前提で回答したいのですが、提示されているコードのf_db_select関数は独自の関数ですよね、きっと。
この関数の戻り値がどういったものなのかによります。
結果を配列に格納して返してくれるのならYK1037さんの方法で良いと思います。
そうでなかったら前述の通り、FETCHを使い必要があります。

投稿2016/06/27 01:44

ttyp03

総合スコア16998

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

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

leoairen

2016/06/27 02:34 編集

ご回答、ありがとうございます。 f_db_select関数は独自のものです。 YK1037さんの方法を参照して結果を配列に格納して返してくれるまではできました。 しかし、その結果を以下のコードにあてはまると、日付がぶつかってDBからとった日にちと平日に設定したい日にちがダブって出てしまいます。 for文で回す分と回したくない分が書けていないので、もし以下のコードで文法ミスなどありましたら教えて頂けたら幸いです。 // 土日祝以外(会社休日:赤色) else{ for($i=1; $i<count($holiday); $i++){ if (date("Y-m-d", mktime(0, 0, 0, $m, $d, $y)) == $holiday[$i]){ echo "<td class='sun'>$d</td>"; true; } } if ($holiday[$i] == true){ exit; }else{ echo "<td class='date'>$d</td>"; } }
ttyp03

2016/06/27 03:56

calendartblのholidayの型は何でしょう? ・日付型なら if (mktime(0, 0, 0, $m, $d, $y) == $holiday[$i]){ ・文字列型なら if (date("Y/n/d", mktime(0, 0, 0, $m, $d, $y)) == $holiday[$i]){
leoairen

2016/06/27 04:17

ご回答、ありがとうございます。 date 型ですが、コードの3行目を「if (mktime(0, 0, 0, $m, $d, $y) == $holiday[$i]){」に書き換えると処理しなくなります。 また、下記のような書き方は文法的に変ではありませんでしょうか。 if ($holiday[$i] == true){ exit; }else{ echo "<td class='date'>$d</td>"; }
ttyp03

2016/06/27 04:27 編集

こんな感じでしょうか(先ほど提示のコードを丸ごと入れ替えてください) if(array_search(mktime(0, 0, 0, $m, $d, $y), $holiday)){ echo "<td class='date'>$d</td>"; } else { echo "<td class='sun'>$d</td>"; }
leoairen

2016/06/27 04:40 編集

ご回答、ありがとうございます。 自分の書いたコードと丸ごと入れ替えましたが、「echo "<td class='sun'>$d</td>";」のみの処理になっております。 そしてエラーログを見ると下記のエラーが出ました。 「Warning: array_search() expects parameter 2 to be array, null given」
ttyp03

2016/06/27 04:37

失礼しました。条件が逆ですね。 if(array_search(mktime(0, 0, 0, $m, $d, $y), $holiday)){ echo "<td class='sun'>$d</td>"; } else { echo "<td class='date'>$d</td>"; } それでもダメなような気がします。 もしダメなら、var_dump($holiday)の結果を載せてもらえますか。
leoairen

2016/06/27 04:49

今度は「<td class='date'>$d</td>」のみの結果になっています。 var_dump($holiday)の結果を載せておきます。 array(6) { [0]=> string(10) "2016-09-12" [1]=> string(10) "2016-09-14" [2]=> string(10) "2016-09-20" [3]=> string(10) "2016-09-26" [4]=> string(10) "2016-09-28" } ご丁寧に見て頂き、ありがとうございます。
ttyp03

2016/06/27 04:53

var_dumpの結果を見て気づいていただけるとよかったのですが、holidayは文字列型ですね。 こうしてみてください。 これでできるといいな。 if(array_search(date("Y-m-d", mktime(0, 0, 0, $m, $d, $y)), $holiday)){ echo "<td class='sun'>$d</td>"; } else { echo "<td class='date'>$d</td>"; }
leoairen

2016/06/27 05:00 編集

テーブルスキーマで見ると「`holiday` date NOT NULL DEFAULT '0000-00-00' COMMENT」とありましたので、てっきりdate型と思っていましたが、 どうも自分の基礎の部分にまだ混乱しているところがあります。 ご丁寧にご回答いただき、ありがとうございます。 「date("Y-m-d", mktime(0, 0, 0, $m, $d, $y)」にしてみましたらできましたが、でも理屈がわかりません。 もしご存知でしたら教えて頂けたらありがたいです。
ttyp03

2016/06/27 05:02

array_search関数は配列の中に値があるかを調べる関数です。 date関数はタイムスタンプ値の書式化です。 この場合、mktime関数でタイムスタンプ化した値を使っています。 配列$holidayには、祝日の日付が文字列型(yyyy-mm-ddの形式)で格納されていました。 なのでdate関数で配列に入っている書式と合わせるようにしてみました。 -- 良く考えたら年月日が変数化されているので、date関数を使わずともsprintfでも良かったですね。 if(array_search(sprintf("%4d-%02d-%02d",$y,$m,$d), $holiday)){ こっちの方がわかりやすいかもしれません。お好みで。
leoairen

2016/06/27 05:16

ご丁寧に解説して頂き、ありがとうございます。 とてもわかりやすいです。 sprintfにすると固定値として取得できるということですね。 sprintfにしようと思います。 本当にありがとうございます!
guest

0

$sql = "SELECT calendartbl.holiday FROM calendartbl";
$ret = f_db_select($sql);
$ct = 0;
foreach ($ret as $h){
$holiday[$ct] = $h['holiday'];
$ct += 1;
}

で $holiday という配列に順に格納されます。

投稿2016/06/25 07:07

YK1037

総合スコア236

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

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

leoairen

2016/06/25 07:33

ご回答、ありがとうございます。追加で伺いたいのですが、$holidayに入った複数の日付がカレンダーにある日付と一致したときにある処理を実行したいのですが、その場合、下記のような書き方をどう修正すればよろしいでしょうか。 「if (date("Y-m-d", mktime(0, 0, 0, $m, $d, $y)) == $holiday){ 処理 }」
YK1037

2016/06/25 07:43

for($i=1: $i<count($holiday): $i++){ if (date("Y-m-d", mktime(0, 0, 0, $m, $d, $y)) == $holiday[$i]){ 処理 } } ですかね。
leoairen

2016/06/25 08:18 編集

ご回答、ありがとうございます。ほとんどできました。 指定した日にちに処理は反映できたのですが、別の問題が出てきたので、申し訳ないのですが下記のような場合はどのように修正すればよろしいでしょうか。 ちなみに処理というのは作ったテーブルタグで組んだカレンダーに色を反映させる処理です。 どうもforがwhileとぶつかってうまくいきませんでした。 今回の「if (date("Y-m-d", mktime(0, 0, 0, $m, $d, $y)) == $holiday[$i])」の部分はelse ifに収まらせないと組んだtableが崩れてしまいます。 たびたびすみませんが、ご教授願いたら幸いです。 while (checkdate($m, $d, $y)) { // 日曜:赤色 if(date("w", mktime(0, 0, 0, $m, $d, $y)) == 0){ echo "<td class='sun'>$d</td>"; } /* // 指定日:赤色(本来の場所) else if (date("Y-m-d", mktime(0, 0, 0, $m, $d, $y)) == $holiday){ echo "<td class='sun'>$d</td>"; } */ // 土日祝以外 else{ echo "<td class='date'>$d</td>"; } //ここに書くと崩れてしまいます for($i=1; $i<count($holiday); $i++){ if (date("Y-m-d", mktime(0, 0, 0, $m, $d, $y)) == $holiday[$i]){ echo "<td class='sun'>$d</td>"; } } // 週の始まりと終わりでタグを出力 if (date("w", mktime(0, 0, 0, $m, $d, $y)) == 6){ // 週を終了 echo "</tr>"; // 次の週がある場合は新たな行を準備 if (checkdate($m, $d + 1, $y)) { echo "<tr>"; } } $d++; }
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問