5ステップで理解する!PHP PDOの使い方と詳細解説

PHP PDOの詳細解説と使い方PHP
この記事は約15分で読めます。

 

【サイト内のコードはご自由に個人利用・商用利用いただけます】

この記事では、プログラムの基礎知識を前提に話を進めています。

説明のためのコードや、サンプルコードもありますので、もちろん初心者でも理解できるように表現してあります。

基本的な知識があればカスタムコードを使って機能追加、目的を達成できるように作ってあります。

※この記事は、一般的にプロフェッショナルの指標とされる『実務経験10,000時間以上』を凌駕する現役のプログラマチームによって監修されています。

サイト内のコードを共有する場合は、参照元として引用して下さいますと幸いです

※Japanシーモアは、常に解説内容のわかりやすさや記事の品質に注力しております。不具合、分かりにくい説明や不適切な表現、動かないコードなど気になることがございましたら、記事の品質向上の為にお問い合わせフォームにてご共有いただけますと幸いです。
(送信された情報は、プライバシーポリシーのもと、厳正に取扱い、処分させていただきます。)

はじめに

あなたがこの記事を読んでいるということは、PHP PDOの使い方について知りたい、またはその理解を深めたいということでしょう。

それならば、あなたは正しい場所に来ました。

この記事を読めば、PHP PDOを使ってデータベースとのインタラクションを行う方法を学ぶことができるようになります。

●PHP PDOとは

PDOはPHP Data Objectsの略で、PHPでデータベースを扱うための拡張モジュールの一つです。

○PDOの基本的な役割と利点

PHP PDOの主な役割は、PHPとデータベースとの間の接続を管理することです。

その最大の利点は、異なる種類のデータベースに対する一貫したインターフェースを提供することで、コードの再利用性を高めるとともに、データベースの種類を変更した場合でも、大幅なコードの改変を必要としません。

●PHP PDOの使い方

PHP PDOを使ってデータベースと接続するための基本的な手順を説明します。

○基本的な接続方法

PDOを使ってデータベースに接続するための基本的なコードは次の通りです。

この例では、MySQLデータベースに接続しています。

<?php
$dsn = 'mysql:host=localhost;dbname=testdb;charset=utf8';
$user = 'username';
$password = 'password';

try {
    $pdo = new PDO($dsn, $user, $password);
    echo 'データベースへの接続に成功しました。';
} catch (PDOException $e) {
    echo 'データベースへの接続に失敗しました。' . $e->getMessage();
}
?>

このコードは、DSN(Data Source Name)を使用してMySQLデータベースに接続しています。

DSNは、接続するデータベースのタイプ(この場合はmysql)、ホスト名(localhost)、データベース名(testdb)、文字セット(utf8)を指定します。

次に、データベースのユーザ名とパスワードを設定します。

最後に、PDOのインスタンスを生成するための新しいPDOオブジェクトを作成します。

このとき、接続に問題が発生した場合は、例外がスローされ、エラーメッセージが出力されます。

○サンプルコード1:データベースへの接続

それでは、データベースに接続するための具体的なコードを見てみましょう。

下記のサンプルコードは、上記の基本的な接続方法を元に、PDOを用いてMySQLデータベースに接続しています。

<?php
$dsn = 'mysql:host=example.com;dbname=sampledb;charset=utf8';
$user = 'testuser';
$password = 'testpassword';

try {
    $pdo = new PDO($dsn, $user, $password);
    echo 'データベースへの接続に成功しました。';
} catch (PDOException $e) {
    echo 'データベースへの接続に失敗しました。' . $e->getMessage();
}
?>

このコードでは、例えば、ホスト名が”example.com”、データベース名が”sampledb”、ユーザ名が”testuser”、パスワードが”testpassword”のMySQLデータベースに接続しています。

そして、接続に成功したら”データベースへの接続に成功しました。”と表示し、接続に失敗したら”データベースへの接続に失敗しました。”とエラーメッセージとともに表示します。

このコードを実行すると、データベースへの接続が成功した場合、画面には”データベースへの接続に成功しました。”と表示され、接続が失敗した場合、”データベースへの接続に失敗しました。”というメッセージと具体的なエラーメッセージが表示されます。

○サンプルコード2:クエリの実行

データベースに接続できたら次にデータベースへのクエリの実行方法について見ていきましょう。

下記のサンプルコードは、SQLクエリを実行して結果を取得する基本的な手順を示しています。

<?php
$dsn = 'mysql:host=example.com;dbname=sampledb;charset=utf8';
$user = 'testuser';
$password = 'testpassword';

try {
    $pdo = new PDO($dsn, $user, $password);
    echo 'データベースへの接続に成功しました。<br>';

    $sql = 'SELECT * FROM users';
    $stmt = $pdo->query($sql);

    foreach ($stmt as $row) {
        echo $row['name'] . '<br>';
    }
} catch (PDOException $e) {
    echo 'クエリの実行に失敗しました。' . $e->getMessage();
}
?>

このコードでは、まず前述の通りPDOを使ってデータベースに接続します。

次に、”SELECT * FROM users”というSQLクエリを作成します。

これは、usersテーブルから全てのレコードを取得するクエリです。

次に、PDOオブジェクトのqueryメソッドを使ってこのクエリをデータベースに送信します。

このメソッドはPDOStatementオブジェクトを返すので、これを$stmt変数に格納します。

最後に、foreachループを使って取得した各レコードの’name’フィールドの値を出力します。

このコードを実行すると、データベースへの接続が成功した場合、usersテーブルに存在する全てのレコードの’name’フィールドの値が表示されます。

もしクエリの実行に問題があった場合は、”クエリの実行に失敗しました。”というメッセージと共に具体的なエラーメッセージが表示されます。

○サンプルコード3:データの取得

次に、特定のデータのみを取得する方法について見ていきましょう。

下記のサンプルコードは、指定したIDのユーザー情報を取得する例を示しています。

<?php
$dsn = 'mysql:host=example.com;dbname=sampledb;charset=utf8';
$user = 'testuser';
$password = 'testpassword';

try {
    $pdo = new PDO($dsn, $user, $password);
    echo 'データベースへの接続に成功しました。<br>';

    $id = 1;
    $sql = 'SELECT * FROM users WHERE id = :id';
    $stmt = $pdo->prepare($sql);
    $stmt->execute([':id' => $id]);

    $row = $stmt->fetch(PDO::FETCH_ASSOC);


    echo $row['name'] . '<br>';
} catch (PDOException $e) {
    echo 'データの取得に失敗しました。' . $e->getMessage();
}
?>

このコードでは、特定のユーザーID(ここでは1)を指定して、そのユーザーの情報を取得します。

SQLクエリの中で’:id’というプレースホルダーを使用して、後で実際のID値をバインドします。

executeメソッドを使ってクエリを実行する際に、プレースホルダーの値を配列形式で指定します。

そして、fetchメソッドを使って結果を取得します。この場合、結果は連想配列形式(PDO::FETCH_ASSOC)で取得します。

このコードを実行すると、指定したIDのユーザーの’name’フィールドの値が表示されます。

もしデータの取得に問題があった場合は、”データの取得に失敗しました。”というメッセージと共に具体的なエラーメッセージが表示されます。

○サンプルコード4:データの挿入

データをデータベースに挿入するための基本的な手順について説明します。

下記のサンプルコードでは新規ユーザーの情報をデータベースに追加します。

<?php
$dsn = 'mysql:host=example.com;dbname=sampledb;charset=utf8';
$user = 'testuser';
$password = 'testpassword';

try {
    $pdo = new PDO($dsn, $user, $password);
    echo 'データベースへの接続に成功しました。<br>';

    $name = '新規ユーザー';
    $sql = 'INSERT INTO users (name) VALUES (:name)';
    $stmt = $pdo->prepare($sql);
    $stmt->execute([':name' => $name]);

    echo 'データの挿入に成功しました。<br>';
} catch (PDOException $e) {
    echo 'データの挿入に失敗しました。' . $e->getMessage();
}
?>

このコードでは、まずデータベースに接続します。

次に、新規ユーザーの名前を指定します。

その後、INSERT INTO文を使って新規ユーザーの情報をusersテーブルに追加するSQLクエリを作成します。

ここでも’:name’というプレースホルダーを使用し、executeメソッドで実際の値をバインドします。

このコードを実行すると、新規ユーザーがデータベースに追加され、”データの挿入に成功しました。”と表示されます。

何か問題があった場合は、”データの挿入に失敗しました。”と表示され、エラーメッセージも出力されます。

●PHP PDOの詳細な対処法

PHP PDOを使用する際には、エラーが発生する可能性があります。

そのような場合、適切なエラーハンドリングが重要となります。

○エラーハンドリング

PDOではエラーハンドリングを行うためのいくつかの方法が提供されています。

例えば、PDO::ERRMODE_EXCEPTIONを設定することで、エラーが発生した際にPDOExceptionがスローされるように設定することができます。

これにより、エラーが発生した際にすぐに知ることができ、適切に対応することが可能になります。

○サンプルコード5:エラーハンドリングの実装

下記のサンプルコードでは、エラーハンドリングをどのように実装するかを示しています。

<?php
$dsn = 'mysql:host=example.com;dbname=sampledb;charset=utf8';
$user

 = 'testuser';
$password = 'testpassword';

try {
    $pdo = new PDO($dsn, $user, $password);
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    echo 'データベースへの接続に成功しました。<br>';

    // 不適切なSQLクエリ
    $sql = 'SELECT * FROM non_existent_table';
    $stmt = $pdo->query($sql);

} catch (PDOException $e) {
    echo 'エラーが発生しました。' . $e->getMessage();
}
?>

このコードでは、まずデータベースに接続します。

その後、setAttributeメソッドを使って、エラーモードをPDO::ERRMODE_EXCEPTIONに設定します。

これにより、何かエラーが発生したときにPDOExceptionがスローされます。

その後、存在しないテーブルを参照する不適切なSQLクエリを実行します。

この場合、PDOExceptionがスローされ、エラーメッセージが出力されます。

●PHP PDOの注意点

PHP PDOを利用する際には、いくつかの注意点が存在します。

それらを理解し、適切に対応することで、より安全かつ効率的なデータベース操作を行うことができます。

○セキュリティ対策

PHP PDOを使用してデータベースとの間で情報をやりとりする際、セキュリティ対策が重要です。特にSQLインジェクションという脅威に注意が必要です。

これは、不正なSQL文が実行されることにより、データベースが攻撃される脅威です。

これを防ぐために、PDOではプリペアドステートメントを用いることが推奨されています。

プリペアドステートメントでは、SQL文の構造とデータを分離し、データは後からバインドすることで、SQLインジェクションの脅威から保護します。

●PHP PDOのカスタマイズ

PHP PDOは高度にカスタマイズ可能なツールです。そのため、特定のプロジェクトに合わせて設定を変更することが可能です。

例えば、エラーハンドリングの方式を変更したり、デフォルトのフェッチモードを変更したりすることができます。

これらの設定は、PDOオブジェクトのsetAttributeメソッドを使用して行います。

○サンプルコード6:プリペアドステートメントの使用

下記のコードでは、プリペアドステートメントを用いた安全なSQLクエリの作成方法を示しています。

<?php
$dsn = 'mysql:host=example.com;dbname=sampledb;charset=utf8';
$user = 'testuser';
$password = 'testpassword';

try {
    $pdo = new PDO($dsn, $user, $password);

    // プリペアドステートメントを用いたSQLクエリ
    $stmt = $pdo->prepare('SELECT * FROM users WHERE name = :name');
    $stmt->execute([':name' => '新規ユーザー']);
    $result = $stmt->fetchAll();

    foreach ($result as $row) {
        echo $row['name'] . '<br>';
    }

} catch (PDOException $e) {
    echo 'エラーが発生しました。' . $e->getMessage();
}
?>

このコードでは、プリペアドステートメントを用いてSQLクエリを作成します。

‘:name’というプレースホルダーを用いてSQLクエリの構造とデータを分離します。

その後、executeメソッドでプレースホルダーに実際の値をバインドします。このクエリを

実行すると、名前が’新規ユーザー’のすべてのユーザーが取得できます。

この方法を用いると、SQLインジェクションのリスクを大幅に軽減できます。

○サンプルコード7:トランザクションの実行

トランザクションは、一連の操作を一つの単位として扱う機能であり、すべての操作が成功するか、1つでも失敗すればすべてがロールバックされるという特性を持っています。

これにより、データの整合性を保つことができます。

PHP PDOを用いたトランザクションの実行方法を、下記のサンプルコードで説明します。

<?php
$dsn = 'mysql:host=example.com;dbname=sampledb;charset=utf8';
$user = 'testuser';
$password = 'testpassword';

try {
    $pdo = new PDO($dsn, $user, $password);
    $pdo->beginTransaction();

    // トランザクション内の操作
    $stmt = $pdo->prepare('UPDATE users SET score = score + 10 WHERE name = :name');
    $stmt->execute([':name' => '新規ユーザー']);

    // 他の操作...

    // 全ての操作が成功したらコミット
    $pdo->commit();
} catch (PDOException $e) {
    // エラーが発生したらロールバック
    $pdo->rollBack();
    echo 'エラーが発生しました。' . $e->getMessage();
}
?>

このコードでは、まずbeginTransactionメソッドでトランザクションを開始します。

次に、ユーザーのスコアを10点加算する操作を行います。

ここでもプリペアドステートメントを利用しています。

そして、他の操作を行い、全ての操作が成功すればcommitメソッドでトランザクションをコミットし、確定させます。

もし途中で何かしらのエラーが発生した場合は、catchブロックが実行され、rollBackメソッドで全ての操作をロールバックします。

トランザクションを利用することで、データの一貫性を保ちつつ、一連の操作を安全に行うことが可能になります。

ただし、トランザクションを用いるときは、全ての操作が終了するまで他の操作がブロックされるため、パフォーマンスに影響を与える場合があります。

これらの知識を活用して、より安全で効率的なデータベース操作を行いましょう。

まとめ

PHP PDOは、PHPでデータベースとの間で情報をやり取りするためのツールです。

安全性を確保しつつ、効率的にデータベース操作を行うための機能が充実しています。

プリペアドステートメントを用いた安全なクエリ実行、トランザクションを利用した一連の操作の一貫性確保など、多機能で実用的な使い方を提供しています。

しかし、上述のサンプルコードのように使い方を理解し、正しく使うことが重要です。

本記事の説明やサンプルコードを参考に、PHP PDOを用いたコーディングを進めてみてください。

おそらく、その使い勝手の良さと、安全性の高さに驚くことでしょう。

これからもPHP PDOを活用した開発が、より快適で効率的になるよう願っています。