PDO()のサポート用クラス

提供:wiki - PCスキルの小技・忘却防止メモ
移動: 案内, 検索

PDO()のサポート用クラス。おそらくコレだけあればラクができるはず。

ソース

<?php
 /**
  * class_pdo_support.php
  * PDOオブジェクトのサポートクラス
  * 
  * 2012XXXX とりあえず作ってみた
  * 20131004 トランザクション関連や諸々追加・修正
  */
 class ClassPdoSupport {
 	// 接続先のDB情報
 	var $_host = ""; // DBのホスト
 	var $_dbnm = ""; // スキーマ名
 	var $_user = ""; // ログインID
 	var $_pass = ""; // ログインパスワード
 	
 	// DBの種類
 	var $_kind;
 	
 	// DBの文字コード
 	var $_char = "utf8";
 	
 	// PDO()のオブジェクト格納用
 	var $_pdo;
 	
 	// ==================================
 	/**
 	 * __construct()
 	 * @param ary $connects 接続先のDB情報
 	 */
  	function __construct( $connects = array() ) {
 		if( count($connects) > 0) {
 			if( isset($connects['host']) ) {
 				$this->changHostOnDb($connects['host']);
 			}
 			
 			if( isset($connects['dbnm']) ) {
 				$this->changDbNameOnDb($connects['dbnm']);
 			}
 			
 			if( isset($connects['user']) ){
 				$this->changUserOnDb($connects['user']);
 			}
 			
 			if( isset($connects['pass']) ){
 				$this->changePassOnDb($connects['pass']);
 			}
 		}
 		else {
 			echo "接続先のDB情報が不明";
 			exit;
 		}
 	}
 	
 	/**
 	 * __destruct()
 	 * @param ary $connects 接続先のDB情報
 	 */
 	function __destruct() {
 		$this->_pdo = NULL;
 	}
 	
 	// ==================================
 	/**
 	 * changHostOnDb() - DBの接続ホストの変更
 	 * @param str $host
 	 */
 	function changHostOnDb( $host ) {
 		$this->_host = $host;
 	}
 	
 	/**
 	 * changDbNameOnDb() - DBのDBネームの変更
 	 * @param str $name
 	 */
 	function changDbNameOnDb( $name ) {
 		$this->_dbnm = $name;
 	}
 	
 	/**
 	 * changUserOnDb() - DBの接続ユーザーIDの変更
 	 * @param str $user
 	 */
 	function changUserOnDb( $user ) {
 		$this->_user = $user;
 	}
 	
 	/**
 	 * changePassOnDb() - DBの接続パスワードの変更
 	 * @param str $pass
 	 */
 	function changePassOnDb( $pass ) {
 		$this->_pass = $pass;
 	}
 	
 	/**
 	 * changeCharOnDb() - DBの文字コードの変更
 	 * @param str $char
 	 */
 	function changeCharOnDb( $char ) {
 		$this->_char = $char;
 	}
 	
 	/**
 	 * DBに接続
 	 * connectDb() - PDOオブジェを作成し、DBに接続する
 	 * @param str $kind 接続先のDB(mysql, pgsql)
 	 */
 	function connectDb( $kind ) {
 		if ( $kind == "" ) {
 			echo "接続先のDB未入力(現状は「mysql」「pgsql」)";
 			exit;
 		}
 		else {
 			$this->_kind = $kind;
 		}
 		
 		$connect = "{$this->_kind}:host={$this->_host}; dbname={$this->_dbnm}";
 		
 		try {
 			// DBに接続:文字化け対策(utf8)
 			$codeChar = array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES {$this->_char}");
 			$this->_pdo = new PDO($connect, $this->_user, $this->_pass, $codeChar);
 			return true;
 		}
 		catch (PDOException $Exception) {
 			return $Exception->getMessage();
 			// ※mySqlの場合、パスワードが旧タイプだと接続不可:41バイトのハッシュ値にする必要あり
 		}
 	}
 	
 	// ==================================
 	/**
 	 * 空データの取得
 	 * HTML側で空データを用意するときにカラム名があるとうれしいときとか。
 	 */
 	function getNewData($tableName) {
 		$colDatas = $this->getColumnInfo($tableName);
 		
 		$newData = array();
 		foreach ($colDatas as $colData) {
 			$key = $colData["Field"];
 			if($colData["Default"] != "") {
 				$newData[$key] = $colData["Default"];
 			}
 			else {
 				$newData[$key] = "";
 			}
 		}
 		return $newData;
 	}
 	
 	// ==================================
 	/**
 	 * カラム情報の抜き出し
 	 */
 	function getColumnInfo($tableName) {
 		switch ( $this->_kind ){
 			case 'mysql':
 				$arys = $this->getColumnInfoMysql($tableName);
 				break;
 			case 'pgsql':
 				//$arys = $this->getColumnInfoPosgr($tableName);
 				break;
 			default:
 				echo "mysql, pgsql以外のカラムの型取得クエリの追加必要";
 				exit;
 		}
 		
 		return $arys;
 	}
 	
 	/**
 	 * mySQL版でのカラム情報の抜き出し
 	 * Enter description here ...
 	 * @param unknown_type $tableName
 	 */
 	private function getColumnInfoMysql($tableName) {
 		$query = "show columns from {$tableName};";
 		$stmt = $this->prepare($query);
 		try {
 			$result = $stmt->execute();
 			if($result == true) {
 				$resultAry = $stmt->fetchall(PDO::FETCH_ASSOC);
 			}
 			else {
 				$resultAry = false;
 			}
 		}
 		catch (PDOException $e) {
 			$resultAry = json_encode($e->getMessage());
 		}
 		
 		return $resultAry;
 	}
 	
 	///**
 	// * postgres版でのカラム情報の抜き出し
 	// * Enter description here ...
 	// * @param unknown_type $tableName
 	// */
 	//function getColumnInfoPosgr($tableName) {
 	//	// テーブルのOID(テーブル「pg_stat_all_tables」のカラム「relid」)からカラム情報を抽出
 	//	$q = "SELECT attname, typname
 	//	      FROM pg_class, pg_attribute, pg_type
 	//	      WHERE   relkind     ='r'
 	//	          AND relname     ='{$tableName}'
 	//	          AND attrelid    = (select relid from pg_stat_all_tables where relname = '{$tableName}')
 	//	          AND attnum      > 0
 	//	          AND pg_type.oid = atttypid
 	//	     ;";
 	//
 	//	$results = $this->executeQuery($q);
 	//
 	//	// キーと値に変換しておく
 	//	$arys = $this->convertColumnType($results, 'attname', 'typname');
 	//
 	//	return $arys;
 	//}
 	
 	// ==================================
 	/**
 	 * データ取得
 	 */
 	function getSelect($stmt) {
 		$result = array("status"=>false, "message"=>"", "data"=>false);
 		
 		try {
 			$pdoResult = $stmt->execute();
 			if($pdoResult == true) {
 				$pdoDatas = $stmt->fetchall(PDO::FETCH_ASSOC);
 				if ($pdoDatas == false) {
 					$result["status"] = true;
 					$result["message"] = "検索結果が0件";
 				}
 				else {
 					$result["status"] = true;
 					$result["data"] = $pdoDatas;
 				}
 			}
 			else {
 				throw new Exception("クエリの構文エラー等");
 			}
 		}
 		catch (Exception $e) {
 			$result["message"] = $e->getMessage();
 		}
 		catch (PDOException $e) {
 			$result["message"] = $e->getMessage();
 		}
 		
 		return $result;
 	}
 	
 	/**
 	 * 1件だけ取得
 	 */
 	function getSelectOne($stmt) {
 		$result = array("status"=>false, "message"=>"", "data"=>false);
 		
 		$tmp = $this->getSelect($stmt);
 		
 		if ( !$tmp["status"] ) {
 			$result["message"] = $tmp["message"];
 		}
 		else {
 			if ( is_array($tmp["data"]) && count($tmp["data"]) === 1 ) {
 				$result["status"] = true;
 				$result["data"] = $tmp["data"][0];
 			}
 			else if( is_array($tmp["data"]) && 1 < count($tmp["data"]) ) {
 				$result["message"] = "複数のデータあり";
 			}
 			else {
 				$result["message"] = $tmp["message"];
 			}
 		}
 		
 		return $result;
 	}
 	
 	// ==================================
 	/**
 	 * SQLの実行エラーを表示させる
 	 * ※デフォルトでは表示されずにerrorInfo()を使ってみるらしい。
 	 */
 	function viewException() {
 		return $this->_pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
 	}
 
 	/**
 	 * SQL文の実行準備を行う
 	 * pdo->prepare()と同じ
 	 */
 	function prepare( $query ) {
 		return $this->_pdo->prepare($query);
 	}
 	
 	/**
 	 * 最後に挿入された行の IDを返す。
 	 * pdo->lastInsertId()と同じ
 	 */
 	function lastInsertId($name=NULL) {
 		if ($this->_pdo == null) {
 			return null;
 		}
 		return $this->_pdo->lastInsertId($name);
 	}
 	
 	/**
 	 * トランザクションの開始
 	 * pdo->beginTransaction()と同じ
 	 */
 	function beginTransaction() {
 		if ($this->_pdo == null) {
 			return null;
 		}
 		return $this->_pdo->beginTransaction();
 	}
 	
 	/**
 	 * トランザクションの終了
 	 * pdo->commit()と同じ
 	 */
 	function commit() {
 		if ($this->_pdo == null) {
 			return null;
 		}
 		return $this->_pdo->commit();
 	}
 	
 	/**
 	 * ロールバック
 	 * pdo->rollBack()と同じ
 	 */
 	function rollBack() {
 		if ($this->_pdo == null) {
 			return null;
 		}
 		return $this->_pdo->rollBack();
 	}
 }
 ?>
  • postgresのカラム情報の抜き出しは、最近使っていないからよくわからない。コメントアウトするだけでイケたような気がする。
  • トランザクションを使うときのテーブルはMyISAMだとダメ。トランザクション自体ができないから。

使い方

$connects = array('host'=>"HostOrIpAddr", 'dbnm'=>"Schema", 'user'=>"UserName", 'pass'=>"Password");
$pdo = new PdoSupport($connects);
if ($pdo == null) {
	return '接続情報がありません';
}

if (!($errMes = $pdo->connectDb("mysql"))) {
	// 接続失敗
	return $errMes;
}

// クエリ
$query = "select ○○○○○";

$stmt = $pdo->prepare($query);
//$stmt->bindValue(":XXX", XXX, PDO::PARAM_STR); // 必要に応じてBind

$result = $pdo->getSelect($stmt);
if (!$result["status"]) {
	echo $result["message"];
}
else {
	var_dump($result["data"]);
}

//try {
//	$pdoResult = $stmt->execute();
//	if($pdoResult == true) {
//		$pdoDatas = $stmt->fetchall(PDO::FETCH_ASSOC);
//		if ($pdoDatas == false) {
//			return "検索結果が0件";
//		}
//		else {
//			// 結果あり。
//			return $pdoDatas;
//		}
//	}
//	else {
//		return "クエリの構文エラー等";
//	}
//}
//catch (PDOException $e) {
//	// 予期しないエラー
//	return $e;
//}

関連項目