質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.96%

HerokuでデプロイしたWebサイトのDBに接続できません…。

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 2,276

score 8

ローカル環境(MAMP)で制作した、PHPのポートフォリオサイトをHerokuでデプロイしたのですが、ブラウザ表示してからいざログインや会員登録をしようとすると以下のように「DBに接続できない」とエラーが出てしまいます

DB接続エラー:SQLSTATE[HY000] [2002] Connection refused

おそらくPHPのDB接続設定を変更する工程で何かまちがっているのだと思いますが、何をどのようにまちがっているのかが分かりません…。

Heroku(PHP+MySQL)でWebサービス公開手順

上記のサイトを参考に作業したのですが、「local用から本番用に書き換える必要があります。」と書かれていたので、「dbconnect.php」ファイルに以下のソースを追記しました。

function dbConnect(){
  $db = parse_url($_SERVER['CLEARDB_DATABASE_URL']);
  $db['dbname'] = ltrim($db['path'], '/');
  $dsn = "mysql:host={$db['host']};dbname={$db['dbname']};charset=utf8";
  $user = $db['user'];
  $password = $db['pass'];
  $options = array(
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
    PDO::MYSQL_ATTR_USE_BUFFERED_QUERY =>true,
  );
  $dbh = new PDO($dsn,$user,$password,$options);
  return $dbh;
}

追記したことで、現状最終的なソースコードは以下のようになっています。

<?php
//例外処理
try{
    $db=new PDO('mysql:dbname=*********;host=127.0.0.1;port=8889;charset=utf8','root','root');
}catch(PDOException $e){
    print('DB接続エラー:'.$e->getMessage());
}


function dbConnect(){
  $db = parse_url($_SERVER['CLEARDB_DATABASE_URL']);
  $db['dbname'] = ltrim($db['path'], '/');
  $dsn = "mysql:host={$db['host']};dbname={$db['dbname']};charset=utf8";
  $user = $db['user'];
  $password = $db['pass'];
  $options = array(
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
    PDO::MYSQL_ATTR_USE_BUFFERED_QUERY =>true,
  );
  $dbh = new PDO($dsn,$user,$password,$options);
  return $dbh;
}

Herokuでデプロイして、きちんとブラウザにサイトが表示されたことも確認した上で、「Workbench」でDBの中身を確認すると、phpMyAdminからインポートしたDB情報もきちんと反映されていたので、DBに問題はないと思います。

なので正常に機能しているDBに接続できないのは、この「PHPのDB接続設定を変更する工程」で誤りがあるということでしょうか…。

かなり調べ込んだのですが、なかなか自分と同じようなシチュエーションのものがなく、参考にできるものを見つけられなかったため、アドバイスいただけると幸いです。


作業環境
・ローカル環境(MySQL,phpMyAdmin,MAMP)
・Mac.OS
・PHP(ver7.3)
・Heroku(ClearDB,Workbench)


【試したこと】

▼以下のサイトを参照しながら作業しました。
Heroku(PHP+MySQL)でWebサービス公開手順

先述の通り、私自身は⑥番の「PHPのDB接続設定を変更する」作業で何かまちがっているのではないかと考えています
①〜⑤までの工程は問題なく進められましたが、前後関係や私が行なった作業の流れを整理するためにも、作業工程を掲示しておきます。

① ターミナルで、作製したポートフォリオサイトのフォルダ一式に移動してherokuにログイン。

#コードを書いたディレクトリに移動
$ cd Desktop/〇〇

#herokuへログインするためのコマンド
$ heroku login

#メールアドレスを入力し、エンターキーを押す
  => Enter your Heroku credentials.
  => Email: 

#パスワードを入力して、エンターを押す
  => Password: 

② Gitリポジトリ作成

#ローカルレポジトリを作成 初回だけ
$ git init

#herokuにアプリを作成
$ heroku create アプリ名

③ ClearDBアドオンをインストール

$ heroku addons:add cleardb

④ Workbenchで新しく接続

$ heroku config | grep CLEARDB_DATABASE_URL


heroku configコマンドでCLEARDB_DATABASE_URLを確認して、
CLEARDB_DATABASE_URL: mysql://ユーザ名:パスワード@サーバ名/データベース?reconnect=true」の情報を元に、該当箇所を入力して新しく接続。

!![イメージ説明]

⑤ phpMyAdminからDBエクスポート→WorkbenchにDBインポート

今回作ったポートフォリオサイトで使っているDBを、ファイル形式でエクスポート。
「localhost.sql」というファイル名で保存された。

そして保存された「localhost.sql」をWorkbenchに、以下の通りにしたがってインポートしました。

先ほど新たに接続したものに接続してAdministraionタブからData Import/Restore→Import from Self-Contained Fileにチェックを入れてphpMyAdminからエクスポートしたsqlファイルを選択します。
Default Target Schemaを指定します。newの方ではなくてセレクトメニューでデフォルトのものを指定します。
なぜかフリーズしたように?選択できないときがありますが、謎です。
最後にStart Importをクリックします。

⑥ PHPのDB接続設定を変更する

今のところ、エラー原因として最も怪しいと思われる箇所

デプロイも正常にされてサイトもブラウザにきちんと表示されるのに、DBへの接続ができず、ログインや会員登録、投稿機能などのPHP機能が一切使えない状況なので、アドバイスいただけると幸いです…。

これ以降のGitへのコミットやプッシュ、ブラウザ表示は問題なく行われました。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

CLEARDB_DATABASE_URLを利用して接続するのが本番用なので

function dbConnect(){
  $db = parse_url($_SERVER['CLEARDB_DATABASE_URL']);
  $db['dbname'] = ltrim($db['path'], '/');
  $dsn = "mysql:host={$db['host']};dbname={$db['dbname']};charset=utf8";
  $user = $db['user'];
  $password = $db['pass'];
  $options = array(
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
    PDO::MYSQL_ATTR_USE_BUFFERED_QUERY =>true,
  );
  $dbh = new PDO($dsn,$user,$password,$options);
  return $dbh;
}


で良いのでは(local用から本番用に書き換える必要があります・・・って言うことで書き換えたソースが書かれてるだけのような)

※ローカル環境での接続関数をどうしてるのかのソースが記載されてないのでわかりませんが、本番環境ではこの関数の戻り値(PDOクラス)を利用しましょうってことだと思います

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/12/04 15:05

    アドバイスしていただきありがとうございます!

    アドバイスを受けて、
    'dbname'や'host'、'user'、'pass'の部分を、自分の「CLEARDB_DATABASE_URL」のデータに当てはめて書き換えずに、そのまま使ってしまっていたことに気づきました。
    (書類記入見本の山田太郎をそのまま自分の名前欄に書いているような感じ…)

    ただ、Herokuで用意された環境変数を読み込んでいるとされる「$db = parse_url($_SERVER['CLEARDB_DATABASE_URL']);」の「CLEARDB_DATABASE_URL」には何を当てはめて書き換えたらいいのか分からないので、教えていただけると幸いです。

    キャンセル

  • 2019/12/04 17:13

    そのままでいいはずです(HerokuサーバーにCLEARDB_DATABASE_URLっていう環境変数があるはず)

    キャンセル

  • 2019/12/04 17:20

    一応ですが、参照URLのやつは本番環境に関することなので、
    ===
    'dbname'や'host'、'user'、'pass'の部分を、自分の「CLEARDB_DATABASE_URL」のデータに当てはめて書き換えずに、そのまま使ってしまっていたことに気づきました。
    ===
    っていうのはDBを本番環境使ってるって言うことと代わりないと思いますよ(なのでheroku configでみた情報を記載しても問題はない)

    キャンセル

  • 2019/12/04 18:30 編集

    そうだったんですね!
    情報記載の範囲に悩んでいたので、教えていただき助かりました!

    アドバイスしていただいたおかげで、今回質問した範囲での問題は解消することができたのですが、新たに自力で解決できないエラーが出てきてしまったので、それは別途新たに質問させていただくことにします。

    丁寧にアドバイスしていただき本当にありがとうございました!

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.96%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る