Herokuでデプロイしたポートフォリオサイトをブラウザに表示するまではよかったのですが、いざログインや新規登録機能などを使おうとすると、以下のようなエラーが表示されてしまい、DBに接続できません。
Fatal error: Uncaught Error: Call to a member function prepare() on null in /app/login.php:17 Stack trace: #0 {main} thrown in /app/login.php on line 17
おそらく**「nullのところからpreperaファンクションを呼び出そうとしているよ!」**というエラーだと思い、定義されている変数が一致しているか下記のファイルを確認したのですが、まちがえている部分が分からず、完全に行き詰まってしまいました…。
▼「dbconnect.php」(*local用から本番用に書き換えています)
php
1<?php 2 3//DB接続設定用ファイル(dbconnect.php)// 4 5function 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']};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
▼「login.php」
php
1 2 3<?php 4session_start(); 5require('dbconnect.php'); 6 7ini_set('display_errors', true); 8error_reporting(E_ALL); 9 10//cookieが入っているかチェック 11if($_COOKIE['email']!==''){ 12 $email=$_COOKIE['email']; 13} 14 15if(!empty($_POST)){ 16 $email=$_POST['email']; 17 18 if($_POST['email']!=='' && $_POST['password']!==''){ 19 $login=$dbh->prepare('SELECT*FROM members WHERE email=? AND password=?'); 20 $login->execute(array( 21 $_POST['email'], 22 sha1($_POST['password']) 23 )); 24 $member=$login->fetch(); 25 26 //パスワードや個人情報はセッション変数に保存しない 27 if($member){ 28 $_SESSION['id']=$member['id']; 29 $_SESSION['time']=time(); 30 31 if($_POST['save']==='on'){ 32 setCookie('email',$_POST['email'],time()+60*60*24*14); 33 } 34 35 //ログインされたらトップページへ 36 header('Location:index.php'); 37 exit(); 38 }else{ 39 $error['login']='failed'; 40 } 41 }else{ 42 $error['login']='blank'; 43 } 44} 45?> 46<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 47<html xmlns="http://www.w3.org/1999/xhtml"> 48 49------------------------------------------略------------------------------------ 50 51<div class="container"> 52<h1>ログインする</h1> 53<div id="lead"> 54 <p>メールアドレスとパスワードを記入してログインしてください。</p> 55 <p>入会手続きがまだの方はこちらからどうぞ。</p> 56 <p>»<a href="join/">入会手続きをする</a></p> 57 </div> 58 <form action="" method="post"> 59 <div class="form-group"> 60 <label for="exampleInputEmail1">Eメールアドレス</label> 61 <input type="email" name="email" class="form-control" id="exampleInputEmail1" value="<?php print(htmlspecialchars($email,ENT_QUOTES)); ?>"> 62 <small class="text-muted">あなたのメールは他の誰とも共有しません。</small> 63 <?php if($error['login']==='blank'): ?> 64 <p class="error">メールアドレスとパスワードを入力してください</p> 65 <?php endif; ?> 66 <?php if($error['login']==='failed'): ?> 67 <p class="error">ログインに失敗しました。正しく入力してください</p> 68 <?php endif; ?> 69 </div> 70 71 <div class="form-group"> 72 <label for="exampleInputPassword1">パスワード</label> 73 <input type="password" name="password" class="form-control" id="exampleInputPassword1" value="<?php print(htmlspecialchars($_POST['password'],ENT_QUOTES)); ?>"> 74 </div> 75 <div class="form-group form-check"> 76 <input type="checkbox" class="form-check-input" id="save" name="save" value="on"> 77 <label class="form-check-label" for="save">記憶する</label> 78 </div> 79 <button type="submit" class="btn btn-primary">ログインする</button> 80</form> 81 82</div> 83---------------------------略---------------------------------------
preperaファンクションは「$dbh」で呼び出しているのですが、「dbconnect.php」を確認すると、きちんと定義されているはずなので、どうして「$dbh」が「null」となってエラーが起きているのか分かりません。
前提
Herokuへのデプロイ、およびphpMyAdminからMyworkbenchへのDBのインポートなどは問題なく行えています。
ブラウザ上にもきちんとポートフォリオサイトは表示されます。
したがって正常に機能しているDBに、正常に接続できていないというのが現状だと思います。
Heroku(PHP+MySQL)でWebサービス公開手順
ちなみに冒頭で掲示した「dbconnect.php」ファイルは、こちらのサイトに書かれていた下記のソースコードを元に、自分自身の「CLEARDB_DATABASE_URL」のデータに当てはめた上で、DB接続ファイルを書き換えました。
php
1//DB接続設定用ファイル(dbconnect.php)// 2 3function dbConnect(){ 4 $db = parse_url($_SERVER['CLEARDB_DATABASE_URL']); 5 $db['dbname'] = ltrim($db['path'], '/'); 6 $dsn = "mysql:host={$db['host']};dbname={$db['dbname']};charset=utf8"; 7 $user = $db['user']; 8 $password = $db['pass']; 9 $options = array( 10 PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, 11 PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, 12 PDO::MYSQL_ATTR_USE_BUFFERED_QUERY =>true, 13 ); 14 $dbh = new PDO($dsn,$user,$password,$options); 15 return $dbh; 16}
dbname: arabia_social2
host: us-cdbr-iron-east-05.cleardb.net
user: b748bc5df82266
pass: ********
【他にも試したこと】
DBを使う他のページも試しに動作を確認しましたが、やはり全く同じように以下のようなエラーが出てしまい、**「nullのところからpreperaファンクションを呼び出そうとしているよ!」**と言われてしまいました。
Notice: Undefined variable: dbh in /app/join/index.php on line 35 Fatal error: Uncaught Error: Call to a member function prepare() on null in /app/join/index.php:35 Stack trace: #0 {main} thrown in /app/join/index.php on line 35
▼「join/index.php」
php
1 2<?php 3session_start(); 4require('../dbconnect.php'); 5 6ini_set('display_errors', true); 7error_reporting(E_ALL); 8 9 //$_POSTが空ではない時にこのエラーチェックを走らせる=フォームを送信した時だけエラーチェックする 10if(!empty($_POST)){ 11 12 if($_POST['name']===''){ 13 $error['name']='blank'; 14 } 15 if($_POST['email']===''){ 16 $error['email']='blank'; 17 } 18 //パスワードの長さ指定 19 if(strlen($_POST['password']) < 4){ 20 $error['password']='length'; 21 } 22 if($_POST['password']===''){ 23 $error['password']='blank'; 24 } 25 //セキュリティのため画像のみをアップロードできるようにする 26 $fileName=$_FILES['image']['name']; 27 if(!empty($fileName)){ 28 //「-3」として拡張子を得る 29 $ext=substr($fileName, -3); 30 if($ext !='jpg' && $ext !='gif' && $ext !='png'){ 31 $error['image']='type'; 32 } 33 } 34 //アカウントの重複チェック 35 if(empty($error)){ 36 $member=$dbh->prepare('SELECT COUNT(*) AS cnt FROM members WHERE email=?'); 37 $member->execute(array($_POST['email'])); 38 $record=$member->fetch(); 39 if($record['cnt'] > 0){ 40 $error['email']='duplicate'; 41 } 42 } 43 44 45 //$errorの配列がカラかどうか 46 if(empty($error)){ 47 //ファイル名に日付を入れることで、同じ名前による重複した画像保存を防ぐ 48 $image=date('YmdHis').$_FILES['image']['name']; 49 move_uploaded_file($_FILES['image']['tmp_name'],'../member_picture/'.$image); 50 $_SESSION['join']=$_POST; 51 //「$image」にファイル名保存 52 $_SESSION['join']['image']=$image; 53 header('Location:check.php'); 54 exit(); 55 } 56} 57//書き直しがクリックされた時の処理(セッションが正しく設定されている場合のみ) 58if($_REQUEST['action']=='rewrite'&& isset($_SESSION['join'])){ 59 $_POST=$_SESSION['join']; 60} 61?> 62 63<!DOCTYPE html> 64<html lang="ja"> 65<head> 66 67---------------------------略--------------------------------------- 68 69<div class="container"> 70 <p>次のフォームに必要事項をご記入ください。</p> 71 <form action="" method="post" enctype="multipart/form-data"> 72 <div class="form-group"> 73 <label for="Input">名前(ニックネーム可)<span class="required">必須</span></label> 74 <input type="text" name="name" class="form-control" id="Input" value="<?php print(htmlspecialchars($_POST['name'],ENT_QUOTES)); ?>"> 75 <?php if($error['name']==='blank'): ?> 76 <p class="error">名前を入力してください</p> 77 <?php endif; ?> 78 </div> 79 80 <div class="form-group"> 81 <label for="exampleInputEmail1">Eメールアドレス<span class="required">必須</span></label> 82 <input type="email" name="email" class="form-control" id="exampleInputEmail1" value="<?php print(htmlspecialchars($_POST['email'],ENT_QUOTES)); ?>"> 83 <small class="text-muted">あなたのメールは他の誰とも共有しません。</small> 84 <?php if($error['email']==='blank'): ?> 85 <p class="error">メールアドレスを入力してください。</p> 86 <?php endif; ?> 87 <?php if($error['email']==='duplicate'): ?> 88 <p class="error">指定されたメールアドレスはすでに登録されています</p> 89 <?php endif; ?> 90 </div> 91 92 93 <div class="form-group"> 94 <label for="exampleInputPassword1">パスワード<span class="required">必須</span></label> 95 <input type="password" name="password" class="form-control" id="exampleInputPassword1" value="<?php print(htmlspecialchars($_POST['password'],ENT_QUOTES)); ?>"> 96 <?php if($error['password']==='length'): ?> 97 <p class="error">4文字以上で入力してください</p> 98 <?php endif; ?> 99 <?php if($error['password']==='blank'): ?> 100 <p class="error">パスワードを入力してください。</p> 101 <?php endif; ?> 102 </div> 103 104 <input type="file" name="image" size="35" value="test" /> 105 <?php if($error['image']==='type'): ?> 106 <p class="error">「.jpg」「.gif」「.png」の画像を指定してください</p> 107 <?php endif; ?> 108 <?php if(!empty($error)); ?> 109 <p class="error">画像をもう一度指定してください</p> 110 <div><input type="submit" value="入力内容を確認する" /></div> 111</form> 112 113</div> 114 115------------------------------略--------------------------------- 116
DBへの接続を試みるたびに、エラーの解消のいたちごっこのようになっていて困っているため、アドバイスいただけると幸いです。
よろしくお願い致します。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/12/06 08:27 編集
2019/12/06 08:09
2019/12/06 08:13
2019/12/06 08:17
2019/12/06 08:48 編集
2019/12/06 08:47
2019/12/06 09:00
2019/12/06 09:52
2019/12/06 10:26 編集
2019/12/06 10:15
2019/12/06 15:38
2019/12/06 20:52