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

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

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

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

Q&A

3回答

3299閲覧

ショッピングサイトをつくっていて、クラスを別に分けたいのですが、分け方がわかりません。

KazumuneKori

総合スコア7

PHP

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

0グッド

1クリップ

投稿2016/05/08 01:46

データベースに接続するコネクトの部分を別クラスに分けたいのですが、方法につまっています。
分けたクラスには別の名前をつけて、読み込みもしたいです。

分かる方おしえてください。

class PDODatabase{

private $dbh = NULL; private $db_host = ""; private $db_user = ""; private $db_pass = ""; private $db_name = ""; private $db_type = ""; private $order = ''; private $limit = ''; private $offset = ''; private $groupby = ''; public function __construct( $db_host, $db_user, $db_pass, $db_name, $db_type ) { $this->dbh = $this->connectDB( $db_host, $db_user, $db_pass, $db_name, $db_type ); $this->db_host = $db_host; $this->db_user = $db_user; $this->db_pass = $db_pass; $this->db_name = $db_name; //SQL関連 $this->order = ''; $this->limit = ''; $this->offset = ''; $this->groupby = ''; } private function connectDB( $db_host, $db_user, $db_pass, $db_name, $db_type) { try{ switch( $db_type) { case'mysql': $dsn = 'mysql:host='.$db_host.';dbname='.$db_name; $dbh = new PDO($dsn,$db_user,$db_pass); $dbh->query('SET NAMES utf8'); break; case'pgsql'; $dsn = 'pgsql:dbname='.$db_name.'host='.$db_host.'port=5432'; $dbh = new PDO($dsn,$db_user,$db_pass); break; } } catch(PDOException $e) { var_dump($e->getMessage()); exit; } return $dbh; }

★★ここから上を別のクラスに分けたい★★

//thisの部分を新しい変数名に変える

public function setQuery( $query='', $arrVal = array() ) { $stmt = $this->dbh->prepare($query); //変えた $stmt->execute($arrVal); } public function select( $table, $column ='',$where = '', $arrVal = array()) { $sql = $this->getSql( 'select', $table, $where, $column); $stmt = $this->dbh->prepare($sql); //変えた $stmt->execute($arrVal); //データを連想配列に格納 $data = array(); while($result = $stmt->fetch(PDO::FETCH_ASSOC)) { array_push($data , $result); } return $data; } public function count( $table, $where='', $arrVal=array()) { $sql = $this->getSql('count',$table, $where ); $stmt = $this->dbh->prepare($sql); //変えた $stmt->execute($arrVal); $result = $stmt->fetch(PDO::FETCH_ASSOC); return intval($result['NUM']); } public function setOrder( $order ='' ) { if( $strOrder !== '' ) $this->order = ' OREDER BY ' . $strOrder; } public function setLimitOff( $limit ='', $offset ='' ) { if( $limit !== "" ) $this->limit = " LIMIT " . $limit ; if( $offset !== "" ) $this->offset = " OFFSET ". $offset ; } public function setGroupBy( $groupby ) { if( $groupby !== "" ) $this->groupby = ' GROUP BY ' . $groupby; } private function getSql( $type,$table,$where='',$column='') { switch( $type ) { case 'select': $columnKey =( $column !=='') ? $column : "*" ; break; case 'count': $columnKey = 'COUNT(*) AS NUM '; break; default: break; } $whereSQL = ( $where !== '' )?' WHERE ' . $where :''; $other = $this->groupby . " " . $this->order ." " . $this->limit . " " . $this->offset; //sql文の作成 $sql = " SELECT " . $columnKey . " FROM " . $table . $whereSQL . $other; return $sql; } public function insert($table, $insData=array() ) { list( $preSt, $insDataVal, $columns) = $this->getPreparedStatement( 'insert', $insData, $table ); $sql = " INSERT INTO " . $table . " (" . $columns . ") VALUES (" . $preSt . ") " ; $stmt = $this->dbh->prepare( $sql ); //変えた $res = $stmt->execute($insDataVal); return $res; } public function update($table ,$insData = array() ,$where, $arrWhereVal=array()) { list( $preSt, $insDataVal) = $this->getPreparedStatement( 'update', $insData, $table ); //sql文の作成 $sql = " UPDATE " . $table . " SET " . $preSt . " WHERE " . $where ; $updateData = array_merge($insDataVal,$arrWhereVal); $stmt = $Data->dbh->prepare( $sql ); $res = $stmt->execute($updateData); return $res ; } public function getPreparedStatement( $mode, $insData, $table ) { if( !empty($insData) ) { $insDataKey = array_keys($insData); $insDataVal = array_values($insData); $preCnt = count( $insDataKey ); switch( $mode ) { case 'insert': $columns = implode(",",$insDataKey); $arrPreSt = array_fill( 0, $preCnt,'?'); $preSt = implode(",",$arrPreSt); return array($preSt, $insDataVal, $columns); break; case 'update': for( $i=0;$i < $preCnt; $i++ ) { $arrPreSt[$i] = $insDataKey[$i] ." =? "; } $preSt =implode(",",$arrPreSt); return array($preSt, $insDataVal); break; } } else { return false; } } public function getLastId() { return $this->dbh->lastInsertId(); }

}

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

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

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

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

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

Z-TALBO

2016/05/08 01:53

コードブロックで囲まれたほうが良いですよ。
guest

回答3

0

用途に応じてDBを切り替える必要がある、という事でよろしいでしょうか。
個人的には接続情報等をパラメータとして渡すのは
コードの可読性やメンテナンス性を下げる要因と成りうるので利用しません。
子クラスから取得とか、クラス名にルールを設けて判断とかします。

PHP

1親クラス 2interface IDataObject 3{ 4 public function execute(); 5}

PHP

1親クラス 2abstract class BaseDatabase implements IDataObject 3{ 4 public function __construct() 5 { 6 $this->_db = NULL; 7 } 8 public function execute() 9 { 10 try 11 { 12 $this->connect(); 13 $this->executeImp(); 14 } 15 catch (Exception $e) 16 { 17 throw $e; 18 } 19 finally 20 { 21 $this->disconnect(); 22 } 23 } 24 private $_db; 25 protected function getResult() 26 { 27 return $this->_db->query的なメソッド($this->getSql()); 28 } 29 protected function escape($value) 30 { 31 return $this->_db->escape的なメソッド($value); 32 } 33 private function connect() 34 { 35 $this->_db = new DB的なメソッド($this->getDsn()); 36 } 37 private function disconnect() 38 { 39 } 40 abstract protected function getDsn(); 41 abstract protected function executeImp(); 42 abstract protected function getSql(); 43}

PHP

1このクラスをDB別に作り、子クラスは自分が利用するDBに応じて継承先を変える。 2複数DBから持ってくる場合は違う設計にします! 3 4クラス名にルールを設けて親クラスでget_called_class等でクラス名からDBを分ける方法もありかと。 5私はよくこちらを利用します。 6 7abstract class AppDatabaseMySql extends BaseDatabase 8{ 9 public function __construct() 10 { 11 parent::__construct(); 12 } 13 protected function getDsn() 14 { 15 $dsn = 'dsndesuyo'; 16 return $dsn; 17 } 18}

PHP

1子クラス 2MySQLを意識するのはイヤだなぁ 3final class HogeHoge extends AppDatabaseMySql 4{ 5 public function __construct(DBレコード格納用のリストクラス $hogeList) 6 { 7 parent::__construct(); 8 $this->_hogeList = $hogeList; 9 } 10 private $_hogeList; 11 protected function executeImp() 12 { 13 while ($result = $this->getResult()) 14 { 15 レコードセットから展開 16 $hoge = new Hoge(); 17 $hoge->loadFromResultSet($result); 18 $this->_hogeList->add($hoge); 19 } 20 } 21 protected function getSql() 22 { 23 $sql = 'SELECT * FROM HOGE'; 24 return $sql; 25 } 26}

とすると、機能別に応じた子クラスだけ作ればDB接続を考えなくても良いかな~とか。

投稿2016/05/08 05:05

LILI.IRON.FIST

総合スコア151

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

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

0

クラスを2つに分けた時の呼び出し側の記述方法をイメージしてみてください。
↓現状はこんな実装イメージかと思います。
$db = new PDODatabase( $db_host, $db_user, $db_pass, $db_name, $db_type ) ;
$db->setQuery("select * from table ") ;

これをどういう風な表現に変えたいのでしょう?

変えたくないのであれば、
「★★ここから上を別のクラスに分けたい★★」から上を親クラス
そこから下を子クラスとして分けたら良いと思います。
ちなみに、親クラスのメンバ変数で子クラスで使用したいものはprivateではなくprotectedに替える必要があります。

接続情報を明示的に記述したいのであれば、
$dbh = new ConnectDB( $db_host, $db_user, $db_pass, $db_name, $db_type ) ;
$db = new PDODatabase( $dbh ) ;
$db->setQuery("select * from table ") ;

みたいな書き方をできるように、クラスを分割修正したら良いと思います。

投稿2016/05/08 22:36

TetsujiMiwa

総合スコア1124

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

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

0

あくまで例なので、使いやすいように修正してください。

PHP

1class PDOconnnect { 2 private $dbh = NULL; 3 4 public function __construct( $db_host, $db_user, $db_pass, $db_name, $db_type ) 5 { 6 $this->dbh = $this->connectDB( $db_host, $db_user, $db_pass, $db_name, $db_type ); 7 } 8 9 public function getHandle() 10 { 11 return $this->dbh; 12 } 13 14 private function connectDB( $db_host, $db_user, $db_pass, $db_name, $db_type) 15 { 16 try{ 17 switch( $db_type) 18 { 19 case'mysql': 20 $dsn = 'mysql:host='.$db_host.';dbname='.$db_name; 21 $dbh = new PDO($dsn,$db_user,$db_pass); 22 $dbh->query('SET NAMES utf8'); 23 break; 24 25 case'pgsql'; 26 $dsn = 'pgsql:dbname='.$db_name.'host='.$db_host.'port=5432'; 27 $dbh = new PDO($dsn,$db_user,$db_pass); 28 break; 29 } 30 } 31 catch(PDOException $e) 32 { 33 var_dump($e->getMessage()); 34 exit; 35 36 } 37 return $dbh; 38 } 39} 40 41class PDODatabase { 42 private $dbh = NULL; 43 private $order = ''; 44 private $limit = ''; 45 private $offset = ''; 46 private $groupby = ''; 47 48 public function __construct( $dbh) 49 { 50 $this->dbh = $dbh; 51 } 52 53 public function setQuery( $query='', $arrVal = array() ) 54 { 55 $stmt = $this->dbh->prepare($query); 56 $stmt->execute($arrVal); 57 } 58//以下略 59 60//使い方 61$obj1 = new PDOconnnect($db_host, $db_user, $db_pass, $db_name, $db_type); 62$obj2 = new PDODatabase($obj1->getHandle());

投稿2016/05/08 02:22

takasima20

総合スコア7458

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問