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

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

ただいまの
回答率

90.11%

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

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,317

leoairen

score 72

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

下記のコードでは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){
    処理
}

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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

0

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/06/27 13:54 編集

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

    キャンセル

  • 2016/06/27 14:02

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

    キャンセル

  • 2016/06/27 14:16

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

    キャンセル

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 16:33

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

    キャンセル

  • 2016/06/25 16:43

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

    キャンセル

  • 2016/06/25 17:16 編集

    ご回答、ありがとうございます。ほとんどできました。
    指定した日にちに処理は反映できたのですが、別の問題が出てきたので、申し訳ないのですが下記のような場合はどのように修正すればよろしいでしょうか。
    ちなみに処理というのは作ったテーブルタグで組んだカレンダーに色を反映させる処理です。
    どうも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++;
    }

    キャンセル

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

  • ただいまの回答率 90.11%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる