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

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

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

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

phpMyAdmin

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

PHP

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

Q&A

解決済

2回答

851閲覧

PHP 掲示板作成での、DBからの接続エラーについて。

opaikai

総合スコア13

MySQL

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

phpMyAdmin

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

PHP

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

0グッド

0クリップ

投稿2019/02/03 14:07

開発環境はmacOS MAMP phpMyAdmin を使っています。

掲示板作成での、エラーの原因がわからず、立ち往生しています。

エラーとしましては、

Notice: Undefined variable: dbh in /Applications/MAMP/htdocs/keijiban/keijiban.php on line 152

Fatal error: Uncaught Error: Call to a member function query() on null in /Applications/MAMP/htdocs/keijiban/keijiban.php:152 Stack trace: #0 {main} thrown in /Applications/MAMP/htdocs/keijiban/keijiban.php on line 152

です。
最初の方で$dbhでオブジェクトで定義しているはずなのですが、なぜこのエラーが出るのかわかりません。

そして、コメント欄のphpは、idの最大値を取得したく、プレイスフォルダを使わなかったのでquery文で書きました。

なぜnullになり、$dbhが定義されていないのでしょうか。

機能的には正常にDB連携はできており、投稿もできています。

コード<?php error_reporting(E_ALL); ini_set('display_errors' , 'On'); if(!empty($_POST)){ $name = $_POST['name']; $comment = $_POST['comment']; $err_msg = array(); define('MSG01' , '入力必須です。'); if(empty($name)){ $err_msg['name'] = MSG01; } if(empty($comment)){ $err_msg['comment'] = MSG01; } if(empty($err_msg)){ $dsn = 'mysql:dbname=php_sample01;host=localhost;charset=utf8'; $user = 'michi'; $password = 'michitaro'; $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); $stmt = $dbh -> prepare('INSERT INTO keijiban2(name,comment) VALUES(:name,:comment)'); $stmt -> execute(array(':name' => $name, ':comment' => $comment));  }  } ?> <!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf-8"> <title></title> </head> <style media="screen"> cssは省略しています </style> <body> <h1>掲示板</h1> <form class="site-width" action="" method="post"> <span class="err_msg"><?php if(!empty($err_msg['name'])) echo $err_msg['name']; ?></span> <input type="text" name="name" placeholder="タイトル" value=""> <span class="err_msg"><?php if(!empty($err_msg['comment'])) echo $err_msg['comment']; ?></span> <textarea name="comment" rows="5" cols="50" placeholder="内容" value=""></textarea> <input type="submit" name="" value="送信"> </form> <section class="site-width"> <h1 id="comment-title">コメント欄</h1>   <?php $stmt_id = $dbh -> query('SELECT max(id) FROM keijiban2'); $result = $stmt_id -> fetch(PDO::FETCH_ASSOC); $max_id = $result['max(id)'];  ?> <?php for($i = $max_id; $i > 0; $i--){ ?> <div class="comment"> <?php $stmt_comment_i = $dbh -> prepare('SELECT name,comment FROM keijiban2 WHERE id = :id'); $stmt_comment_i -> execute(array('id' => $i)); $result_i = $stmt_comment_i -> fetch(FETCH_ASSOC); echo '名前:'.$result_i['name'].'<br>コメント:'.$result_i['comment']; ?> </div>      <?php } ?> </section> </body> </html>

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

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

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

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

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

guest

回答2

0

ベストアンサー

if(!empty($_POST)) としているのでPOST以外のときはエラーが出るでしょうね。

投稿2019/02/03 14:13

kei344

総合スコア69364

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

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

opaikai

2019/02/03 14:32

回答ありがとうございます。ということは まだまだ思い浮かびません...
m.ts10806

2019/02/03 14:43 編集

ほぼ解決できるはずの内容なのでこちらにぶら下がりますが、 このこーどだと$dsn定義~$dbhを定義の内容って$_POST送信、かつ、入力チェックに引っかかってないときしか定義されないようになっています。 何もなくてアクセスしたときは$_GETと同義です。 ということは?
退会済みユーザー

退会済みユーザー

2019/02/04 00:49

webブラウザでURLを直に入力しただけだと、POST送信されるデータなんかないんだよなぁ。
opaikai

2019/02/04 12:13

コメントありがとうございます。 method=getにしても,$_POSTにしても、同様のエラーがでたままです... すべてpostでいけるという記事があったりして混乱しています。
kei344

2019/02/04 12:44

To: opaikaiさん mts10806さんの指摘するように、$dbhが定義されるのが「$_POST送信、かつ、入力チェックに引っかかってないとき」だけになっているという箇所が問題なのです。IF文の組み方を考え直して見ましょう。
m.ts10806

2019/02/04 21:39 編集

opaikaiさん POSTでいけることと今回は別問題です。 初回アクセスしたときはGETと同じ。ということはPOSTは送信されていないわけです。 で、あれば if(!empty($_POST)){ の中に入りますか? 入らない場合、 コメント欄の直後で使われている$dbhという変数はどうなると思いますか?
opaikai

2019/02/05 05:55

$dsn定義から、$dbhまでを別ファイルにし、それぞれのelseで、 post送信以外と、入力チェックに引っかかっている場合にincludeで読み込見込むと正常に動きました。 お二方ともヒントをくださりありがとうございました。
m.ts10806

2019/02/05 06:03

別ファイルにするのは良いですが何回も読み込むと無駄なので(同じ変数何度も定義していることになる)例えば ini_set('display_errors' , 'On'); の直下くらいにそのinclude()を書くだけで解決しそうにも思います。
opaikai

2019/02/05 06:09

本当ですね! 上から下に読み込まれていくので、一番はじめに読み込んでいくと、何をしても大丈夫である。 という感覚でしょうか?
m.ts10806

2019/02/05 06:12

「大丈夫である」というとそれは要件次第でもありますね。 今回はどのようなアクセスがあるときでもmax(id)を取得するSQLが流れるようになっているのでそれでも良いですが、必ず毎回そうしておけば良いというわけでもありません。 「使われない変数を定義しないこと」「同じ内容の同じ変数を何度も定義しないこと」の2点を”最低限”配慮して作ることですね。これは今回のDB接続の処理に限らず。
opaikai

2019/02/05 06:15

ありがとうございます。 書いていく中で考えてみます。
guest

0

条件分岐とinclude()の使い方

投稿2019/02/05 05:56

opaikai

総合スコア13

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問