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

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

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

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

2回答

2459閲覧

PHPのカプセル化

yutaishikawa_

総合スコア58

PHP

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

1クリップ

投稿2015/07/21 00:23

編集2015/07/28 00:46

こんにちは。
いよいよクラス化の技術を学び始めました。
今回、前回まで書いてきたコードをカプセル化し、すべての処理を1ファイルずつにまとめました。
ですが、なかなかキレイにまとまってはくれず、さっそく不具合が発生。
mysqliをメッソド化?できずに、$queryや$taskをvar_dumpしてみても実行結果が0であったり、NULLで返ってくるようになりました。
これは、正しく接続できているのか・・・と見直したところ、参考にしている文献を見る限りイマイチピンとくることがありませんでした。
こうすればいいよ、というアドバイスがあれば是非お願いいたします。
よろしくお願いいたします。
index

PHP

1<?php 2require_once('calender.php'); 3$cal = new Calender(); 4$cal->setTimeStamp(); 5$cal->Create(); 6$cal->query(); 7?> 8<!DOCTYPE html> 9<html> 10<title>カレンダー</title> 11<meta charset="utf-8"> 12<table border="1"> 13 <tr> 14 <th><a href="?ym=<?php echo $cal->h($cal->prev()); ?>">&laquo;</a></th> 15 <th colspan="5"><?php echo $cal->h($cal->yearManth()); ?></th> 16 <th><a href="?ym=<?php echo $cal->h($cal->next()); ?>">&raquo;</a></th> 17 </tr> 18 <thead> 19 <tr> 20 <th></th> 21 <th></th> 22 <th></th> 23 <th></th> 24 <th></th> 25 <th></th> 26 <th></th> 27 </tr> 28 </thead> 29 <tbody> 30 <?php 31 foreach ($cal->getWeeks() as $week) { 32 echo $week; 33 } 34 ?> 35 </tbody> 36</table> 37<form action="edit_do.php" method="POST"> 38<p>タイトル : <input type="text" name="title" size="20"></p> 39<p>日時 : <input type="date" name="task_date" min="2015-07-01"></p> 40<p>場所 : <input type="text" name="place" size="20"></p> 41<p>メモ : <textarea type="text" name="memo" rows="4" cols="40"></textarea></p> 42<input type="submit" value="追加する"><input type="reset" value="リセット"> 43</form> 44</html>

class

PHP

1<?php 2// dbconnect.php 3class dbconnect { 4 //mysqli の インスタンス化 、接続 5 public function ConnectDb() { 6 $this->mysqli = new mysqli('localhost', '........', '/////////', '--------'); 7 if ($this->mysqli->connect_error){ 8 die('Connect Error (' . $this->mysqli->connect_errno . ') '. $this->mysqli->connect_error); 9 exit; 10 } 11 } 12} 13class Calender extends dbconnect { 14 protected $weeks = array(); 15 protected $timeStamp; 16 // mysqli の メソッド 17 public function __construct(){ 18 $dbconnect = new dbconnect(); 19 if ($this->timeStamp === false) { 20 $this->timeStamp = time(); 21 } 22 // DB接続 23 parent::ConnectDb(); 24 } 25 // 現在の日時取得 (Y-m) 26 public function setTimeStamp(){ 27 $ym = isset($_GET['ym']) ? $_GET['ym'] : date("Y-m"); 28 $this->timeStamp = strtotime($ym . "-01"); 29 if ($this->timeStamp === false){ 30 $this->timeStamp = time(); 31 } 32 } 33 // 現在の日時取得 (Y-m-d) 34 public function setTimeStamp_day(){ 35 $ymd = isset($_GET['ymd']) ? $_GET['ymd'] : date("Y-m-d"); 36 $this->timeStamp = strtotime($ymd); 37 if ($this->timeStamp === false){ 38 $this->timeStamp = time(); 39 } 40 } 41 public function query() { 42 // SQLで今月を取得する処理。先月の最終日と翌月の初日を不等号で期間を指定し、ANDで結ぶ。 43 $lastMonth = date("Y-m-d",strtotime("last day of - 1 month",$this->timeStamp)); 44 $nextMonth = date("Y-m-d",strtotime("first day of + 1 month",$this->timeStamp)); 45 // PHP->MySQLtable 46 $query = $this->mysqli->query("SELECT * FROM tasks WHERE task_date >'$lastMonth' AND task_date <'$nextMonth'"); 47 $task = ""; 48 // 連想配列で$rowを取得する 49 while($row = $query->fetch_assoc()) { 50 // 各メンバ取得 51 $id = $row['id']; 52 $title = $row['title']; 53 $task_date = $row['task_date']; 54 $place = $row['place']; 55 $memo = $row['memo']; 56 $task .= "<tr><td>${title}</td><td>${task_date}</td><td>${place}</td><td>${memo}</td></tr>"; 57 } 58 } 59 public function Create(){ 60 // 配列 61 $taskData = array(); 62 $lastday = date("t",$this->timeStamp); 63 // 1日の曜日番号の数だけ空白を出力(7月だと3つ) 64 $youbi = date("w",mktime(0,0,0,date("m",$this->timeStamp),1,date("Y",$this->timeStamp))); 65 // $weekを初期化 66 $week = ""; 67 // 結合代入演算子を使用して、<td>を取得。一週間(0~6の<td>)が完成。 68 $week .= str_repeat('<td></td>', $youbi); 69 // 上記の定義で1日から31日までfor文で取得 70 for ($day = 1; $day <= $lastday; $day++ ,$youbi++) { 71 // もし$userData[日付]の変数が 空の場合 72 if (isset($userData[$day])) { 73 // リンクをはる 74 $week .= '<td><a href="taskListDay.php">'.$day.'</a></td>'; 75 }else{ 76 // リンクをはらない 77 $week .= '<td class="youbi_'.($youbi % 7).'">'.$day.'</td>'; 78 } 79 // $youbiを7で割った余り=6。(土曜日) 80 if ($youbi % 7 == 6 OR $day == $lastday) { 81 // もし 1 = $lastdayだったとき、<tb>に$youbiを7で割ったものを6で引く 82 if($day == $lastday) { 83 $week .= str_repeat('<td></td>', 6 - ($youbi % 7)); 84 } 85 // 結果、<tr>は$week 86 $this->weeks[]='<tr>' .$week .'</tr>'; 87 // $weekを初期化する 88 $week = ''; 89 } 90 // week""を初期化し続ける処理によってカレンダー型を形成。 91 } 92 } 93 // html記述用 94 public function h($s){ 95 return htmlspecialchars($s, ENT_QUOTES, 'UTF-8'); 96 } 97 // リストを取得 98 public function mysqli_result() { 99 return $this->mysqli; 100 } 101 // タスクを取得 102 public function getTasks() { 103 $sql = "SELECT * FROM tasks"; 104 if ($ymd) { 105 $ymd = mysql_real_escape_string($ymd); 106 $sql.= " WHERE FROM_UNIXTIME(task_date, '%Y-%m-%d') = '$ymd' "; 107 } 108 $query = $this->mysqli->query($sql); 109 } 110 // 一週を取得 111 public function getWeeks() { 112 return $this->weeks; 113 } 114 // 前月を取得 115 public function prev() { 116 return date("Y-m", mktime(0, 0, 0, date("m", $this->timeStamp)-1, 1, date("Y", $this->timeStamp))); 117 } 118 // 翌月を取得 119 public function next() { 120 return date("Y-m", mktime(0, 0, 0, date("m", $this->timeStamp)+1, 1, date("Y", $this->timeStamp))); 121 } 122 // 現在の日時を取得 (Y-m) 123 public function yearManth() { 124 return date("Y-m" ,$this->timeStamp); 125 } 126} 127?>

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

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

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

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

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

ikuwow

2015/07/27 09:56

良い回答もついていますし、質問を見た方の勉強になるかと思いますので、隠したりせず元の質問に直していただけないでしょうか?
guest

回答2

0

ベストアンサー

dbconnectクラスとCalenderクラスは役目が違うし、コネクションから直接SQLを発行しており
継承する必要性もないので分離しましょう。

PHP

1// dbconnect.php 2class DbConnect 3{ 4 //mysqli の インスタンス化 、接続 5 public static function connect() 6 { 7 $connection = new mysqli('localhost', 'tontonmy', 'tontontones', 'st_ishikawa'); 8 if ($this->mysqli->connect_error) { 9 die('Connect Error (' . $this->mysqli->connect_errno . ') '. $this->mysqli->connect_error); 10 exit; 11 } 12 13 return $connection; 14 } 15}

PHP

1require_once('dbconnect.php'); 2class Calender 3{ 4 protected $mysqli = null; 5 protected $weeks = array(); 6 protected $timeStamp; 7 // mysqli の メソッド 8 public function __construct() 9 { 10 // この行は削除。継承している場合、インスタンス化する必要はない。 11 //$dbconnect = new dbconnect(); 12 13 if ($this->timeStamp === false) { 14 $this->timeStamp = time(); 15 } 16 17 // DB接続(静的メソッドなのでインスタンス化することなくメソッドをコールします。 18 $this->mysqli = DbConnect::connect(); 19 } 20 // 他のメソッドはそのままで。 21 } 22

あと使わないメソッドは混乱のもとになるので削除しておくことをオススメします。

投稿2015/07/21 01:43

icham

総合スコア559

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

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

0

カプセル化する内容を履き違えてました。
解決いたしました。

投稿2015/07/21 01:29

yutaishikawa_

総合スコア58

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

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

ozwk

2015/07/22 14:10

質問内容を隠した所で編集履歴から辿れるんですけどね
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問