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

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

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

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

phpMyAdmin

phpMyAdminはオープンソースで、PHPで書かれたウェブベースのMySQL管理ツールのことです。

PHP

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

Q&A

1回答

2479閲覧

PHPからDBへ接続できない

twsoccer15

総合スコア12

MySQL

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

phpMyAdmin

phpMyAdminはオープンソースで、PHPで書かれたウェブベースのMySQL管理ツールのことです。

PHP

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

0グッド

0クリップ

投稿2020/01/14 02:52

前提・実現したいこと

今自分でwebサービスを作成しているのですが、PHPからDBへ接続できずエラーが返ってきます。エラーコードを確認しましたが原因が分からず先に進めないのが現状です。どなたが解説して頂ければ幸いです。よろしくお願いします。

発生している問題・エラーメッセージ

[14-Jan-2020 01:46:39 UTC] PHP Notice: Undefined variable: dbh in /Applications/MAMP/htdocs/webpractice/signup.php on line 108
[14-Jan-2020 01:46:39 UTC] PHP Fatal error: Uncaught Error: Call to a member function prepare() on null in /Applications/MAMP/htdocs/webpractice/signup.php:108
Stack trace:#0 /Applications/MAMP/htdocs/webpractice/signup.php(46):queryPost(Object(PDO), 'SELECT count(*)...', Array)#1 /Applications/MAMP/htdocs/webpractice/signup.php(134): validEmailDup('aa')#2 {main}
thrown in /Applications/MAMP/htdocs/webpractice/signup.php on line 108

該当のソースコード

<?php //ログとるか ini_set('log_errors','On'); //ログ出力ファイルを指定 ini_set('error_log','php.log'); //エラーメッセージを定数に設定 define('MSG01','入力必須です'); define('MSG02','Email形式で入力してください'); define('MSG03','パスワード(再入力)があっていません'); define('MSG04','半角英数字のみご利用できます'); define('MSG05','6文字以上で入力してください'); define('MSG06','256文字以内で入力してください'); define('MSG07','エラーが発生しました。しばらく経ってからやり直してください'); define('MSG08','そのemailは既に登録されています'); //エラーメッセージ格納用の配列 $err_msg = array(); //バリデーション関数(未入力チェック) function validRequired($str,$key){ if(empty($str)){ global $err_msg; $err_msg[$key] = MSG01; } } //バリデーション関数(Email形式チェック) function validEmail($str,$key){ if(!preg_match("/^([a-zA-Z0-9])+([a-zA-Z0-9._-])*@([a-zA-Z0-9_-])+([a-zA-Z0-9._-]+)+$/", $str)){ global $err_msg; $err_msg[$key] = MSG02; } } //バリデーション関数(Email重複チェック) function validEmailDup($email){ global $err_msg; //例外処理 try{ //DBへ接続 $dbh = dbConnect(); //SQL文作成 $sql = 'SELECT count(*) FROM users WHERE email = :email'; $data = array(':email' => $email); //クエリ実行 $stmt = queryPost($dbh,$sql,$data); //クエリ結果の値を取得 $result = $stmt->fetch(PDO::FETCH_ASSOC); //array_shift関数は配列の先頭を取り出す関数です。クエリ結果は配列形式で入っているので、array_shiftで1つ目だけ取り出して判定します。 if(!empty(array_shift($result))){ $err_msg['email'] = MSG01; } } catch (Exception $e) { error_log('エラー発生:' .$e->getMessage()); $err_msg['common'] = MSG07; } } //バリデーションチェック関数(同値チェック) function validMatch($str1, $str2, $key){ if($str1 !== $str2){ global $err_msg; $err_msg[$key] = MSG03; } } //バリデーションチェック関数(最小文字数チェック) function validMinLen($str,$key,$min = 6){ if(mb_strlen($str) < $min){ global $err_msg; $err_msg[$key] = MSG05; } } //バリデーション関数(最大文字数チェック) function validMaxLen($str, $key, $max = 256){ if(mb_strlen($str) > $max){ global $err_msg; $err_msg[$key] = MSG06; } } //バリデーション関数(半角チェック) function validHalf($str, $key){ if(!preg_match("/^[a-zA-Z0-9])+$/", $str)){ global $err_msg; $err_msg[$key] = MSG04; } } //DB接続関数 function dbConnect(){ //DBへの接続準備 $dsn = 'mysql:dbname=freemarket;host=localhost;charset=utf8'; $user = 'root'; $password = 'root'; $options = array( //SQL実行失敗時にはエラーコードのみ設定 PDO::ATTR_ERRMODE => PDO::ERRMODE_SILENT, //デフォルトフェッチモードを連想配列形式に設定 PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, //バッファードクエリを使う(一度に結果セットをすべて取得し、サーバー負荷を軽減) //SELECTで得た結果に対してもrowCountメソッドを使えるようにする PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true, ); //PDOオブジェクト生成(DBへ接続) $dbh = new PDO($dsn, $user, $password, $options); return $dbh; } //SQL実行関数 function queryPost($dsn, $sql, $data){ //クエリー作成 $stmt = $dbh->prepare($sql); //プレースホルダに値をセットし、SQL文を実行 $stmt->execute($data); return $stmt; } //post送信されていた場合 if(!empty($_POST)){ //変数にユーザー情報を代入 $email = $_POST['email']; $pass = $_POST['pass']; $pass_re = $_POST['pass_re']; //未入力チェック validRequired($email, 'email'); validRequired($pass, 'pass'); validRequired($pass_re, 'pass_re'); if(empty($err_msg)){ //emailの形式をチェック validEmail($email, 'email'); //emailの最大文字数チェック validMaxlen($email, 'email'); //emailの重複チェック validEmailDup($email); //パスワードの半角英数字チェック validHalf($pass, 'pass'); //パスワードの最大文字数チェック validMaxLen($pass, 'pass'); //パスワードの最小文字数チェック validMinLen($pass, 'pass'); //パスワード(再入力)の最大文字数チェック validMaxLen($pass_re, 'pass_re'); //パスワード(再入力)の最小文字数チェック validMinLen($pass_re, 'pass_re'); if(empty(err_msg)){ //パスワードとパスワード再入力があっているかチェック validMatch($pass, $pass_re, 'pass_re'); if(empty($err_msg)){ //例外処理 try{ //DB接続 $dbh = dbConnect(); //SQL文作成 $sql = 'INSERT INTO users (email,password,login_time,create_date) VALUES(:email,:pass,:login_time,:create_date)'; $data = array(':email' => $email, ':pass' => password_hash($pass, PASSWORD_DEFAULT), ':login_time' => date('Y-m-d H:i:s'), ':create_date' => date('Y-m-d H:i:s')); //クエリ実行 queryPost($dbh, $sql, $data); header("Location:mypage.html"); //マイページへ } catch (Exception $e) { error_log('エラー発生:' . $e->getMessage()); $err_msg['common'] = MSG07; } } } } } ?> <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <title>ユーザー登録 | SAMPLE MARKET</title> <link rel="stylesheet" type="text/css" href="style1.css"> <link href="https://fonts.googleapis.com/css?family=Lobster&display=swap" rel="stylesheet" type='text/css'> </head> <body class="page-signup page-1colum"> <!-- メニュー --> <header> <div class="site-width"> <h1><a href="index.html">SAMPLE MARKET</a></h1> <nav id="top-nav"> <ul> <li><a href="signup.html" class="btn btn-primary">ユーザー登録</a></li> <li><a href="login.html">ログイン</a></li> </ul> </nav> </div> </header> <!-- メインコンテンツ --> <div id="contents" class="site-width"> <!-- Main --> <section id="main"> <div class="form-container"> <form action="" method="post" class="form"> <h2 class="title">ユーザー登録</h2> <div class="area-msg"> <?php if(!empty($err_msg['common'])) echo $err_msg['common']; ?> </div> <label class="<?php if(!empty($err_msg['email'])) echo 'err'; ?>"> Email <input type="text" name="email" value="<?php if(!empty($_POST['email'])) echo $_POST['email']; ?>"> </label> <div class="area-msg"> <?php if(!empty($err_msg['email'])) echo $err_msg['email']; ?> </div> <label class="<?php if(!empty($err_msg['pass'])) echo 'err'; ?>"> パスワード<span style="font-size:12px">英数字6文字以上</span> <input type="password" name="pass" value="<?php if(!empty($_POST['pass'])) echo $_POST['pass']; ?>"> </label> <div class="area-msg"> <?php if(!empty($err_msg['pass'])) echo $err_msg['pass']; ?> </div> <label class="<?php if(!empty($err_msg['pass_re'])) echo 'err'; ?>"> パスワード(再入力) <input type="password" name="pass_re" value="<?php if(!empty($_POST['pass_re'])) echo $_POST['pass_re']; ?>"> </label> <div class="area-msg"> <?php if(!empty($err_msg['pass_re'])) echo $err_msg['pass_re']; ?> </div> <div class="btn-container"> <input type="submit" class="btn btn-mid" value="登録する"> </div> </form> </div> </section> </div> <!-- footer --> <footer id="footer"> copyright <a href="http://sample.com/">sampleservice</a>. All Rights Reserved, </footer> <script src="js/vendor/jquery-2.2.2.min.js"></script> <script> $(function(){ var $ftr = $('#footer'); if( window.innerHeight > $ftr.offset().top + $ftr.outerHeight() ){ $ftr.attr({'style': 'position:fixed; top:' + (window.innerHeight - $ftr.outerHeight()) +'px;'}); } }); </script> </body> </html>

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

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

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

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

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

guest

回答1

0

PHP

1// ↓名前が違う 2function queryPost($dsn, $sql, $data){ 3 //クエリー作成 4 $stmt = $dbh->prepare($sql); 5 //プレースホルダに値をセットし、SQL文を実行 6 $stmt->execute($data); 7 return $stmt; 8}

投稿2020/01/14 02:57

kei344

総合スコア69407

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問