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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Heroku

HerokuはHeroku社が開発と運営を行っているPaaSの名称です。RubyやNode.js、Python、そしてJVMベース(Java、Scala、Clojureなど)の複数のプログラミング言語をサポートしている。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

2回答

2715閲覧

ローカルから本番環境にデータベース接続を変更したい

ranerane0101

総合スコア70

Heroku

HerokuはHeroku社が開発と運営を行っているPaaSの名称です。RubyやNode.js、Python、そしてJVMベース(Java、Scala、Clojureなど)の複数のプログラミング言語をサポートしている。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

2クリップ

投稿2021/06/24 09:58

自分の環境:Windows xampp MySQL php7.x(ローカル)、Windows Heroku MySQL(本番環境)

レシピアプリをローカルで作ったのですが、ローカルと本番環境でどうコードを変えたらいいか分かりません。.envなどで一括して接続を管理するというのは教わったのですが、自分のコードに変更を加えなければいけない部分が分かりません。

例えば、↓update.php

update.php

1<?php 2//$user = "ローカルでのuser"; 3//$pass = "ローカルでのpass"; 4//require_once '\xampp\db_config.php'; 5$recipe_name = $_POST['recipe_name']; 6$howto = $_POST['howto']; 7$category = (int) $_POST['category']; 8$difficulty = (int) $_POST['difficulty']; 9$budget = (int) $_POST['budget']; 10try{ 11 if(empty($_POST['id'])) throw new Exception('ID不正'); 12 $id = (int) $_POST['id']; 13 //$dbh = new PDO('mysql:host=us-cdHerokuで得たホスト名、セキュリティの為変えてます4.cleardb.com;dbname=Herokuで得た~~heroku_c9b3セキュリティの為少し変えてます;', $user, $pass); 14 //$dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); 15 //$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 16 $sql = "UPDATE recipes SET recipe_name = ?, category = ?, difficulty = ?, budget = ?, howto = ? WHERE id = ?"; 17 $stmt = $dbh->prepare($sql); 18 $stmt->bindValue(1, $recipe_name, PDO::PARAM_STR); 19 $stmt->bindValue(2, $category, PDO::PARAM_INT); 20 $stmt->bindValue(3, $difficulty, PDO::PARAM_INT); 21 $stmt->bindValue(4, $budget, PDO::PARAM_INT); 22 $stmt->bindValue(5, $howto, PDO::PARAM_STR); 23 $stmt->bindValue(6, $id, PDO::PARAM_INT); 24 $stmt->execute(); 25 $dbh = null; 26 echo "ID: " . htmlspecialchars($id,ENT_QUOTES,'UTF-8') . "レシピの更新が完了しました。<br>"; 27 echo "<a href='index.php'>トップページへ戻る</a>"; 28} catch (Exception $e) { 29 echo "エラー発生: " . htmlspecialchars($e->getMessage(), ENT_QUOTES, 'UTF-8') . "<br>"; 30 die(); 31} 32

こういうコードの場合どう変えればいいのかご教授願います。コメントアウトしている部分はデータベース接続に関わらない箇所・あるいは変えてしまうとレシピアプリの挙動を変えてしまうと判断した部分です。

やったこと:
https://devcenter.heroku.com/articles/getting-started-with-php#provision-a-database
を確認したがLaravelの言葉?などで現在行っているPHPとは異なり全く参考にならなかった。
・似た質問でhttps://teratail.com/questions/227190をよく読んだが、

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; }

これが https://qiita.com/nanshi99/items/baad35db1d1cde1fdba2ここの記事のことだと思うのですが見ての通りfunction.phpと関数を自分で定義し、そこをphpファイルで保存しています。これが事実だとしても、自分が先に乗せたtry内のコードが```ここに言語を入力
$option =

見ての通り質問も的を得ていないので解決は困難な気がするので、無料でHerokuにMySQLを使ってデプロイすることがアプリ作りを通して詳しく説明しているサイトなどがあれば教えてもらいたいです。 ・最後にまとめると、 データベース接続をローカルから本番に変更するためにはローカルでのコードを変更しなければならないが、そのためには例に挙げたupdate.phpをどう修正すべきか➀。データベースをハードコーディングするべきでないのなら、一か所にまとめて書く手法とともに、update.phpをどのように修正したらいいか➁。➀、➁が解答困難であるならば、アプリ作りを通じてMySQLを用いてHerokuを使ってデプロイまでしているサイトを紹介してほしい➂。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

hope_mucci さんの書いておられるように環境変数指定する方法もあると思いますが、環境変数では環境名だけ指定し、環境別に設定ファイルをわける考え方も紹介しておきます。

update.php の先頭に下記追加。

require_once("config-"+os.environ['ENV']+".php");

config-dev.php

<?php $user = "ローカル用user名"; $pass = xxx; ?>

config-prod.php

<?php $user = "本番用user名"; $pass = xxx; ?>

そして開発環境では環境変数 ENV=dev となるようにし、本番環境では ENV=prod となるようにする。

いずれも一長一短で、設定ファイルに書くと git 等で管理しやすい、デプロイも容易。
しかしパスワードのようなものを書くと漏洩しやすい。

なので、秘匿情報ではない環境固有の設定などはファイル化をおすすめします。

投稿2021/06/24 15:42

68user

総合スコア2022

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ranerane0101

2021/06/25 04:20

これって.envをインストールしてからやることですか?すいません、$userと$passは他のphpファイルに記述してrequireで取ってこれることは知っています。composer require vlucas/phpdotenv このコマンドを入力したらものすごく大量のフォルダがインストールされて.envが必要なのか必要じゃないのか分からなくなってしまいました。
68user

2021/06/25 06:40

わかりやすさのため、.env を使わず環境を切り分ける方法を提案したものです。.env が使えたならばこのやり方は不要です。
ranerane0101

2021/06/25 13:57

なるほどです。頑張ってみます。整理が少し付きました。ありがとうございます。
guest

0

ベストアンサー

拙筆ですがherokuの環境変数設定からデータベース接続情報等を取得する方法についてまとめた記事がありますので参考にしていただければと思います。
実装はpythonの例ですが正規表現の利用方法が分かっていればPHPでも十分応用可能です。

【heroku】環境変数から接続情報を取得しよう【MySQL】

最後の方にローカル環境でClearDBに接続するヒントも記載しています。

投稿2021/06/24 12:59

hope_mucci

総合スコア4447

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ranerane0101

2021/06/25 04:25

>最後の方にローカル環境でClearDBに接続するヒントも記載しています。 これってHerokuにデプロイするのですが、データベースをローカルから引っ張ってくるってことですか?それだとMySQLをXAMPP上で起動していないとデータベースを持ってこれない気がするんですが、、。MySQLのWorkbenchでローカルのデータベースをインポートしたからHeroku上でもローカルのデータベースが使えるってことですか?前者で後者の疑問は一見解決出来ているのかもしれないですが何分理解が乏しいのでご教授願いたいです
hope_mucci

2021/06/25 06:41

> これってHerokuにデプロイするのですが、データベースをローカルから引っ張ってくるってことですか? 逆です。アプリ本体はローカルで、データベースをClearDBの方に接続する方法です。Herokuに設定されている環境変数を同じ環境変数をローカルPCに設定するとローカルでアプリを実行する際にデータベース接続先がClearDBにすることができます。 こうすることでデプロイ前に本番DBの内容で動作確認することができます。
ranerane0101

2021/06/25 14:01

なるほど!ローカルでのデータベース接続と本番でのデータベース接続が全くの別で参考にならなかったんですが、それなら、そのやり方が出来ればerokuでもできる、つまり一種のDBテストみたいなことができますね。。ありがとうございます!
ranerane0101

2021/06/28 14:20

お陰様でローカルではcleardbに接続できました。しかし、Herokuにデプロイするとデータベース部分が表示されません。接続できないなどのエラーは無く500エラーとなっているのですがこういう場合はまた新たに質問するべきなのでしょうか?
hope_mucci

2021/06/28 15:37

少なくとも「ローカルから本番データベースに接続」しているわけではないのでこの質問の題からは離れた問題でしょう。それは新しく質問を立てるべきです。複数の質問を数珠つなぎに同じページで質問されるといつまでたっても終わらないので題名と異なる問題が発生するのであれば別に質問しましょう。herokuにもっと詳しい人が回答してくれるかもしれません。
ranerane0101

2021/06/29 10:04

分かりました。ありがとうございます
ranerane0101

2021/07/05 06:38

解答と、その解答への応答でローカルからcleardbに接続して本番環境の擬似確認が出来たことが解決への一番の助けとなりました。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問