DBの最近のブログ記事

PDO関数 単純な接続

| | コメント(2)

実際に MySQL サーバーに接続しデータを取得してみます。 サンプルではホスト名 localhost に接続し、testdb データベースの testtable テーブルにある全ての行を取得します。

<html><head><title>PDO サンプル - 接続テスト</title></head>
<body>
<style type="text/css">
table { border-collapse: collapse; }
caption { font-weight: bold; }
th, td { padding: 0.2em 1em; border: 1px solid gray; }
th { background-color: whitesmoke; border-bottom-width: 2px; }
td.id { text-align: center; }
col.id { background-color: aliceblue; }
</style>

<?php
/**
 * DSN (Data Source Name) です。
 * PDO は DSN を元に DB へ接続します。
 *
 * 'mysql:localhost; dbname=testdb;' の場合、
 * MySQL 用の PDO ドライバを使用し、
 * ホスト名 "localhost" にある MySQL サーバに接続し、
 * デフォルトで使用するデータベースは "testdb" とします。
 *
 * 書式は使用する PDO ドライバによって異なります。
 * 詳しくは PDO ドライバ毎のマニュアルを参照下さい。
 * http://www.php.net/manual/en/ref.pdo.php#pdo.drivers
 */
$dsn = 'mysql:host=localhost; dbname=testdb;';

/**
 * DB サーバの接続に使用するユーザ名です。
 */
$userName = 'username';

/**
 * DB サーバの接続に使用するパスワードです。
 */
$password = 'password';

try
{
	// 接続を確立します。
	//
	// なんらかの理由により接続出来なかった場合、
	// PDOException 例外が発生します。
	$connection = new PDO($dsn, $userName, $password);
	
	// 接続毎の設定を行います。
	//
	// PDO::ATTR_ERRMODE 定数は「エラーが発生した時の通知方法を設定する」を示し、
	// PDO::ERRMODE_EXCEPTION 定数は 「例外を発生させる」を示します。
	//
	// もし例外ではなく E_WARNING エラーを発生させたい時は
	// $connection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
	// とします。
	//
	// setAttribute メソッドに渡せる定数はこちらを参照下さい。
	// http://www.php.net/manual/en/function.pdo-setattribute.php
	$connection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
	
	// 接続に対しコマンドを発行します。
	// PDO::query メソッドはステートメント実行後の結果セットを表す
	// PDOStatement オブジェクトを返します。
	//
	// なんらかの理由によりエラーが発生した時、
	// PDO::ATTR_ERRMODE の値にそってエラーが通知されます。
	// デフォルト、もしくは値が PDO::ERRMODE_SILENT の場合エラーは通知されず、
	// 代わりに戻り値が false となります。
	// このスクリプトでは PDOException 例外が発生します。
	//
	// // デフォルト動作時のエラーチェック
	// $connection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT);
	// $statement = $connection->query('でたらめSQL');
	// if ($statement === false)
	// {
	//     trigger_error('よくわからないけどダメだった', E_USER_WARNING);
	// }
	$statement = $connection->query('select * from `testtable`');
	
	// 結果セットが表すデータの取得方法を設定します。
	// PDO::FETCH_NAMED 定数は「カラム名を添え字にした配列として受け取る」を
	// 表します。
	$statement->setFetchMode(PDO::FETCH_NAMED);
	
	// 結果を取得します。
	echo '<table summary="testtable の中身">';
	echo '<caption>testtable の中身</caption>';
	echo '<col class="id" /><col class="name" /><col class="tel" />';
	echo '<thead><tr><th>ID</th><th>Name</th><th>Tel</th></tr></thead>';
	echo '<tbody>';

	while (($row = $statement->fetch()) !== false)
	{
		echo '<tr>';
		echo '<td class="id">' . htmlspecialchars($row['Id']) . '</td>';
		echo '<td class="name">' . htmlspecialchars($row['Name']) . '</td>';
		echo '<td class="tel">' . htmlspecialchars($row['Tel']) . '</td>';
		echo '</tr>';
	}
	
	echo '</tbody>';
	echo '</table>';

	// 接続を切断します。
	//
	// PDO クラスには明示的に切断するメソッドが無く、
	// オブジェクトが破棄される時に切断されます。
	// 通常スクリプト終了時にオブジェクトも破棄されますので
	// 明示的に切断する必要はありません。
	//
	// もしスクリプトの途中で切断が必要になった時は、
	// オブジェクトを GC(ガベージ コレクト) によって破棄する必要があります。
	// GC とは、不要になった資源(メモリ・各種接続等)を開放する PHP の機能です。
	// PDO オブジェクトを GC の対象にさせるには、PDO オブジェクトを参照している
	// 変数を削除するか、NULL 等を代入してオブジェクトへの参照をなくします。
	//
	// unset($connection);
	// $connection = null;
	// $connection = "お前など絶縁だ!";
	//
	// これらは全て PDO オブジェクトを破棄させるのに有効です。
}
catch (PDOException $e)
{
	echo "エラー: " . $e->getMessage();
}

?>

</body></html>

実行結果のイメージです。
実行結果のイメージ

続く...

PDO 関数

| | コメント(4)

PHP 5.1 になり、PDO 関数が標準でサポートされた。PDO とは PHP Data Object の頭文字で、データベースの為のクラス郡。かっこよく言えばデータベース抽象化レイヤーであり、さかしげに言えばインピーダンス ミスマッチを解消するO/Rマッパーではない。シティーボーイなら、データベース アブストラクト レイヤなんて言っちゃうかもしれない。この辺りの考え方に対するネーミングに惑わされてはいけない。結局はプログラムとデータベースの接続を楽チンにしたいだけなのだから。同じような物に PEAR:DB 等があるが、PDO はシンプル・軽量が売りだそうな。身内向けのドキュメントを書く事があったのでその準備編。

準備

PDO 関数を利用する為には PHP 5 と PDO エクステンション、それと使用するデータベース用の PDO ドライバの3つが必要です。
導入例として、Win32 環境で稼動している Apache™ 2.0 に PHP をモジュールとしてインストールする方法、及び PDO を用いて MySQL™ にアクセスする際の手順を示します。

  1. PHP のウェブサイトから PHP 5 のパッケージをダウンロードします。
    ダウンロードしたパッケージを、適当なフォルダへ解凍します。
    今回は PHP 5.1.1 zip package を用意し、 "C:\PHP" へ作成しました。
  2. PHP の設定を行います。
    php-recommanded.ini を複製し、それを php.ini にリネームします。

    作成した php.ini を開き、設定を確認します。

    変更前 変更後 備考
    display_erros = Off display_erros = On 実行時エラーを出力するかどうかを表します
    display_startup_errors = Off display_startup_errors = On PHP の起動シーケンスで発生するエラーを表示するかどうかを表します
    extension_dir = "./" extension_dir = "C:\PHP\ext" エクステンションが置いてあるディレクトリを表します
    ;extension=php_mbstring.dll extension=php_mbstring.dll mbstring エクステンションを有効にします
    ;mbstring.language = Japanese mbstring.language = Japanese mbstring エクステンションの言語を表します
    ;mbstring.detect_order = auto mbstring.detect_order = auto mbstring エクステンションのエンコーディング検出方法を表します
    ;mbstring.internal_encoding = EUC-JP mbstring.internal_encoding = EUC-JP mbstring エクステンションの内部エンコーディングを表します

    php.ini に以下の行を追加します。

    備考
    extension = php_pdo.dll PDO エクステンションを有効にします
    extension = php_pdo_mysql.dll MySQL 用の PDO ドライバを有効にします

    補足

    • デバッグ時の問題を判り易くする為の設定です。運用時には Off にする事が強く推奨されています。
    • php.ini の雛形。php-recommanded.ini は推奨される設定であり、php-dest.ini は過去の PHP との互換性に重点を置いた物です。
    • これらのファイルが extension_dir で示したディレクトリにない場合、 PECL から別途入手する必要があります。
  3. PHP パッケージ内の php5ts.dll を、OS のシステム フォルダにコピーします。

    OS システム フォルダ
    (OS が C ドライブにインストールされている場合)

    Microsoft® Windows® XP

    C:\WINDOWS\system32
    Microsoft® Windows® 2000
    Microsoft® Windows® NT 4.0
    C:\WinNT\system32
    Microsoft® Windows® Me
    Microsoft® Windows® 98SE
    Microsoft® Windows® 98
    Microsoft® Windows® 95
    C:\WINDOWS\system
  4. Apache 2 の設定を行います。
    http.conf を開き、以下の文字列を追加します。

    LoadModule php5_module "C:\PHP\php5apache2.dll"
    <IfModule mod_php5.c>
    AddType application/x-httpd-php .php
    PHPIniDir "C:\PHP"
    </IfModule>
  5. 設定が完了したら Apache を再起動します。
    同時に設定が正しく反映されているか確認をします。
    phpinfo.php ファイルをドキュメントルート可に作成し、以下の内容を記入します。
    <?php echo phpinfo(); ?>

    ブラウザからアクセスして PHP クレジット他が表示されていれば正常です。

続く...

このアーカイブについて

このページには、過去に書かれたブログ記事のうちDBカテゴリに属しているものが含まれています。

次のカテゴリはFlashです。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

DB: 月別アーカイブ

Powered by Movable Type 4.12