前提
この記事はIBM Cloudアカウントを、従量課金 (PAYG) へアップグレードした人を対象としています。
アップグレードにはクレジットカード情報の登録が必要です。
クレジットカード登録をしていない無料アカウントではMySQLを作成できないため。
対象ユーザー
IBM Cloud上でPHP+MySQLのアプリを動かしたい人。
概要
IBM Cloud上にPHP実行環境を作成して、MySQLに接続する。
MySQLにデータを入れ、Webブラウザに表示させる簡単なWebアプリを作成します。
IBM Cloudで使用できるMySQLには「Compose for MySQL」と「ClearDB Managed MySQL Database」の2種類あります。
今回は「ClearDB」を使用します。
PHPアプリの作成
-
任意のアプリ名を入力
今回は「MyPhpApp001」と入力しています。※アプリ名はIBMCloud上でユニークでないといけません。(他のユーザーが使用していた場合はエラーになり作成できません)
MySQLの作成
PHPアプリとMySQLを接続
ClearDBの情報を確認
IBM CloudではCloudFoundaryアプリケーションに、MySQLなどのサービスを接続(バインド)することにより、CloudFoundaryアプリケーション側では、次のような値が環境変数VCAP_SERVICESに設定されます。(一部、伏せ字にしています)
VCAP_SERVICESに「ClearDB」に接続するための情報が記述されています。
MySQLにデータを入れる
ローカルPCからMySQLへログイン
ターミナルから、以下のコマンドを入力する。
ユーザー名、ホスト名、パスワードはVCAP_SERVICESに記載の値を入力する。
$ mysql -u ユーザー名 -p --host ホスト名 --ssl-mode=REQUIRED
Enter password: パスワード
mysql>
データベースを表示
mysql> SHOW DATABASES;
+----------------------+
| Database |
+----------------------+
| information_schema |
| ibmx_xxxxxxxxxxxxxxx |
+----------------------+
VCAP_SERVICESのname欄と同じ名前のものがある
データベースの選択
mysql> USE ibmx_xxxxxxxxxxxxxxx;
サンプルのテーブルを作成
mysql> CREATE TABLE sample(id integer, name char(16), branch char(20), age integer);
サンプルデータを挿入
INSERT INTO sample (id, name, branch, age) VALUES ('1','Takasaki','Nagoya','29');
INSERT INTO sample (id, name, branch, age) VALUES ('2','Sawanobori','Nara','31');
INSERT INTO sample (id, name, branch, age) VALUES ('3','Sugimoto','Wakayama','34');
INSERT INTO sample (id, name, branch, age) VALUES ('4','Kitada','Osaka','25');
INSERT INTO sample (id, name, branch, age) VALUES ('5','Yamamoto','Fukuoka','38');
INSERT INTO sample (id, name, branch, age) VALUES ('6','Kadokawa','Tokyo','24');
テーブルの中身を表示
mysql> SELECT * FROM sample;
+------+------------+----------+------+
| id | name | branch | age |
+------+------------+----------+------+
| 1 | Takasaki | Nagoya | 29 |
| 2 | Sawanobori | Nara | 31 |
| 3 | Sugimoto | Wakayama | 34 |
| 4 | Kitada | Osaka | 25 |
| 5 | Yamamoto | Fukuoka | 38 |
| 6 | Kadokawa | Tokyo | 24 |
+------+------------+----------+------+
PHPファイルを作成
MySQLに入れたデータをPHPを使ってWebブラウザで表示させてみます。
Eclipse Orion Web IDEを起動
デプロイ設定
manifestファイル作成
- アプリのルート直下に「manifest.yml」というファイルを作成し、以下のように記載
---
applications:
- name: MyPhpApp001
memory: 64M
instances: 1
PHP拡張モジュール有効化
- アプリのルート直下に「.bp-config」というフォルダを作成
- 「.bp-config」フォルダ内に「options.json」というファイルを追加
- 「options.json」の内容を以下のように記載
{
"PHP_EXTENSIONS": ["bz2", "zlib", "openssl", "curl", "mcrypt", "mbstring", "pdo", "pdo_mysql", "mysqli"]
}
4.アプリのルート直下に「composer.json」というファイルを追加
5.「composer.json」の内容を以下のように記載(中括弧のみ)
{}
MySQL接続用ファイルの作成
アプリのルート直下にDB接続用のファイル「db.php」を作成する
<?php
if(!$_ENV["VCAP_SERVICES"]){ //local dev
$mysql_server_name = "127.0.0.1:8889";
$mysql_username = "username";
$mysql_password = "password";
$mysql_database = "database";
} else { //running in Bluemix
$vcap_services = json_decode($_ENV["VCAP_SERVICES"]);
if($vcap_services->{'mysql-5.5'}){ //if "mysql" db service is bound to this application
$db = $vcap_services->{'mysql-5.5'}[0]->credentials;
}
else if($vcap_services->{'cleardb'}){ //if cleardb mysql db service is bound to this application
$db = $vcap_services->{'cleardb'}[0]->credentials;
}
else {
echo "Error: No suitable MySQL database bound to the application. <br>";
die();
}
$mysql_database = $db->name;
$mysql_port=$db->port;
$mysql_server_name =$db->hostname . ':' . $db->port;
$mysql_username = $db->username;
$mysql_password = $db->password;
}
// 文字化け対策
$options = array(PDO::MYSQL_ATTR_INIT_COMMAND=>"SET CHARACTER SET 'utf8'");
// DBに接続
try {
$pdo = new PDO('mysql:host='.$mysql_server_name.';dbname='.$mysql_database, $mysql_username, $mysql_password, $options);
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
exit('データベース接続失敗。'.$e->getMessage());
}
?>
MySQLデータ表示用ファイルの作成
「index.php」の内容を以下のように記載
<?php
// bluemix接続の場合はhttpsへリダイレクト
if($_ENV["VCAP_SERVICES"]){
if (empty($_SERVER['HTTPS'])) {
header("Location: https://{$_SERVER['HTTP_HOST']}{$_SERVER['REQUEST_URI']}");
exit;
}
}
// XSS対策用エスケープ関数
function h($s) {
return htmlspecialchars($s, ENT_QUOTES, 'UTF-8');
}
// DB接続
require_once('db.php');
// データを取得
$sql = 'SELECT * FROM sample';
$rows = $pdo->query($sql)->fetchAll(PDO::FETCH_ASSOC);
?>
<!DOCTYPE html>
<html>
<head>
<title>てすと</title>
</head>
<body>
<table border="1">
<thead>
<tr>
<th>id</th>
<th>name</th>
<th>branch</th>
<th>age</th>
</tr>
</thead>
<tbody>
<tr>
<?php
foreach ($rows as $row) {
echo '<tr>';
echo '<td>'.h($row['id']).'</td>';
echo '<td>'.h($row['name']).'</td>';
echo '<td>'.h($row['branch']).'</td>';
echo '<td>'.h($row['age']).'</td>';
echo '</tr>';
}?>
</tr>
</tbody>
</table>
</body>
</html>
デプロイ
「▶」を押して、デプロイ
Webブラウザで表示
おわりに
今回は単純にMySQLのデータを表示するだけのアプリを作成しました。(アプリと言えるレベルではありませんが。。)
IBM CloudでPHPからMySQLへ接続する部分でお困りの方の手助けになれば幸いです。