Herokuで自分のサイトを公開する方法　　〜DBとの接続、GitHubからdeployまで〜

自分で作ったサイトを簡単に公開できる、Herokuの導入方法について紹介します。

##Herokuとは？？
Heroku(ヘロク)は大まかに説明すると、PHPやPythonなどのプログラミング言語を用いて開発したWebアプリ、WebサービスなどをWeb上で簡単に公開できるというサービスです。今回はPHPで作ったサイトを公開することをメインに説明していきます。


##事前準備
まずは、進めていくに当たってこの準備が必要になります。
まだの方のために隣にリンク貼っときます！

- Herokuのアカウント作成　　　　 https://jp.heroku.com/
- GitHubのアカウント作成　　　　 https://github.com/
- Sourcetreeのインストール 　　　https://www.sourcetreeapp.com/
- homebrewのインストール　　　　https://brew.sh/index_ja

##heroku CLI(旧Heroku toolbelt)のインストール
[こちら](https://devcenter.heroku.com/articles/heroku-cli)からheroku CLIをインストールできます。
Heroku CLIとは、Herokuをコマンドで操作するためのツールになります！

https://devcenter.heroku.com/articles/heroku-cli
 
今回はターミナルからインストールしていきます。
以下のコードを入力してインストールします。

```
$brew tap heroku/brew && brew install heroku
```

インストールが無事終了したら、

```
＄heroku login
```

を入力するとherokuのサイトにとんでログインできます。

##HerokuからCreate a new appを作成

ログインしたら、SourcetreeでローカルのフォルダからGitHubへpushした自分のWebサイトを用意しておきましょう！
SourcetreeはローカルのファイルをGitHubへpushするために必要になるのですがここではその説明は省きます。

https://dashboard.heroku.com/apps
このURLをクリックすると、このような画面になると思います。
<img width="1440" alt="スクリーンショット 2019-12-05 18.16.22.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529982/3a6717f0-3e3a-4493-1bd2-ccda9bc2dc89.png">

ここのCreate new appをクリック。

<img width="1042" alt="スクリーンショット 2019-12-05 18.30.23.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529982/ff776d37-92e3-9ec9-2817-816499608803.png">

するとこのような画面になると思います。App nameに入力した内容はアクセスする際のURLの一部分になります。
例えば、App nameに`hoge`と入力すると、URLは`https://hoge.herokuapp.com`となります。

regionはそのまま「United States」でオッケーです。

##GitHubからdeploy
Herokuでアプリを作成したら、「Deploy」をクリックして、Deployment methodからGitHubを選択。

<img width="1428" alt="スクリーンショット 2019-12-05 18.46.25.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529982/5531ff86-dec7-a511-6119-d13f8a3a0011.png">
ここで、選択する際に「Connect to GitHub」というボタンが表示されるので、それをクリックして
Herokuと自分のGitHubを紐付けましょう。
次に、Connect to GitHubのところに検索欄があるので、そこに自分のGitHubの公開させたいリポジトリを検索して「connect」ボタンをクリックします。

うまくいったら、画面下に行くとこのような画面があるはずです。
<img width="1396" alt="スクリーンショット 2019-12-05 18.54.28.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529982/91a425da-e270-dcd1-5669-2b00965c062d.png">

「Automatic deploys」は自動でdeployする場合、
「Manual deploy」は手動でdeployする場合にそれぞれ用います。

どちらの方法でdeployするか選択したら、「Enable Automatic Deploys」または「Deploy Branch」をクリック。

これでGitHubからのdeployは完了です！！
ちゃんと公開されてるか確認したい場合は先ほど作成したURLをブラウザで入力すると確認できます。
ここまでが公開までの手順です！

##Heroku Add-onsからClearDB MySQLをインストール
続いて、HerokuにDBを接続していきます。Resourcesをクリック。
<img width="1328" alt="スクリーンショット 2019-12-05 19.14.23.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529982/d3b61878-7012-3e71-1220-35eb66340c41.png">
Find more add-onsボタンをクリック

すると別のサイトにとぶので、そこから「ClearDB MySQL」を見つけてクリック。
<img width="265" alt="スクリーンショット 2019-12-05 19.16.17.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529982/f483b04d-03b8-0319-d1fa-88e8fe1ba637.png">

クリックして「ClearDB MySQL」のページに入ったら「Install ClearDB MySQL」ボタンをクリックします。
注意 : ここでクレカ登録をする必要があります。

<img width="1000" alt="スクリーンショット 2019-12-06 9.06.45.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529982/8521116e-7929-0d28-2a85-0f07f419a863.png">
クリックするとこんな画面にいくかと思います。
「Add-on plan」はDBの容量になります。Free(無料)だと5MBになります。もっとDBの容量を増やしたいよ、という方は月間でそれぞれの容量に応じた金額を支払う必要があります。
「App to provision to」にはHerokuの「create　a new app」であらかじめ作成しておいたアプリの名前を入力します。名前を入力するとこんな感じで「Provision add-on」のボタンが押せるようになるかと思います。
<img width="987" alt="スクリーンショット 2019-12-06 8.30.22.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529982/e857f743-d288-cd58-064e-171fb3045aef.png">
「Provision add-on」をクリック。

無事インストールが終わったら、Resourcesのところに「ClearDB MySQL」が追加されてることを確認します。

<img width="1288" alt="スクリーンショット 2019-12-05 19.19.50.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529982/2a641e63-f596-5c6b-c365-98be88832c6a.png">

##Sequel Proのインストール
DBの操作するために、Sequel Proをダウンロードします。
こちらからダウンロードできます。
https://www.sequelpro.com/

インストールしてアプリを開くと、こんな画面が表示されると思います。
<img width="591" alt="スクリーンショット 2019-12-05 19.30.19.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529982/82bb438b-d9bb-4258-0516-961217b4c038.png">
ここに入力する内容は先ほど追加した「ClearDB MySQL」で取得されるデータを入力します。
一度Herokuの自分のアプリ編集画面に戻って、
Settingsの「Config Vars」から確認できると思います。

CLEARDB_DATABASE_URLの値から取得できます。読み方はこんな感じです。
`mysql://(--username--):(--password--)@(--hostname--)/(--dbname--)?reconnect=true`

ここに該当する内容をさっきの画面に入力します。

Sequel Proのデータベースと、ポートには何も入力しなくて大丈夫です。
一度「接続をテスト」ボタンを押して接続を確認してみてください。

入力後、接続できたらオッケーです。サイトで使用するテーブルを作成しておいてください。

これでSequel Proとの接続は完了です！

##WebサイトをDBとつなげるためのファイルを作成する
WebサイトとDBをつなげるためのファイルを作成しましょう。
作成したらこのように入力しましょう

```
<?php

$host = getenv('ホストネームの値'); //MySQLがインストールされてるコンピュータ
$dbname = getenv('DBネームの値'); //使用するDB
$charset = "utf8"; //文字コード
$user = getenv('ユーザーネームの値'); //MySQLにログインするユーザー名
$password = getenv('パスワード'); //ユーザーのパスワード

$options = [
    PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION, //SQLでエラーが表示された場合、画面にエラーが出力される
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, //DBから取得したデータを連想配列の形式で取得する
    PDO::ATTR_EMULATE_PREPARES   => false, //SQLインジェクション対策
];

//DBへの接続設定
$dsn = "mysql:host=$host;dbname=$dbname;charset=$charset";
try {
    //DBへ接続
    $dbh = new PDO($dsn, $user, $password, $options);
} catch (\PDOException $e) {
    throw new \PDOException($e->getMessage(), (int) $e->getCode());
}

```

上記5行が先ほどSequel Proに入力した内容です。入力した内容をダイレクトに打ち込んでもうまく行くのですが、GitHubなどで公開されるため、そのまま入力するのはまずいです。

そのため、PHPの定義済み変数の環境変数を使用します。
`getenv('')`の`''`の部分に値を代入しています。

では、この環境変数はどこで定義するのかについて説明します。

Herokuのページに戻ってSettingsの「Config Vars」のところを開きます。
するとこのような欄があるかと思います。
<img width="822" alt="スクリーンショット 2019-12-05 19.57.26.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529982/6a76c3f2-8812-5db2-9302-acc6527d6093.png">
ここの「KEY」に定義する環境変数、
「VALUE」に実際の値を入力します。

「KEY」で入力した値を先ほどのファイルに入力することで「KEY」に対応した「VALUE」が読み込まれるという仕組みになってます！

入力が終わったらDBと接続したいPHPファイルに`require_once('DBを接続するファイル名.php');`
を入力してください。入力例はこんな感じです。ここでは、WebサイトをDBとつなげるためのファイル名を`dbconnect.php`
としています。

```
<?php

require_once('dbconnect.php');

//DBと紐付ける値
$A = $_POST['a'];
$B = $_POST['b'];
$C = $_POST['c'];

//DBのテーブルに上記の変数を代入する設定
$stmt = $dbh->prepare('INSERT INTO テーブル名 (カラムA, カラムB, カラムC) VALUES (?, ?, ?)');

//(?, ?, ?)に入る値の定義
$stmt->execute([$A, $B, $C]);
?>
```

これでWebサイトとDBをつなげることができるかと思います。
これでDBとの接続も完了です！


以上がHerokuで自分のサイトを公開する方法です。

わからないこと、不明な点があればコメントをお願いします。