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

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

新規登録して質問してみよう
ただいま回答率
85.48%
MySQL Workbench

MySQL Workbenchは、オープンソースのデータベースモデリングツールです。ビジュアルなデータベース設計・SQL開発・サーバー設定・ユーザー管理・バックアップといった様々な管理ツールを備えます。

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

解決済

1回答

2686閲覧

「DB接続設定ファイルがディレクトリにない」とエラーが出てDBに接続できません。

nem96

総合スコア8

MySQL Workbench

MySQL Workbenchは、オープンソースのデータベースモデリングツールです。ビジュアルなデータベース設計・SQL開発・サーバー設定・ユーザー管理・バックアップといった様々な管理ツールを備えます。

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グッド

0クリップ

投稿2019/12/07 03:33

ローカル環境開発(MAMP)で作ったPHPポートフォリオサイトを、Herokuにデプロイしてブラウザ表示させることには成功したのですが、ログインや会員登録などをするページにアクセスすると、以下のように**「ディレクトリにファイルがないよ!」というエラー**が出てしまいました。

Notice: Undefined index: us-cdbr-iron-east-05.cleardb.net in /app/dbconnect.php on line 8 Notice: Undefined index: b748bc5df82266 in /app/dbconnect.php on line 9 Notice: Undefined index: ******** in /app/dbconnect.php on line 10 Fatal error: Uncaught PDOException: SQLSTATE[HY000] [2002] No such file or directory in /app/dbconnect.php:16 Stack trace: #0 /app/dbconnect.php(16): PDO->__construct('mysql:host=;dbn...', NULL, NULL, Array) #1 /app/dbconnect.php(19): dbConnect() #2 /app/login.php(6): require('/app/dbconnect....') #3 {main} thrown in /app/dbconnect.php on line 16

Noticeで言われている未定義のインデックスがそれぞれ**「DBのホスト名、ユーザー、パスワード」なので、「記述されているそれらのDBデータはどこからも見つけられないぞ、ドキュメントルートにDB接続ファイルあるかい?」と指摘されている**ことは分かりました。

しかしDB接続設定ファイル(本番環境用に書き換え済み)は用意してあるため、他に何が原因で何が不足しているのか調べ込みましたが、自分の力だけでは発見できませんでした…。

ドキュメントルートは、ローカル環境(MAMP)で開発していたときと変えていないため、本番環境になったことでDBに接続できなくなったことになると思うのですが、本番環境でDB接続するために必要な「Composer.json」や「Procfile」などのファイルは追加してあるため、見当がつかなくなってしまいました…。

以下がデータベース接続設定ファイル(本番環境用に書き換え済み)です。

▼「dbconnect.php」

php

1<?php 2 3 //DB接続設定用ファイル(dbconnect.php)// 4 5 function dbConnect(){ 6 $db = parse_url($_SERVER['CLEARDB_DATABASE_URL']); 7 $db['arabia_social2'] = ltrim($db['path'], '/'); 8 $dsn = "mysql:host={$db['us-cdbr-iron-east-05.cleardb.net']};dbname={$db['arabia_social2']};port=3306;charset=utf8"; 9 $user = $db['b748bc5df82266']; 10 $password = $db['********']; 11 $options = array( 12 PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, 13 PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, 14 PDO::MYSQL_ATTR_USE_BUFFERED_QUERY =>true, 15 ); 16 $dbh = new PDO($dsn,$user,$password,$options); 17 return $dbh; 18 } 19 $dbh=dbConnect(); 20

ここではHerokuのClearDBの「CLEARDB_DATABASE_URL」で取得した自身のデータベース情報を、それぞれ該当箇所に当てはめて記述しています。

そして以下はログインページのソースコードです。

▼「login.php」

php

1<?php 2ini_set('display_errors', true); 3error_reporting(E_ALL); 4 5session_start(); 6require('dbconnect.php'); 7 8ini_set('display_errors', true); 9error_reporting(E_ALL); 10 11//cookieが入っているかチェック 12if($_COOKIE['email']!==''){ 13 $email=$_COOKIE['email']; 14} 15 16if(!empty($_POST)){ 17 $email=$_POST['email']; 18 19 if($_POST['email']!=='' && $_POST['password']!==''){ 20 $login=$dbh->prepare('SELECT*FROM members WHERE email=? AND password=?'); 21 $login->execute(array( 22 $_POST['email'], 23 sha1($_POST['password']) 24 )); 25 $member=$login->fetch(); 26 27 //パスワードや個人情報はセッション変数に保存しない 28 if($member){ 29 $_SESSION['id']=$member['id']; 30 $_SESSION['time']=time(); 31 32 if($_POST['save']==='on'){ 33 setCookie('email',$_POST['email'],time()+60*60*24*14); 34 } 35 36 //ログインされたらトップページへ 37 header('Location:index.php'); 38 exit(); 39 }else{ 40 $error['login']='failed'; 41 } 42 }else{ 43 $error['login']='blank'; 44 } 45} 46?>

今回はこのログインページにアクセスしたところ、DBに接続できないというエラーが出たので、冒頭の

session_start(); require('dbconnect.php');

この部分ですでにエラーが出た(=「dbconnect.php」に問題あり?)ことになると思われます。

しかし以下のようにディレクトリ内に「dbconnect.php」はあるのに、なぜ「ディレクトリにDBが見つからない」とエラーが出るのでしょうか…。

Webサイトのディレクトリ

ポートフォリオドキュメントルート

ローカル環境から本番環境に以降する際に重要と思われるそれぞれのファイルには、以下のことを記述しています。

▼「dbconnect.php」

//DB接続設定用ファイル(dbconnect.php)// function dbConnect(){ $db = parse_url($_SERVER['CLEARDB_DATABASE_URL']); $db['arabia_social2'] = ltrim($db['path'], '/'); $dsn = "mysql:host={$db['us-cdbr-iron-east-05.cleardb.net']};dbname={$db['arabia_social2']};port=3306;charset=utf8"; $user = $db['b748bc5df82266']; $password = $db['********']; $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; } $dbh=dbConnect();

▼「composer.json」

composer

1{ 2 "require": { 3 "php": "~7.0", 4 "ext-mbstring": "*" 5 } 6}

▼「composer.lock」

"_readme": [ "This file locks the dependencies of your project to a known state", "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], "content-hash": "ae3bd260c1b696c3d0228d39e4cb9a0e", "packages": [], "packages-dev": [], "aliases": [], "minimum-stability": "stable", "stability-flags": [], "prefer-stable": false, "prefer-lowest": false, "platform": { "php": "~7.0", "ext-mbstring": "*" }, "platform-dev": [] }

▼「Procfile」

Procfile

1web: vendor/bin/heroku-php-apache2

*apache2の後ろに「public」を書くと、ブラウザ上でWebサイト自体にアクセスできなくなってしまうので、書いていません。

状況整理

✔︎ ローカル環境開発(MAMP)で作成したPHPウェブサイトを、Herokuでデプロイすることで本番環境に移そうとして格闘中。
✔︎ ローカル環境の際は、「phpMyAdmin」でDB管理をしていた。
✔︎ HerokuでMySQLを使うため、clearDBはインストールした上で、「CLEARDB_DATABASE_URL」で自分のサーバーデータ?も取得済み
✔︎ 「Myworkbench」には、、「CLEARDB_DATABASE_URL」のデータでMySQLに接続し、「phpMyAdmin」のDBをインポートした上でエクスポート済み。

使用環境

■ Mac
■ heroku
■ Myworkbench(phpMyAdminで管理していたDBをエクスポートした)
■ clearDB

DB接続ができないまま試行錯誤を続けて、1週間以上が経ってしまいました…。
調べたことを実践しても、自分のケースには合っていないようで、いずれの方法もうまくいかなかったので、アドバイスいただけると幸いです。
よろしくお願い致します…。

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

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

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

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

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

guest

回答1

0

ベストアンサー

「DB接続設定ファイルがディレクトリにない」とエラー

そういうエラーは出ていません。
ひとつ前の質問でも若干気にはなっていましたが、自分だけの解釈を入れ過ぎだと思います。

Notice: Undefined index: us-cdbr-iron-east-05.cleardb.net

訳:us-cdbr-iron-east-05.cleardb.netというインデックスは未定義です

同じNoticeは下記だけで再現できます。

php

1$ar = []; 2$ar["a"] = "hoge"; 3echo $ar["b"]; 4

基礎部分です。
まずはparse_url()で受け取っている情報をvar_dump()し、
必要な情報が格納されているかどうか確認するところからはじめてください。

投稿2019/12/07 03:42

編集2019/12/07 03:43
m.ts10806

総合スコア80850

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

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

nem96

2019/12/07 06:11

//ひとつ前の質問でも若干気にはなっていましたが、自分だけの解釈を入れ過ぎだと思います。// ご指摘の通りです…。 人に質問する前に自分でやらなければ!という考えが強すぎたかもしれません。 そしておかげさまでついにDB接続に成功して、全て解決することができました!! 原因は本当に思わぬところにあり、「dbconnect.php」のファイル内で、定義されたデータベース名が接続しようとしていたものと違っていただけでした(致命的な見落としです…)。 Myworkbenchで接続した際につけた「Connection Name」をデータベース名と勘違いして、関数内に定義していただけで、「Default Schema」の名前に書き換えたところ解決しました。 根気強く何度も的確で丁寧なアドバイスをしていただき助かりました!! 本当にありがとうございます!
m.ts10806

2019/12/07 06:22 編集

解決されたようで何よりです。 下記、今後のためのアドバイスです。 >人に質問する前に自分でやらなければ!という考えが強すぎたかもしれません。 要約しなくともエラーをそのまま提示し、例えばGoogle翻訳にかけた結果を添えるだけで良かったりします。 むしろ経験や知識が少ない状態で要約しようとすることは大きなミスになり得ます。調べる方向性を間違えてしまえばどこまでいっても解決策のヒントは見つかりませんしね。 エラーについては下記の記事も参考にしてください。 https://qiita.com/cannorin/items/eb062aae88bfe2ad6fe5 ※私はよく回答でこの記事を貼っていますが筆者本人ではなくこの記事のファンであり特に初学者は見るべきとして提示しています。
nem96

2019/12/07 08:59

これはかなり参考になりそうな記事ですね!(ブックマークしました) >むしろ経験や知識が少ない状態で要約しようとすることは大きなミスになり得ます。調べる方向性を間違えてしまえばどこまでいっても解決策のヒントは見つかりませんしね。 そうですよね、これは今回身をもって痛感しました…。 後学になることまで教えていただき、本当にありがとうございます!
m.ts10806

2019/12/07 09:09

はい。初学者の問題のほとんどはエラーを読んでPHPマニュアルで機能の仕様を確認していけばほとんど解決します。 そのエラー部分を読み違えるとPHPマニュアルも正しく参照できませんので、スタートはなるべく正確に。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問