ローカル環境開発(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週間以上が経ってしまいました…。
調べたことを実践しても、自分のケースには合っていないようで、いずれの方法もうまくいかなかったので、アドバイスいただけると幸いです。
よろしくお願い致します…。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/12/07 06:11
2019/12/07 06:22 編集
2019/12/07 08:59
2019/12/07 09:09