PHPでMYSQLに接続してSQL発行するクラス

テスト環境でDBの中身をちょっと見たりしたい

もっといい方法あるんだろうなと思いながら書きました。
毎回毎回何もおぼえてないからサーバーに接続しにいってテスト環境に雑なクラス作っていたのでその手間を省きたかった。
いいかげんcakephpおぼえたいですね…なんでまだおぼえてないの

2018-03-29 複数重複検査メソッドを追加、修正した
2018-04-06 複数重複検査メソッドにwhere deleted = 0を消せるアプション追加した

<?php

//DBクラス
class db_manager {
	private $dbh;
	private $table;
	public function __construct() {
		// サーバー設定
		$login_id = 'db_user';
		$pass = 'vagrant';
		$dbname = 'test';
		$host = 'localhost';
		$this->dbh = new PDO('mysql:dbname='.$dbname.';host='.$host.';charset=utf8', $login_id, $pass, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
		$this->table = $dbname.'.table_name';
	}

	//挿入
	public function insert($val1,$val2){
		try{
			$dbh = $this->dbh;
			$db_data = $dbh->prepare("
INSERT INTO	{$this->table} (val1,val2)
VALUES	(?,?)
");
			$db_data->execute(array(
				$val1,$val2));
			return true;
		}catch (Exception $e){
			return $e;
		}
	}

	//主キーを指定して重複チェック
	public function is_duplication( $column, $val, $table ,$is_remove_where_deleted_0 = false) {
		try {
			$deleted =' AND deleted = 0';
			if($is_remove_where_deleted_0){
				$deleted = '';
			}

			$dbh     = $this->dbh;
			$db_data = $dbh->prepare( "select * FROM {$table} WHERE {$column} = ? {$deleted}" );
			$db_data->execute( array( $val ) );
			if ( ! empty( $db_data->rowCount() ) ) {
				return true;
			} else {
				return false;
			}
		} catch ( Exception $e ) {
			$res                       = new stdClass();
			$res->result               = false;
			$res->date                 = date( 'Y/m/d H:i' );
			$res->path                 = __DIR__ . __FILE__ . ':' . __LINE__;
			$res->result_err_messeagel = $e;
			error_log( var_export( $res, true ), 3, "/var/tmp/error.log" );

			return 'error';
		}
	}

	//配列で見る重複チェック、全て一致してたらtrue
	//$columns = array('val1_col','val2_col');
	//$values = array($val1,$val2);
	public function is_duplications( $columns, $values, $table ) {
		try {
			if(count($columns) == 1 || count($columns) != count($values)){
				return '配列不足エラー:';
			}

			$columns = implode ( ' = ? AND ' , $columns );
			if(empty($columns) || empty($values)){
				return '配列空エラー';
			}else{
				$columns = 'WHERE '.$columns.' = ?';
			}

			$dbh     = $this->dbh;
			$db_data = $dbh->prepare( "select * FROM {$table} {$columns}" );
			$db_data->execute( $values );
			if ( ! empty( $db_data->rowCount() ) ) {
				return true;
			} else {
				return false;
			}
		} catch ( Exception $e ) {
			return $e;
		}
	}

	//追加と更新
	public function update($id,$val1,$val2){
		try{
			$dbh = $this->dbh;
			if($this->is_duplication('id',$id,'table_name')){
				$db_data = $dbh->prepare("
UPDATE	{$this->table}
SET	
val1 = ?,
val2 = ?,
modified = NOW()
WHERE id = ?
");
			}else{
				$db_data = $dbh->prepare("
INSERT INTO	{$this->table} (id,val1,val2,created,modified)
VALUES	(?,?,?,NOW(),NOW())
");
			}
			$db_data->execute(array(
				$id,$val1,$val2));

			return true;
		}catch (Exception $e){
			return $e;
		}
		//$data = $db_data->fetchAll();
	}

	//取得
	public function select($id ) {
		try {
			$dbh     = $this->dbh;
			$db_data = $dbh->prepare( "
SELECT * FROM {$this->table}
WHERE id = ?
" );
			$db_data->execute( array(
				$id
			) );

			//return $db_data->fetchAll fetchAll(PDO::FETCH_ASSOC); 配列で返す場合はこちら
			return $db_data->fetchAll(PDO::FETCH_OBJ);
		} catch ( Exception $e ) {
			return $e;
		}
	}

	//何ページ目から10個
	public function select_page( $page, $type_id ) {
		try {
			$page = ($page-1) *10;

			$dbh     = $this->dbh;
			$db_data = $dbh->prepare( "
SELECT * FROM {$this->table}
WHERE type_id = :id
LIMIT :page,10
" );
			$db_data->bindValue(':page', (int) $page, PDO::PARAM_INT);
			$db_data->bindValue(':id', $type_id , PDO::PARAM_STR);
			$db_data->execute();
			return $db_data->fetchAll(PDO::FETCH_OBJ);
		} catch ( Exception $e ) {
			return $e;
		}
	}

}
タイトルとURLをコピーしました