if文の基礎的な使用方法について

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 739

yutaishikawa_

score 52

初めまして。
PHP初心者です。
今回、某企業より課題が出されため、PHP+MySQLを用いて、タスク機能付きのカレンダー(縛りあり)を作成しています。
縛りは、
・クラス化しない。
というものがあります。

しかし、現段階の知識では中々うまくいきません。
PHPからMySQLにINSERTすることは可能(他ファイル"edit_do.php"を使用)なのですが、SELECT文の記述の仕方にイマイぴんときていません。

内容的なもので言えば、$userDataの添字を日付にして、データベースの日付を設定しているカラムの['task_date'](typeはdate)を取得したいと考えています。
どういったif文を記述すればいいのか。あと少しのところまできていると思うのですが、アドバイスをいただければ嬉しいです。

それと、自分なりに勉強しているのですが、他にコメントアウトしている部分で、認識間違いしている部分があればご指摘お願い致します。

何卒宜しくお願いします。



現段階の表示は画像1のような表示となっております。(日にちにリンクができていない。)
イメージ説明
ちなみに、理想は画像2の様に、INSERTしてタスクを追加した日付が表示できるようになること。(データベースからタスクを取得してリンクできている)
イメージ説明
<?php
require_once('dbconnect.php');
// 変数の判別、パラメータを出力。
// 三項演算子 条件式 ? 式1: 式2;
$ym = isset($_GET['ym']) ? $_GET['ym'] : date("Y-m");
// 現在の日時取得
$timeStamp = strtotime($ym ,"-01");
// 比較演算子、(Y-m)を取得できないFALSEだった場合、TIME関数time()
    if ($timeStamp === false) {
        $timeStamp = time();
    }
// 翌月、前月を取得
$next = date("Y-m",mktime(0,0,0,date("m",$timeStamp)-1,1,date("Y",$timeStamp)));
$prev = date("Y-m",mktime(0,0,0,date("m",$timeStamp)+1,1,date("Y",$timeStamp)));

// 最終日の取得(月末を取得)
$lastday = date("t",$timeStamp);
// 1日の曜日番号の数だけ空白を出力(7月だと3つ)
$youbi = date("w",mktime(0,0,0,date("m",$timeStamp),1,date("Y",$timeStamp)));
// $weekを初期化
$week = "";
// 結合代入演算子を使用して、<td>を取得。一週間(0~6の<td>)が完成。
$week .= str_repeat('<td></td>', $youbi);
// PHP->MySQLtable
$query = $mysqli->query("SELECT * FROM tasks");
// 配列を準備
$userData = array();
// 連想配列で$rowを取得する
while($row = $query->fetch_assoc()) {
    $userData[date('j',strtotime($row['task_date']))] = array(
    'id' => $row['id'],
    'title' => $row['title'],
    'task_date' => $row['task_date'],
    'place' => $row['place'],
    'memo' => $row['memo']
    );
}
// 上記の定義で1日から31日までfor文で取得
for ($day = 1; $day <= $lastday; $day++ ,$youbi++) {
    if($userData[date('j',strtotime($row['task_date']))]) {
    /////ここに何を記述すればいいか検討がつきません/////
    }
    // もし$userData[日付]の変数が空の場合
        if (isset($userData)) {
            // 結合代入演算子で$dayを代入する
            $week .= '<td class="youbi_'.($youbi % 7).'">'.$day.'</td>';
        }else{
            $week .= '<td><a href="detail.php">'.$day.'</a></td>';
        }
    // $youbiを7で割ったあまりが6。(土曜日)
    if ($youbi % 7  == 6 OR $day == $lastday) {
        // もし 1 = $lastdayだったとき、<tb>に$youbiを7で割ったものを6で引く
        if($day == $lastday) {
            $week .= str_repeat('<td></td>', 6 - ($youbi % 7));
        }    
        // 結果、<tr>は$week
        $weeks[]='<tr>' .$week .'</tr>';
        // $weekを初期化する
        $week = '';
        }
    // week""を初期化し続ける処理によってカレンダー型を形成。
    }
?>
<!DOCTYPE html>
<html>
<title>カレンダー</title>
<h1><?php echo date("Y",$timeStamp).'年'; ?></h1>
<h2><?php echo date("m",$timeStamp).'月のカレンダー'; ?></h2>
<meta charset="utf-8">
<table border="1">
    <tr>
        <th><a href="?ym=<?php echo $next;?>">&laquo;</a></th>
        <th><a href="?ym=<?php echo $prev;?>">&raquo;</a></th>
    </tr>
    <thead>
    <tr>
        <th>日</th>
        <th>月</th>
        <th>火</th>
        <th>水</th>
        <th>木</th>
        <th>金</th>
        <th>土</th>
    </tr>
    </thead>
    <tbody>
    <?php
        foreach ($weeks as $week) {
            echo $week;
        }
    ?>
    </tbody>
</table>
<form action="edit_do.php" method="POST">
<p>
    タイトル : <input type="text" name="title" size="20">
</p>
<p>
    日時 : <input type="date" name="task_date" min="2015-07-01">
</p>
<p>
    場所 : <input type="text" name="place" size="20">
</p>
<p>
    メモ : <textarea type="text" name="memo" rows="4" cols="40"></textarea>
</p>
<input type="submit" value="追加する"><input type="reset" value="リセット">
</form>
</html>
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

+2

日付にリンクを貼るかどうかのif文のところは

if (isset($userData[$day]) ) {
    リンクを貼る
} else {
    リンクを貼らない
}

でいいかと思います。


SQLは今月のタスクだけ取ってくる必要があるので
WHERE task_date > '先月の最終日' AND task_date < '翌月の1日'
を付け足せばいいと思います。もちろん「先月の最終日」「翌月の1日」の部分の文字列を作る必要もありますが。また取得するカラムはすべてではなく必要最低限なものにした方がいいです。(その方が早いので)

あと同じ日付にタスクが2つ以上入ることがあるなら、
$userData[date('j',strtotime($row['task_date']))] = array(
の部分で同じ日付にタスクが2つ以上あるとき、$userDataには片方の日付のものしか入りません。
リンクを貼るかどうかの判定だけなら問題ありませんが、そうでなければ修正が必要です。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2015/07/09 13:59

    ご回答ありがとうございます。
    的確なアドバイスをいただき、無事作成することができました。

    タスクが2つ以上の際の処理も視野に入れつつ作業に臨みます。
    この度は本当に有難うございました。

    キャンセル

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

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

同じタグがついた質問を見る