今からスタート! PHP

第10回 データベースへのアクセス[関数編]

この記事を読むのに必要な時間:およそ 2 分

1. データベースに接続

DBアクセスを行う前に,必ずDBへの接続を行います。PHPでは pg_connect がPostgreSQLのDBに接続する関数です。接続の際には,host(DBサーバ)⁠port(アクセス先のポート番号)⁠dbname(データベース名)⁠user(ユーザ名)⁠password(パスワード)⁠の各パラメータが必要です。

リスト2 データベース接続の例

// データベースpostgresに接続
$db = pg_connect( 'host=localhost port=5432 dbname=postgres user=postgres password=postgres' ) or die( '接続できませんでした' );

戻り値の$dbは,DBアクセス時に用いられます。開発者がその内容を知ることが無くても,$dbを使ったDBアクセスは可能です。

2.SQLの実行

データの追加

次にSQLを実行します。リスト1を実行した段階では,まだデータが保存されていません。そこで,テーブルbookmarkにデータを追加します。このとき,追加するデータの文字コードをデータベースが対応するものに変換してください。

データを追加する時には,pg_prepareによってINSERT文を準備し,その後pg_executeで追加するデータを設定してSQL文を実行するようにします。SQL文は単なる文字列に過ぎませんが,単に文字列をつなげるだけだと,悪意のあるユーザによってSQLインジェクションという不正なアクセスを許してしまう恐れがあるためです。

リスト3 データの追加

// 文字コード変換
$title = mb_convert_encoding( '技術評論社', 'UTF-8', 'SJIS' );
$url   = mb_convert_encoding( 'http://www.gihyo.co.jp/', 'UTF-8', 'SJIS' );
// SQL文の準備
$rs = pg_prepare( $db, 'insert', 'INSERT INTO bookmark( title, url ) VALUES ( $1, $2 )' );
// データ追加
$rs = pg_execute( $db, 'insert', array( $title, $url ) );
// 追加されたデータの数を表示
print pg_affected_rows( $rs ) .'件のデータを追加しました' . "\n";
// 実行結果に関するデータを解放(クリア)する
pg_free_result( $rs );
追加されたデータの参照

データを追加できたら,それを参照してみます。参照では,まずSQL文を実行した後,結果として得られた一覧表の各行を順に読み込んでいきます。すべての行を一括して読み込む関数もありますが,メモリ容量や処理負荷の問題を考慮したうえで行ってください。

なお,このときも文字コードには注意してください。DBが対応する文字コードと表示用の文字コードとが食い違っていると,文字化けの原因になるからです。

リスト4 データの参照

// 追加された行を参照
$rs = pg_query( 'SELECT * FROM bookmark' );
// 参照可能な行数を表示(正常に実行できたら1)
print pg_num_rows( $rs ) . '件のデータがあります' . "\n";
// 1行ずつ読み込み
while( $row = pg_fetch_array( $rs ) )  {
  // 文字コード変換
  $title = mb_convert_encoding( $row[ 'title' ], 'SJIS', 'UTF-8' );
  // 追加されたデータを表示
  print $title . ' : ' . $row[ 'url' ] . "\n";
}

3.DBを切断

DBアクセスをすべて終了する時は,pg_closeによってそれまで接続していたDBを切断します。これ以降はDBアクセスを実行できません。

リスト5 DBを切断

// DBを切断
pg_close( $db );

上記1~3までを実行した結果,リスト6のように表示されれば,すべてが正常に実行できたことになります。

リスト6 1.~3.の実行結果

1件のデータを追加しました
1件のデータがあります
技術評論社 : http://www.gihyo.co.jp/

関数のおさらい

今回DB接続からDB切断までに用いた関数の一覧を表1に示します。PostgreSQLにアクセスする関数は,名称の先頭がすべてpg_であることがわかります。このように関数名は,どの種類のDBに対してアクセスを行うものなのかを知る手がかりになります。

関数の詳細は,PHPマニュアルなどを参照してください。

表1 今回用いた関数

pg_connectPostgreSQLのDBに接続する
pg_prepare 実行するSQLを準備する
pg_execute 準備したSQLを実行する
pg_affected_rows 処理が実行された行数を得る
pg_free_result 実行結果に関するデータを解放(クリア)する
pg_query SQLをすぐに実行する
pg_num_rows 参照可能な行数を得る
pg_fetch_array 1行ずつ参照する
pg_close 接続していたDBを切断する

著者プロフィール

沖林正紀(おきばやしまさのり)

SE/プログラマを経て,WebアプリケーションやXMLなどについて雑誌記事や書籍の執筆活動を始める。大手メーカで製品資料の作成や,セミナーの講師を担当したこともある。現在は,取材記事や製品レビューなどに執筆活動の幅を広げる一方,プログラミング教材の開発も手がけている。

著書