3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

PHPのDBクラス

Last updated at Posted at 2024-08-13

PHPでDBクラスを作成

PHPを最近触れたばかりなので慣習とかは分かり兼ねるのですが、DB接続するためのクラスは情報が少なかったので作りました。
最低限のDBを操作するメソッドを用意してます。
また、PHPは基本MySQLを使うことが多いかと思いますが、インターフェースを用意してます。本記事はMySQLの使用例のみ掲載してます。(今後更新するかもしれません。)

インターフェース作成

Idb.php
<?php
interface Idb {
    public function fetchAll($sql,$param = []);

    public function fetch($sql,$param = []);

    public function execute($sql,$param = []);
}
?>

DB実装クラス作成

require_onceで作成したインターフェースを読み込んでください。
ホスト名・ユーザ名・パスワードは自身の環境に応じて設定してください。

MySql.php
<?php
require_once('./Idb.php'); // インターフェース"Idb.php"のパス

class MySql implements Idb
{
    private $DB_DATABASE = 'host_name'; // ホスト名(自身の環境)
    private $DB_USER = 'user_name'; // ユーザ名(自身の環境)
    private $DB_PASS = 'user_password'; // ユーザパスワード(自身の環境)
    private $DB_OPTION = 'charset=utf8mb4'; // オプション
    private $pdo;

    public function __construct()
    {
        $dsn = "mysql:host=localhost;dbname={$this->DB_DATABASE};{DB_OPTION};";
        try {
            $this->pdo = new PDO($dsn, $this->DB_USER, $this->DB_PASS);
            $this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        } catch (PDOException $e) {
            die('DB接続エラー:' . $e->getMessage()); 
        }
    }

    // データを取得するメソッド
    public function fetchAll($sql, $params = [])
    {
        $stmt = $this->query($sql,$params);
        return $stmt->fetchAll(PDO::FETCH_ASSOC);
    }

    // データを1件取得するメソッド
    public function fetch($sql, $params = [])
    {
        $stmt = $this->query($sql,$params);
        return $stmt->fetch(PDO::FETCH_ASSOC);
    }

    // データの挿入・更新・削除するメソッド
    public function execute($sql, $params = [])
    {
        $stmt = $this->query($sql, $params);
        return $stmt->rowCount();
    }

    // クエリ実行共通処理
    private function query($sql, $params = [])
    {
        try {
            $stmt = $this->pdo->prepare($sql);
            $stmt->execute($params);
            return $stmt;
        } catch (PDOException $e) {
            die('DBエラー: ' . $e->getMessage());
        }
    }
}
?>

使用例

require_onceでDB実装クラスを読み込んでください。

hoge.php
<?php
require_once('./MySql.php'); // 実装クラスのパス

// インスタンス生成
$db = new MySql();

// レコード1件取得
$record = $db -> fetch("SELECT column1,column2 FROM table_name WHERE column1 = ?;", ['where1']);
// 出力
echo "{$record['column1']}\n";
echo "{$record['column2']}\n";

// 取得したレコード全て取得
$allRecord = $db -> fetchAll("SELECT column1,column2 FROM table_name;");
// 出力
foreach($allRecord as $arr){
    echo "{$arr['column1']}\n";
    echo "{$arr['column2']}\n";
}

// レコードの更新
$updateRecord = $db -> execute("UPDATE table_name SET column1 = 'hoge' WHERE column1 = ? AND column2 = ?;",['where1','where2']);
?>

WHERE句のように、変数をSQL文に入れる場合はプレースホルダを使用します。プレースホルダは第2引数で配列として渡し、SQL文のプレースホルダ"?"を先頭から順に、配列で指定します。
例えばレコードの更新においては、配列の要素0("where1")は"column1"に該当し、配列の要素1("where2")は"column2"に該当します。
プレースホルダが1つの場合(例:レコード1件取得)でも配列で値を渡し、プレースホルダがない場合(例:レコード全て取得)は引数を省略できます。
出力については他のサイトで多く紹介されている方法と同じなのでそちらを参考にしていただくとわかりやすいかと思いますが、カラム名で取得できたり幅広い使い方が可能です。

お役に立てたら幸いです。

3
3
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
3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?