PHPのPostgreSQLへ接続してselectするサンプルです。
(確認環境:PHP 7.2.8,PostgreSQL 11.2,XAMPP 7.2.8,Windows 10)
目次
SQLの実行 | PostgreSQLへ接続してselectする |
プレースホルダ | |
htmlspecialchars関数 | |
PDO::FETCH_ASSOC | |
例外発生時 | |
環境 | php.iniの設定 |
接続先のデータベースとテーブル |
PostgreSQLへ接続してselectする
PostgreSQLへ接続してselectするサンプルです。
<?php
// DB接続情報
$dsn = 'pgsql:host=localhost;dbname=testdb10';
$username = 'postgres';
$password = 'test1';
$id = 2; //プレースホルダの値を指定
// try-catch
try{
// データベースへの接続を表すPDOインスタンスを生成
$pdo = new PDO($dsn,$username,$password);
// SQL文 :idは、名前付きプレースホルダ
$sql = "select * from employee where id = :id";
// プリペアドステートメントを作成
$stmt = $pdo->prepare($sql);
// プレースホルダと変数をバインド
$stmt -> bindParam(":id",$id);
$stmt -> execute();
// データを取得
$rec = $stmt->fetch(PDO::FETCH_ASSOC);
// 接続を閉じる
//$pdo = null; スクリプト終了時に自動で切断されるので不要
}catch (PDOException $e) {
// UTF8に文字エンコーディングを変換します
exit(mb_convert_encoding($e->getMessage(),'UTF-8','SJIS-win'));
}
function escape1($str)
{
return htmlspecialchars($str,ENT_QUOTES,'UTF-8');
}
?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>select</title>
</head>
<body >
<?php foreach ($rec as $a):?>
<?=escape1($a)?>
<?php endforeach; ?>
</body>
</html>
15行目は、名前付きプレースホルダを使用したSQLです。(:名称)の箇所が名前付きプレースホルダです。
21行目は、7行目の変数を15行目のプレースホルダにバインドしています。
プレースホルダ
- SQLにある(:名称)は、名前付きプレースホルダです。
→疑問符(?)のプレースホルダのやり方もあります。 - 動的に値をセットできます。
- 入力される不正な文字を抑止できるのでSQLインジェクション対策になります。
- 固定文字列のSQLの部分がプリコンパイルされるので実行速度が上がります。
- place=場所、holder=入れものです。
htmlspecialchars関数
- HTMLの特殊文字をエスケープします。
- HTMLに出力する時に使用します。
- 以下は、PHPマニュアルのhtmlspecialchars関数のリンクです。
http://php.net/manual/ja/function.htmlspecialchars.php
PDO::FETCH_ASSOC
- 連想配列を返します。
- 以下はPHPマニュアルのPDOStatement::fetchのリンクです。
http://php.net/manual/ja/pdostatement.fetch.php
例外発生時
PostgreSQLを起動せずに上記コードを実施した場合は、29行目のcatchのロジックが実行され、以下のエラーメッセージが表示されます。
SQLSTATE[HY000] [2002] 対象のコンピューターによって拒否されたため、接続できませんでした。 |
try-catchを記述しなかった場合は、以下のエラーメッセージが表示されます。
Fatal error: in D:\xampp\htdocs\testPHP\index.php on line 17 |
以下はPHPマニュアルのmb_convert_encodingのリンクです。
http://php.net/manual/ja/function.mb-convert-encoding.php
php.iniの設定
上記コードを動かすためには、php.iniの;extension=pdo_pgsqlのコメントのセミコロン(;)を削除します。ドライバの設定をしていない場合「could not find driver」と画面に表示されます。
;extension=odbc
;extension=openssl
;extension=pdo_firebird
extension=pdo_mysql
;extension=pdo_oci
;extension=pdo_odbc
extension=pdo_pgsql
extension=pdo_sqlite
;extension=pgsql
;extension=shmop
接続先のデータベースとテーブル
PostgreSQLのインストール方法と、データベースとテーブルを作成する方法は以下を参照願います。
PostgreSQLをインストールする手順(Windows)
PostgreSQL pgAdmin 4の使い方(起動からデータ参照)
関連の記事
PHP PostgreSQLでinsert/update/deleteするサンプル
PostgreSQL psqlを使用するサンプル(Windows)