SMART LLC

簡単に安全にデータベースを操作できる自作関数群(PHP+PDO)

公開日:2015/01/28

空いた時間でPHPで会員登録する仕組を作り始めたのだけど
データベースを扱う部分がごちゃごちゃしたので使いやすいように関数を自作してみた。
もちろんプリペアドステートメントを使ってSQLインジェクション対策してる。
関数とその使い方をメモする。

db_connect()関数

データベースに接続する関数。

function db_connect() {
	$ini = parse_ini_file('dbconnect.ini');
	$dsn = $ini['dsn'];
	$user = $ini['user'];
	$password = $ini['password'];

	$options = array(
		PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
		PDO::ATTR_EMULATE_PREPARES => false,
		PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8'
	);

	$pdo = new PDO($dsn, $user, $password,$options);
	return $pdo;
}

これについてはプリペアドステートメントでSQLインジェクション対策にあるので解説は省略。
この関数の戻り値のPDOクラスを使ってデータベースを操作する。

db_trans()関数

トランザクションを開始する関数。

function db_trans($pdo) {
	$pdo->beginTransaction();
}

db_connect()関数で受け取ったPDOクラスを渡す。
といってもbeginTransaction()関数をわかりやすくしただけ。
基本的には自動コミットがあるのでトランザクションをかけたい時だけ使用すればOK。

db_commit()関数

トランザクションをコミットする関数。

function db_commit($pdo) {
	$pdo->commit();
}

db_connect()関数で受け取ったPDOクラスを渡す。
db_trans()関数でトランザクションを開始した場合だけ、コミットしたいタイミングで使用。
db_trans()関数を使用しない場合は自動コミットモードが動作するので必要ない。
これもcommit()関数をわかりやすくしただけ。

db_rollback()関数

トランザクションをロールバックする関数。

function db_rollback($pdo) {
	$pdo->rollback();
}

db_connect()関数で受け取ったPDOクラスを渡す。
db_trans()関数でトランザクションを開始した場合だけ、ロールバックしたいタイミングで使用。
db_trans()関数を使用しない場合は自動コミットモードが動作するので必要ない。
これもrollback()関数をわかりやすくしただけ。

db_prepare()関数

SQLを準備する関数。

function db_prepare($pdo,$sql) {
	$stm = $pdo -> prepare($sql);
	return $stm;
}

db_connect()関数で受け取ったPDOクラスと、SQL文の静的な部分?(表現が難しい!)を渡す。
同じ形のSQLを連続で実行する場合は一度呼び出せばOK。
これもprepare()関数をわかりやすくしただけ。
この関数の戻り値のPDOStatementクラスを使ってSQLを実行する。

db_execute()関数

SQLを実行する関数。

function db_execute($stm,$cols) {
	$stm ->execute($cols);
}

db_prepare()関数で受け取ったPDOStatementクラスと、SQL文の動的な部分?(表現が難しい!)の配列を渡す。
これもexecute()関数をわかりやすくしただけ。

db_fetch()関数

データベースの抽出結果を出力する関数。

function db_fetch($stm) {
	$rows = $stm->fetchAll(PDO::FETCH_ASSOC);
	return $rows;
}

db_execute()関数を実行したPDOStatementクラスを渡す。
これはfetchAll()関数をパラメータをFETCH_ASSOC固定で実行する。
この関数で受け取った配列にデータベースの抽出結果が格納される。

使い方1:SELECT

特定の1レコードの1列をSELECTしたい場合。

$pdo = db_connect();
$stm = db_prepare($pdo,'SELECT * FROM `TEST` WHERE COLUMN1=:col2');
db_execute($stm,array($col2));
$result = db_fetch($stm);
if($result!=null){
	$col1 = $result[0]['COL1'];
}

まずdb_connect()関数で接続開始。
db_prepare()関数でSELECT文の型を生成。
db_execute()関数でWHERE句に値をセットしてSELECTを実行。
db_fetch()関数でSELECT結果を配列に出力。
結果が複数行ある場合は$resultをループすればOK。

使い方2:INSERT

1レコードをINSERTしたい場合。

$pdo = db_connect();
$stm = db_prepare($pdo,'INSERT INTO `TEST` VALUES (:col1,:col2)');
db_execute($stm,array($col1,$col2));

まずdb_connect()関数で接続開始。
db_prepare()関数でINSERT文の型を生成。
db_execute()関数でVALUE句に値をセットしてINSERTを実行。

使い方3:トランザクション処理

同一トランザクション内で複数のSQLを実行したい場合。

$pdo = db_connect();
db_trans($pdo);
try{
	$stm = db_prepare($pdo,'DELETE FROM `TEST` WHERE COL1=:col1');
	db_execute($stm,array($col1));
	$stm = db_prepare($pdo,'INSERT INTO `TEST` VALUES (:col1,:col2)');
	db_execute($stm,array($col1,$col2));
	db_commit($pdo);
} catch (Exception $e){
	db_rollback($pdo);
	throw $e;
}

まずdb_connect()関数で接続開始。
db_prepare()関数でDELETE文の型を生成。
db_execute()関数でWHERE句に値をセットしてDELETEを実行。
db_prepare()関数でINSERT文の型を生成。
db_execute()関数でVALUE句に値をセットしてINSERTを実行。
INSERTまで成功した場合はdb_commit()関数でコミット。
途中でエラーが発生した場合はdb_rollback()関数でロールバック。

データベース部分はできた。
現在、セッションハイジャックについて勉強中φ(`д´)

SHARE