LoginSignup
57
66

More than 5 years have passed since last update.

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

Posted at

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インジェクション対策はしましょう。

まとめ

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

57
66
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
57
66