Sqlインジェクションに対応!データベース接続クラス

<?php
/*
データベース管理クラス
*/
class DBManager{

private static $ini_array = NULL;
private static $instance = NULL;
private static $con = NULL;
private static $result_cnt = NULL;
private static $result_data = NULL;

/*
コンストラクタ
*/
function __construct(){
self::get_ini();
self::_connect();
}

/*
デストラクタ
*/
function __destruct(){
self::$con = null;
}

/*
単一のインスタンスを返す
*/
public static function __instance(){
if ( is_null( self::$instance ) ) {
self::$instance = new self;
}
return self::$instance;
}

/*
db接続設定ファイルの読み込み
*/
private function get_ini(){
$ini=Setting::get_ini_file( "/*db接続情報を記載したiniファイル*/" , true ); /*自作クラス関数のため、コピーしただけでは、使えません。*/
if( $_SERVER["SERVER_NAME"] == "localhost" ){
$work = 'development';
}else{
$work = 'production';
}
return self::$ini_array = $ini[$work];
}

/*
dbへの接続
@return object $con
*/
private function _connect(){
$ini_array=self::$ini_array;
$options = array(
PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES '.$ini_array['charset'],
PDO::ATTR_PERSISTENT => true,
);
$link = $ini_array['sql'].':host='.$ini_array['host'].';dbname='.$ini_array['dbname'];
$user = $ini_array['user'];
$password = $ini_array['password'];
try{
$con = new PDO( $link, $user, $password, $options );
if ($con == null){
throw new PDOException( 'CONNECT LOOSE' );
}
}catch ( PDOException $e ){
print( 'Error:'.$e->getMessage() );
die();
}
return self::$con = $con;
}

/*
トランザクション
*/
public function Transaction_start(){
self::$con->beginTransaction();
}

/*
コミット
*/
public function Commit(){
self::$con->commit();
}

/*
ロールバック
*/
public function Rollback(){
self::$con->rollBack();
}

/*
insert処理
@param string $sql sql
@param array $array 挿入配列(連想配列不可)
@return boolean
sql = "inset into table_name (colunm1,colunm2) values(?,?)";
*/
public function insert( $sql , $array ){
$this->dbmethod( $sql , $array );
}

/*
update処理
@param string $sql sql
@param array $array 挿入配列(連想配列不可)
array("colunm1_val","colunm2_val","colunm_val")
@return boolean
sql = "update table_name
set colunm1 = ? , colunm2 = ?
where colunm = ?";
*/
public function update( $sql , $array ){
$this->dbmethod( $sql , $array );
}

/*
select処理
@param string $sql sql
sql ="select * from table_name where colunm =?";
result_array = $db->select($sql,array(colunm_val));
@param string $array array
array("colunm_val")
@return array $data
*/
public function select( $sql ,$array=array() ){
$this->dbmethod( $sql , $array );
$array = array();
while( $date = self::$result_data->fetch( PDO::FETCH_ASSOC ) ){
$array[] = $date;//フィールドごと
//予備
// foreach ($date as $key=>$value){
// $array[$key][]=$value;//カラムごと
// }
}
$con = null;
return $array;
}


/*
実行用関数
@param string $sql sql
@param array $array 挿入配列(連想配列不可)
@return boolean
*/
private function dbmethod($sql ,$array){
$con = self::$con;
$stm = $con->prepare( $sql );
for( $i = 0; $i < count( $array ); $i++ ){
$stm->bindParam( $i+1 , $array[$i] , PDO::PARAM_STR );
}
self::$result_data = $stm;
$flag = $stm->execute();
$count = $stm->rowCount();
if( ! $flag ){
$result=false;
}else{
self::$result_cnt = $count;
$result = true;
}
$con = null;
return $result;
}

/*
件数取得(更新、挿入)
@return int $result_cnt 更新、挿入 件数
*/
public function get_result_cnt(){
return self::$result_cnt;
}

}

シェアする

  • このエントリーをはてなブックマークに追加

フォローする