MySQLiではなくPDOを使う場合
Heroku Dev Centerでは、PHPでMySQLを使う場合の例として、MySQLiで接続するサンプルコードが記載されています。
<?php
$url = parse_url(getenv("CLEARDB_DATABASE_URL"));
$server = $url["host"];
$username = $url["user"];
$password = $url["pass"];
$db = substr($url["path"], 1);
$conn = new mysqli($server, $username, $password, $db);
?>
これに対し、MySQLiではなくPDOを使う場合のサンプルコードを以下に記載します。
<?php
$url = parse_url(getenv("CLEARDB_DATABASE_URL"));
$server = $url["host"];
$username = $url["user"];
$password = $url["pass"];
$db = substr($url["path"], 1);
$pdo = new PDO(
'mysql:host=' . $server . ';dbname=' . $db . ';charset=utf8mb4',
$username,
$password,
[
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true,
]
?>
【おまけ】ローカルの開発環境とHeroku環境で接続先のDBを切り分ける
ローカルの開発環境でのみ、下記のPHPファイルと同じディレクトリにisDevelopment.txt
(中身は空で良いです)を配置することで、
- Heroku環境ではHeroku上のMySQLに
- 開発環境では開発環境のMySQLに
接続するようにしています。
function new_pdo(){
$filename = './isDevelopment.txt';
if (!file_exists($filename)){
//For Heroku
$url = parse_url(getenv('CLEARDB_DATABASE_URL'));
$server = $url["host"];
$username = $url["user"];
$password = $url["pass"];
$db = substr($url["path"], 1);
$pdo = new PDO(
'mysql:host=' . $server . ';dbname=' . $db . ';charset=utf8mb4',
$username,
$password,
[
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true,
]
);
return $pdo;
}else{
//For development
$pdo = new PDO(
'mysql:localhost;dbname=testdb;charset=utf8mb4',
'root',
'root',
[
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true,
]
);
return $pdo;
}
}
なお、.gitignore
には/isDevelopment.txt
と記述して、isDevelopment.txt
がHerokuにデプロイされないようにしておきます。