PHP
MySQL
PDO
class

PDOをクラス化して使いやすくする(改訂版)

More than 3 years have passed since last update.

phpのPDOでのデータベースへの接続とSQL文のクラス化して使いやすくしてみました。(改訂版)

初めにphpのクラスファイル


class.php

<?php

class connect {
//定数の宣言
const DB_NAME='db_name';
const HOST='localhost';
const UTF='utf8';
const USER='user';
const PASS='pass';
//データベースに接続する関数
function pdo(){
/*phpのバージョンが5.3.6よりも古い場合はcharset=".self::UTFが必要無くなり、array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES '.SELF::UTF')が必要になり、5.3.6以上の場合は必要ないがcharset=".self::UTFは必要になる。*/
$dsn="mysql:dbname=".self::DB_NAME.";host=".self::HOST.";charset=".self::UTF;
$user=self::USER;
$pass=self::PASS;
try{
$pdo=new PDO($dsn,$user,$pass,array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES '.SELF::UTF));
}catch(Exception $e){
echo 'error' .$e->getMesseage;
die();
}
//エラーを表示してくれる。
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
return $pdo;
}
//SELECT文のときに使用する関数。
function select($sql){
$hoge=$this->pdo();
$stmt=$hoge->query($sql);
$items=$stmt->fetchAll(PDO::FETCH_ASSOC);
return $items;
}
//SELECT,INSERT,UPDATE,DELETE文の時に使用する関数。
function plural($sql,$item){
$hoge=$this->pdo();
$stmt=$hoge->prepare($sql);
$stmt->execute(array(':id'=>$item));//sql文のVALUES等の値が?の場合は$itemでもいい。
return $stmt;
}
}
?>

phpの定数宣言は2つある.

defineとconst

defineの場合

<?php

define('TEST','test');
define('test','test2');
define('Test','1+2');
echo TEST;
echo test;
echo Test;
?>

define

大文字と小文字を区別してくれる。

計算もできる。

表示結果はそれぞれ違う。

グローバルである。

どこからでも使える。

constの場合

<?php

class test{
const TEST='test';
echo test::TEST;
echo self::TEST;
}
?>

const

大文字と小文字を区別しない。

クラス定数である。

上記のechoでの表示は同じ結果である。

constの参照はクラス名::定数名かself::定数名のどちらかで参照できる。

クラス内で定数

function selectはファイル内で(select文が)1回だけ実行する時に使用する。

function pluralは(select文が)2回以上使用する場合に使用する。

function plural関数の方を使ったほうがSQLインジェクションの対策にもなるので一石二鳥ではある。

関数の呼び出し等の変数とexecute内の個数は必要に応じて増やしてください。

次にindex.php


index.php

<?php

//クラスファイルの読み込み
require_once 'class/system.php';
//クラスの生成
$obj=new connect();
//sql文の発行
$sql="SELECT * FROM class";
$sql2="SELECT * FROM class WHERE id=:id";
//変数の設定
$test=1;
//クラスの中の関数の呼び出し
$items=$obj->select($sql);
$items2=$obj->plural($sql2,$test);
?>
<!doctype html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>テスト</title>
</head>
<body>
<?php foreach($items as $item) : ?>
<p><?php echo $item['id']; ?></p>
<p><?php echo $item['name']; ?></p>
<p><?php echo $item['comment']; ?></p>
<?php endforeach; ?>
<?php foreach($items2 as $item) : ?>
<p><?php echo $item['id']; ?></p>
<p><?php echo $item['name']; ?></p>
<p><?php echo $item['comment']; ?></p>
<?php endforeach; ?>
</body>
</html>

foreach文でデータが有るだけ繰り返します。

$itemsと$items2の実行結果は全く同じになるが$items2のほうはidが指定されているので指定されているidに対応したものだけが表示される。

※sql文の中に直接変数を入れるのは危険なので必ずid=?か:id等のSQLインジェクション対策はしましょう。


まとめ

クラスってやっぱり難しいね。