PHP アドバンス

PHP からMySQLへの接続

1. PHPをMySQLに接続する

PHPでMySQLデータベースを操作する場合、主に以下の2つの拡張機能(Extensions)がサポートされています。

  • MySQLi (MySQL Improved)
  • PDO (PHP Data Objects)

2. MySQLiとPDOのどちらを使うべきか?

結論から言えば、「どちらでも好みのほうを使って良い」ということになります。
ただし、それぞれに以下のような利点があります。

  • PDOは、12種類の異なるデータベースシステムに対応しています。一方、MySQLiはMySQLデータベースのみに対応しています。そのため、将来的にプロジェクトで別のデータベースへの切り替えが必要になった場合、PDOであれば接続文字列(Connection String)と少数のクエリを修正するだけで済みます。MySQLiの場合は、クエリを含めたコード全体を書き直す必要があります。
  • どちらもオブジェクト指向(Object-Oriented)をサポートしていますが、MySQLiは手続き型(Procedural)のAPIも提供しています。
  • どちらもプリペアドステートメント(Prepared Statements)をサポートしています。これはSQLインジェクションからアプリケーションを保護するために非常に重要であり、Webアプリケーションのセキュリティに欠かせません。

3. MySQLiとPDOの構文比較

本章および以降の章では、PHPとMySQLを連携させる3つの方法を実演します。

  1. MySQLi(オブジェクト指向)
  2. MySQLi(手続き型)
  3. PDO

3.1 MySQLiのインストール

LinuxやWindowsの場合:ほとんどの場合、php-mysql パッケージをインストールすると、MySQLi拡張機能も自動的にインストールされます。

3.2 PDOのインストール

インストールの詳細については、公式ドキュメントを参照してください。

4. MySQLへの接続を開く

MySQLデータベース内のデータにアクセスする前に、まずはサーバーに接続できる必要があります。
通常、接続には「サーバー名」「ユーザー名」「パスワード」「データベース名」の4つの情報が必要です。

例:MySQLi オブジェクト指向

<?php
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "mydb";

// 接続の作成
$conn = new mysqli($servername, $username, $password, $dbname);

// 接続の確認
if ($conn->connect_error) {
  die("接続に失敗しました: " . $conn->connect_error);
}
echo "接続に成功しました";
?>

例:MySQLi 手続き型

<?php
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "mydb";

// 接続の作成
$conn = mysqli_connect($servername, $username, $password, $dbname);

// 接続の確認
if (!$conn) {
  die("接続に失敗しました: " . mysqli_connect_error());
}
echo "接続に成功しました";
?>

例:PDO

<?php
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "mydb";

try {
  $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
  // PDOのエラーモードを例外に設定
  $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  echo "接続に成功しました";
} catch(PDOException $e) {
  echo "接続に失敗しました: " . $e->getMessage();
}
?>

       ヒント: PDOの大きな利点は、データベースクエリで発生した問題を処理するための例外(Exception)クラスを持っていることです。try { } ブロック内で例外がスローされると、スクリプトの実行が停止し、最初の catch(){ } ブロックに処理が移ります。

5. MySQLへの接続を閉じる

接続は、スクリプトが終了すると自動的に閉じられます。スクリプトの途中で明示的に接続を閉じたい場合は、以下の方法を使用します。

例:MySQLi オブジェクト指向

$conn->close();

例:MySQLi 手続き型

mysqli_close($conn);

例:PDO

$conn = null;