LoginSignup
2
1

More than 5 years have passed since last update.

BluemixのPHPからMySQL,PostgreSQLにアクセスするサンプルコード

Last updated at Posted at 2017-07-25

Bluemix上で PHPとデータベースを接続するサンプルコードです。

Bluemix のカタログから、DBaaSのサービスを作成した場合、CFやDockerのコンテナ上のアプリへ、環境変数としてDBサービスの接続情報が提供されます。アプリは環境変数を読み込んで、接続先のホストDNS名、TCPポート番号、認証情報を取得して、データベース・サービスへ接続する必要があります。 この与えられた環境変数を取得してパースするのが、cfenv.php モジュールの Cfenv クラスの役割です。

Bluemix のデータベース・サービスとPHP実行環境は、同じBluemix Infrastructure (旧SoftLayer)上に構築されているのですが、接続はインターネット経由になります。 このことから、暗号通信を必須と考えています。

これら3パターンのスニペットは、この様な実行環境で動作するもので、サンプルアプリの全体は、GitHub https://github.com/takara9/php_sample_apl にそれぞれブランチとして登録してあり、デプロイの手順も解説しています。

ClearDB MySQLのケース

Bluemixカタログ:ClearDB Managed MySQL Database
バージョン:PHP 7.1.x
リポジトリ:GitHub https://github.com/takara9/php_sample_apl/blob/clearDb/htdocs/contents1.php
参考資料: (1)
コメント: MySQLのデータベース名は、ClearDBより付与された名前で利用しなければなりません。 この名前はサービス資格情報としてVCAP_SERVICES環境変数によって、ランタイムへ提供されます。 暗号通信に必要な証明書は、Bluemix から起動できるClearDBの管理画面からダウンロードできます。そして、コマンドラインからの接続方法も案内があります。

<?php

// Bluemix プラットフォームからのサービス資格情報の取得
include "cfenv.php";
$vcap = new Cfenv();
$vcap->byServiceName("cleardb");

// DSN と 暗号通信設定
$dsn = 'mysql:host='.$vcap->host.";port=".$vcap->port.";dbname=".$vcap->dbname;
$ops = array(
    PDO::MYSQL_ATTR_SSL_CA => __DIR__ ."/". $vcap->ca_pem_filename,
    PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT => false
);

// MySQLへPDOで接続
$dbh = new PDO($dsn, $vcap->user, $vcap->pass, $ops);

// アプリSQL
foreach($dbh->query('SELECT id, name FROM animals') as $row) {
    print "<tr>";
    print "<td align=\"center\">".$row['id']."</td>";
    print "<td>".$row['name']."</td>";
    print "</tr>";
}
$dbh = null;
?>

Compose MySQLのケース

Bluemixカタログ:Compose for MySQL
バージョン:PHP 7.1.x
リポジトリ:GitHub https://github.com/takara9/php_sample_apl/blob/mysql/htdocs/contents1.php

参考資料: (2)
コメント:ClearDBと異なる点として、Compose MySQLでは、データベースの作成や削除は自由にできます。 暗号通信に必要な証明書は、VCAP_SERVICE環境変数にBase64のエンコード形式で提供されます。 これをPEMに変更するのは、Cfenvクラスの中で実行します。

<?php

// Bluemix プラットフォームからのサービス資格情報の取得
include "cfenv.php";
$vcap = new Cfenv();
$vcap->byServiceName("compose-for-mysql");

// DSN と 暗号通信設定
$dsn = 'mysql:host='.$vcap->host.";port=".$vcap->port.";dbname=testdb";
$ops = array(
    PDO::MYSQL_ATTR_SSL_CA => __DIR__ ."/". $vcap->ca_pem_filename,
    PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT => false
);

// MySQLへPDOで接続
$dbh = new PDO($dsn, $vcap->user, $vcap->pass, $ops);

// アプリSQL
foreach($dbh->query('SELECT id, name FROM animals') as $row) {
    print "<tr>";
    print "<td align=\"center\">".$row['id']."</td>";
    print "<td>".$row['name']."</td>";
    print "</tr>";
}
$dbh = null;
?>

Compose PostgreSQLのケース

Bluemixカタログ:Compose for PostgreSQL
バージョン: PHP 5.6.x 〜
リポジトリ:https://github.com/takara9/php_sample_apl/blob/pgsql/htdocs/contents1.php
参考資料: (3)
コメント: 日本ではMySQLとシェアを2分するPostgreSQLも利用可能です。暗号通信はsslmodeを設定するだけで利用できます。

<?php

// Bluemix プラットフォームからのサービス資格情報の取得
include "cfenv.php";
$vcap = new Cfenv();
$vcap->byServiceName('compose-for-postgresql');

// DSN と 暗号通信設定
$dsn = "pgsql:host=".$vcap->host.";port=".$vcap->port.";dbname=".$vcap->dbname.";user=".$vcap->user.";password=".$vcap->pass.";sslmode=require";

// MySQLへPDOで接続
$dbh = new PDO($dsn);

// アプリSQL
foreach($dbh->query('SELECT id, name FROM animals') as $row) {
    print "<tr>";
    print "<td align=\"center\">".$row['id']."</td>";
    print "<td>".$row['name']."</td>";
    print "</tr>";
}
$dbh = null;
?>

参考資料

(1) CLEARDB Connecting to ClearDB using SSL Encryption https://www.cleardb.com/developers/ssl_connections
(2) COMPOSE Hosted PostgreSQL https://www.compose.com/databases/postgresql
(3) COMPOSE Hosted MySQL https://www.compose.com/databases/mysql

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1