【PHP】PDOデータベースと接続する機能の解説

以前PDOについてこんなツイートをしました。これだけだとなんとなく流れとPDOについてしかわからないと思うので記事にしました。もう少し詳しく説明していきます。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">データベースと接続するきのう【PDO】について<br><br>PDOとは？めちゃめちゃ簡単に言うと<br><br>・データベースと接続するために、特化した機能<br><br>です。<br><br>1.PDOを使うためにインスタンス化（実体）<br>2.例外処理 Exception 「try-catch」<br><br>流れはこんな感じかな<a href="https://twitter.com/hashtag/PDO?src=hash&amp;ref_src=twsrc%5Etfw">#PDO</a> <a href="https://twitter.com/hashtag/PHP?src=hash&amp;ref_src=twsrc%5Etfw">#PHP</a> <a href="https://twitter.com/hashtag/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0?src=hash&amp;ref_src=twsrc%5Etfw">#プログラミング</a></p>&mdash; Tomoya@Web系フリーランサー (@div_tomo) <a href="https://twitter.com/div_tomo/status/1694868382439571869?ref_src=twsrc%5Etfw">August 25, 2023</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

PDOは、PHP Data Objects の略で、どのデータベースを利用する場合でも同じ関数を使うことができ、もし将来データベースを変更することがあっても、 PDO オブジェクトを作成する時に指定したパラメータだけを変更するば良いです。

## クラスの考え方

```php
--class--
 変数/定数
 関数
----------
```

クラス(class)というのは、簡単に言うと

変数や定数、関数などを**ひとまとめ**にした物と考えておくとOKです。

PDOの場合は、データベースと接続するために、特化した機能です。

## 変数や関数はclassの中に入ると呼び方が変わる

変数や定数はclassの中に入ると呼び方が変わり、プロパティという呼び方に変わります。

```mermaid
flowchart LR
A[変数/定数] ---> B[プロパティ]
```

関数はclassの中に入ると、メソッドという呼び方に変わります。

```mermaid
flowchart LR
A[関数] ---> B[メソッド]
```

ただ呼び方が変わっただけで意味的には一緒になるので心配しないでください。

## クラスの使い方

基本的にclassはそのままでは使えなくて、**instance化（実体化）**という手順をする必要があります。

### クラスを使うnew（動的）

newという構文を使うことで、クラスを使える状態にする事ができます。

```php
$pdo = new class名;
$pdo->プロパティ
$pdo->メソッド
```

`new class名` を一旦変数 `$pdo` に入れて、**プロパティ（変数）**や**メソッド（関数**）を使っていくという形になります。

```php
-> はアロー演算子と呼びます。
```

配列の場合は `=>`  だったのですが

クラスの場合は `->` のようになります。

### クラスを使うsetatic（静的）

クラス名などに `::` を使ってプロパティ（変数）、メソッド（関数）を使っていく方法もあります。

```php
PDO::ATTR_ERRMODE
PDO::ERRMODE_EXCEPTION
```

クラスの中の変数や関数に static という物を付けておくと実行することができます。

```php
:: はスコープ演算子と呼びます。
```

# 手順

## ファイルの作成

**formフォルダ** の中に **db_connection.phpファイル** を作成していきます。

```php
form
  |
  |----> db_connection.php
```

## インスタンス化

まずは、PDOを使うためにインスタンス化（実体）する必要があるのでまずはそちらを書いていきます。

> **form > db_connection.php**
> 

```php
<?php

const DB_HOST = 'mysql:dbname=php_test;host=127.0.0.1;charset=utf8';
const DB_USER = 'php_user';
const DB_PASSWORD = 'SuTomSun0218';

$pdo = new PDO(DB_HOST, DB_USER, DB_PASSWORD);
```

### 説明

定数は `const` で始まります。定数は一般的にすべて大文字で書いていきますので今回は `DB_HOST` とします。

```php
const DB_HOST = 'mysql:dbname=php_test;host=127.0.0.1;charset=utf8';
```

| dbname=php_test; | ＝ | データベースの名前 |
| --- | --- | --- |
| host=127.0.0.1; | ＝ | 接続先（今回はローカルなので127.0.0.1） |
| charset=utf8 | ＝ | 文字コード |

```php
const DB_USER = 'php_test';
```

| php_test | ＝ | データベースにアクセスできるユーザー |
| --- | --- | --- |

```php
const DB_PASSWORD = 'SuTomSun0218';
```

| SuTomSun0218 | ＝ | php_userのパスワード |
| --- | --- | --- |

ここで設定されている情報は以下の記事で作成した情報になります。

https://qiita.com/div_tomo/items/f1c3c6298090fb062af4

```php
$pdo = new PDO(DB_HOST, DB_USER, DB_PASSWORD);
```

PDOを実際にインスタンス化（実体）するために、DB_HOST、DB_USER、DB_PASSWORD の情報を PDO(引数) の引数の中に入れてあげています。

基本的にはこれでデータベースの接続ができるのですが、データベースが接続できない場合、プログラムがそのまま進んでしまうとまずいので、まずはデータベースが繋がっているかどうかのチェックをかけていく必要があります。

この際に使われるのが例外処理という物です。

## 例外処理 Exception

例外処理をするには、トライキャッチ構文を使って書いていきます。

> **form > db_connection.php**
> 

```php
const DB_HOST = 'mysql:dbname=php_test;host=127.0.0.1;charset=utf8';
const DB_USER = 'php_test';
const DB_PASSWORD = 'SuTomSun0218';

try
{
    $pdo = new PDO(DB_HOST, DB_USER, DB_PASSWORD);
    echo '接続に成功しました。';
}
catch(PDOException $e)
{
    echo '接続に失敗しました。' . $e->getMessage() . "\n";
    exit();
}
```

### 説明

try{} は正常の処理

catch(){} もしエラーがでた場合の処理

```php
try
{
    $pdo = new PDO(DB_HOST, DB_USER, DB_PASSWORD);
    echo '接続に成功しました。';
}
```

先ほど作成したPDOのインスタンス化（実体）するコードを try{} の中に切り取って貼り付けます。

```
catch(PDOException $e)
{
    echo '接続に失敗しました。' . $e->getMessage() . "\n";
    exit();
}
```

これはお決まりの書き方なのですが

`catch(PDOException $e)` PDOの場合は `PDOException $e` と書きます。

`echo '接続に失敗しました。' . $e->getMessage() . "\n";` 表示させたい文字

`$e->getMessage()` というメソッドがあります。

`\n` で改行できます。

`exit();` で処理を抜ける。

この書き方はデータベースと接続する時には、お決まりの書き方になります。

ローカルにアクセスして表示内容を確認してみましょう。

**接続に成功していたら「接続に成功しました。」**

**接続に失敗したら「接続に失敗しました。（エラーメッセージ）」**

のように表示されるはずです。

これでデータベースと接続できたことが確認できました。