PHP5からPostgresql9へ接続する | PCマニアときどきアウトドア

PCマニアときどきアウトドア

忘れっぽいので備忘録として記録することにしました

 PHP歴はめちゃくちゃ浅い(6ヶ月くらい?)ですが、「最初にこれがわかってれば効率が良かったな~」と思った部分をメモ。

 pg_connectとかpg_queryとかあるけど、
DBへの接続はPDOを使うのが一番
です。

 PDOならデータベースがMySQLだろうとPostgresqlだろうと設定が変わるだけで使う関数は同じ、何より使ってみるとわかりますが、コードを書く量や修正時の量が少なくて済みます。また、pg_queryだとプレースホルダが使えない場合(本当は使えるのかも知れないけど、回避策が思いつかなかった)があったので、PDOならそこらへんも心配無用。

 自分なりの使い方は、
ユーザー入力された値($POST_['value'])はPDO::bindparamで置換する(プレースホルダにバインド)。SQL文はPDO::queryするんじゃなくて、PDO::prepareで文を準備してからexecuteで発行する(プリペアドステートメント)。

PHPマニュアル(PDOstatement::execute)

 データベースのユーザー名、パスワードは公開するファイルに直書きするのも心配なので、別ファイルにしてrequireする。この別ファイルを、公開範囲外のディレクトリ(/etcとか)や、公開ディレクトリでもhtaccessでアクセス制限(自分が2度とアクセスできなくならないよう注意)して設置すればセキュリティ上も安心です。

コード例
// 接続先、ユーザー、パスワードの設定
// ./conf/dbconf.phpで保存しているとする
// 3つまとめて一つの文字列変数にしたら、インスタンス生成がうまくできない
// (インスタンス生成時の引数は3つ必要)
$conn_db = 'pgsql:dbname=mydb;host=127.0.0.1;port=5432';
$conn_user = 'user_name';
$conn_pass = 'password';

// SQLを実行する側のファイル
reqire './conf/dbconf.php';    ←PDOインスタンス生成直前に呼び出し
$pdo = new pdo($conn_db, $conn_user, $conn_pass);
$qstr = "
          SELECT
               name_field,
               my_field1,
               my_field2
          FROM
               myTable
          WHERE
               name_field
          LIKE
               :name
          ORDER BY
               name_field;";

$stmt = $pdo->prepare($qstr);    ←SQL文の準備
$name = '%'.$poststr.'%';
 ←変数にPOSTされた文字列を代入(代入前にサニタイズ、バリデートを適宜行う)
    部分一致検索の'%'はSQL文中ではなく変数中に書く
$stmt->bindParam(':name', $name);
 ←SQL文中のプレースホルダ(:name)に変数nameをバインド
$stmt->execute(); ←クエリ実行
$rows = $stmt->rowCount();
 ←結果行をカウント(その後のループ処理で必要になる場合が多い)


 セキュリティも含め以下のサイトが非常に参考になります。
PHPでデータベースに接続するときのまとめ

 最後にPDOからは外れますが、データを入力送信するタイプのサイトを公開すると、色々なIPから暗号のような長文をPOSTしてくる輩(PHP脆弱性攻撃)がいますので、Cookieのセッションやリファラなどの文字列IDを使って意図したページからのみのPOSTを受け付けるようにします(CSRF対策)。それはまた別の記事で・・・