Help us understand the problem. What is going on with this article?

Heroku上のPHPからPDOでMySQL(ClearDB)に接続する

More than 1 year has passed since last update.

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にデプロイされないようにしておきます。

参考

shonansurvivors
SRE/DevOps/AWS勉強中 | JAWS-UG初心者支部運営メンバー
https://zenn.dev/shonansurvivors
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away