データベース
ここではPHPとPostgreSQLの連携について説明します。 PHPからデータベースに接続して、データベース内の情報を取得してみましょう。
前章で作成したproductsテーブルから、 product_name列の値を検索条件として特定の情報を取得させます。 下記の表ではpostgresql_view.phpというファイルに POST属性で検索に利用するデータを渡しています。 フォームの扱い方についてはこちらをご参照ください。
<html> <head><title>postgresql_search.html</title></head> <body> 検索条件を入力してみましょう。 <form action="postgresql_view.php" method="post"> <table border="1"> <tr> <td>製品名</td> <td><input type="text" name="product_name"></td> <td colspan="2" align="center"> <input type="submit" value="検索"></td> </tr> </table> </body> </html>
次に、データベースへの接続、php_form.htmlのフォームから渡されたデータを利用して データベースのデータ検索を行います。 ここでは、検索結果のヒット件数と、ヒットした行のproduct_no、product_name、priceの情報を出力します。
<html> <head><title>postgresql_view.php</title></head> <body> <?php // PostgreSQL 接続をオープンする $dbconn = pg_connect("port=5432 user=postgres password=postgres dbname=postgres"); // SQL文の作成 $sql = "SELECT product_no, product_name, price FROM products WHERE product_name = $1"; // SQLとパラメータを分割して実行 $result = pg_query_params($dbconn, $sql, array($_POST['product_name'])); // SQL実行結果の行数を返す $cnt = pg_numrows($result); print("$cnt 件ヒットしました。<br />"); for ($i = 0; $i < $cnt; $i++) { // 実行結果のi行目の行情報を取り出す $row = pg_fetch_row($result, $i); print("product_no:$row[0] product_name:$row[1] price:$row[2]"); } // PostgreSQL 接続をクローズする pg_close($dbconn); ?> </body> </html>
ここで利用している各関数について以下に説明します。
PHPからPostgreSQLに接続するには「pg_connect」関数を利用します。
resource pg_connect ( データベース接続文字列 )
pg_connect関数では、引数にデータベース接続情報を指定します。 接続情報は「キーワード=値」の形式で設定します。 今回は、ホスト名が「localhost」、ポート番号が「5432」、 データベース名が「postgresql」、ユーザ名が「postgresql」 ですので以下のように設定します。 パスワードはPostgreSQLをインストールしたときに設定した パスワードを指定してください(ここでは仮にpostgresと入れてます)。 接続に成功した場合に PostgreSQLの接続リソース、失敗した場合に FALSE を返します。
pg_connect("host=localhost port=5432 dbname=postgres user=postgres password=postgres");
SQLを実行するには「pg_query」または「pg_query_params」を利用します。
resource pg_query (PostgreSQLの接続リソース, SQL文 )
pg_query関数は第1引数にpg_connect関数の戻り値を、 第2引数に実行するSQL文を指定します。 SQLの実行に成功した場合はクエリ結果リソース、失敗した場合はFALSEを返します。
resource pg_query_params (PostgreSQLの接続リソース, SQL文 , 置換文字の配列 )
pg_query_params関数はSQL文に可変の文字列を渡すことができます。 第1引数にpg_connect関数の戻り値を、 第2引数に実行するSQL文を、第3引数に置換する文字列を指定します。 SQLの実行に成功した場合はクエリ結果リソース、失敗した場合はFALSEを返します。 置換文字を使用方法は、SQL文内の置換した個所に「$1、$2、・・・」と順番に記載して、 置換文字の配列に指定した順番に実際の値を指定します。
ここではpg_query_params関数を利用します。 まずSQL文を作成します。 以下のSQL文の意味はproductsテーブルから、product_nameが$1と等しい条件の行を取得します。 SQL文はpg_query_paramsの第2引数に指定し、$1にあたる情報を第3引数として配列で渡します。 出力フォームからnameという名前で送信されているので スーパーグローバル変数である$_POSTを使って $_POST['name']を指定しています。
$sql = "SELECT product_no, product_name, price FROM products WHERE product_name = $1"; $result = pg_query_params($dbconn, $sql, array($_POST['product_name']));
pg_num_rows関数を利用してSQLを実行した結果の件数を取得します。 引数にpg_query_paramsu関数の戻り値を指定します。
int pg_num_rows ( SQL実行結果 )
ここでは、以下のように指定します。
$cnt = pg_numrows($result);
pg_fetch_row関数を利用してSQL実行結果の行情報を取得します。 第1引数にpg_query_paramsu関数の戻り値を、 第2引数に取得する行番号を指定します。 行番号は0から順番に指定していきます。 戻り値は各列の値を格納した配列を返します。
array pg_fetch_row ( SQL実行結果, 取得する行番号 )
ここでは、以下のように指定します。 for文で実行結果の件数文だけ行情報を取得していきます。 そして、戻りの配列を$row変数に入れます。
$row = pg_fetch_row($result, $i);
今回はSQLのSELECT句に"SELECT product_no, product_name, price"の3つの列を指定したので、 $row[0]にはproduct_no、$row[1]にはproduct_name、$row[2]にはpriceの情報が入ります。
print("product_no:$row[0] product_name:$row[1] price:$row[2]");
最後にpg_close関数を利用してデータベースの接続を閉じます。
bool pg_close ( PostgreSQLの接続リソース )
ここでは以下のように指定します。
pg_close($dbconn);