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

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

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

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

PDO

PDO(PHP Data Objects)はPHPのデータベース抽象化レイヤーです。

PHP

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

MAMP

Mac 上で WordPress などの動的ページのサイトが作れるように環境を構築するフリーソフト

Q&A

解決済

3回答

1472閲覧

PDOでのMysql接続関連

NOBUTUNA

総合スコア11

MySQL

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

PDO

PDO(PHP Data Objects)はPHPのデータベース抽象化レイヤーです。

PHP

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

MAMP

Mac 上で WordPress などの動的ページのサイトが作れるように環境を構築するフリーソフト

0グッド

0クリップ

投稿2019/03/04 13:09

編集2019/03/05 00:51

前提・実現したいこと

以下のclass Sql 別々のファイルで2箇所でインスタンス化しfunction ProductDataSelect と WpIdCheck をそれぞれ使用しているのですが、WpIdCheckの方が途中で処理が止まってしまいます。
調べたところWpIdCheck の方は $dbh が null となっているため、正しくDBとアクセスできていないようです。
どのようにしたらそれぞれの WpIdCheck でもMysqlに接続させることができますでしょうか。

PHP

1class Sql 2{ 3 private function DBconnect() { 4 // DB 接続処理 5 try { 6 $dsn = "mysql:dbname=".DBNAME.";host=".HOST.";"; 7 $dbh = new PDO($dsn, USERNAME, PASSWORD); 8 $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING); 9 10 } catch (Exception $e) { 11 echo "DB アクセス失敗"; 12 echo $e ; 13 } 14 return $dbh; 15 } 16 17 public function ProductDataSelect($shop_name) { 18 $dbh = $this->DBconnect(); 19 $sql = "SELECT * FROM research_data WHERE shop = :shop"; 20 $stmt = $dbh->prepare($sql); 21 $params = [':shop' => $shop_name]; 22 23 $stmt->execute($params); 24 $research_url = $stmt->fetchAll(PDO::FETCH_ASSOC); 25 26 return $research_url; 27 } 28 29 public function WpIdCheck () { 30 try { 31 $dbh = $this->DBconnect(); 32 $sql = "SELECT * FROM research_data WHERE shop = :shop"; 33error_log(var_export('ここのエラーログは正しく表示されている', true)); 34       // ここで処理が止まっている、エラーろぐも発生していない. 35 $stmt = $dbh->prepare($sql); 36error_log(var_export('ここの文字列はエラーログに出力されない。。。', true)); 37 38 $param = [':shop' => 'xxxxxxxx']; 39 $stmt->execute($param); 40 $result = $stmt->fetchAll(PDO::FETCH_ASSOC); 41 } catch (PDOException $e) { 42 print $e->getMessage(); 43 print "WpIdCheck エラーテスト用"; 44 die(); 45 } 46 } 47}

他ファイルでの呼び出し例
A file

PHP

1$sql_obj = new Sql(); 2$test = $sql_obj->WpIdCheck();

B file

PHP

1$db_obj = new Sql(); 2$url_list = $db_obj->ProductDataSelect($shop_name);

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

なし
エラーは発生しておらず catch の方にも処理は流れてきませんでした。

試したこと

function DBconnect を当初 __construct で処理していましたが、WpIdCheck でアクセスできなくてから共通ではダメなのかと考え各function で一番初めに以下処理を追加しました。
結局解決できませんでしたが。。。

PHP

1$dbh = $this->DBconnect();

非常に単純な内容の可能性もあり申し訳ありませんが、各所にエラーログを仕込んでも解決に至りませんでした。

補足情報(FW/ツールのバージョンなど)

ローカル MAMP環境
php7.1.23
MySQL 5.6.38

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

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

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

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

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

m.ts10806

2019/03/05 00:17

PHPのバージョンは7.xとマイナーバージョンまで正しく記載してください。 ただ、そもそもSqlクラス 閉じ}が足りてないのでシンタックスエラーでそもそも動かないような。
m.ts10806

2019/03/05 00:19

あと大量に全角空白があるのでこのコード、正しく動かないですよ。
NOBUTUNA

2019/03/05 00:49

返答ありがとうございます。 全角は確認しましたが実ソースコード上では一つもありませんでした。 クラスの閉じ } 追加いたします。こちらも実コード上では付いておりました
m.ts10806

2019/03/05 00:51

現在のコードが正しく提示されないことには本来必要のないやり取りが発生しますので、そこは工夫していただければと。 コードブロック内は原則、現在のコードのみで補足コメントは外だしされたほうが良いですね。
guest

回答3

0

本件、解決に至りましたので内容を記載いたします。
Sqlクラスをインスタンス化し使用している A file なのですが、このファイルは他ファイルから以下のような形式で呼び出されておりました。

exec("php A_file.php");

上記のような呼ばれ方をしている処理を他file同様 require_once関数でA_fileを読み込み、クラスをインスタンス化して使用することで$dbhの中がnullではなく実行できるようになりました。

投稿2019/03/05 01:53

NOBUTUNA

総合スコア11

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

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

m.ts10806

2019/03/05 02:00

それはまあ、exec()はコマンド実行するだけですからね・・ さすがに今回の質問内容だけでは分からないので、ファイルが複数あって読み込ませているのでしたらそこまで書くようにしてください。 何もないとincludeなりrequireで読み込ませている前提と考えますので。
guest

0

本件、解決に至りましたので内容を記載いたします。
Sqlクラスをインスタンス化し使用している A file なのですが、このファイルは他ファイルから以下のような形式で呼び出されておりました。

exec("php A_file.php");

上記のような呼ばれ方をしている処理を他file同様 require_once関数でA_fileを読み込み、クラスをインスタンス化して使用することで$dbhの中がnullではなく実行できるようになりました。

投稿2019/03/05 01:55

NOBUTUNA

総合スコア11

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

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

0

ベストアンサー

直接の回答ではないですけど

function DBconnect を当初 __construct で処理していましたが、WpIdCheck でアクセスできなくてから共通ではダメなのかと考え

いえ、コンストラクタで接続した結果をプロパティに持てば良いです。

クラス

php

1class Sql 2{ 3 private $dbh = null; 4 private $dbname = "xxx"; 5 private $host = "xxx"; 6 private $user = "xxx"; 7 private $pass = "xxx"; 8 9 function __construct(){ 10 // DB 接続処理 11 try { 12 $dsn = "mysql:dbname=".$this->dbname.";host=".$this->host.";"; 13 $this->dbh = new PDO($dsn, $this->user, $this->pass); 14 $this->dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING); 15 16 } catch (PDOException $e) { 17 echo "DB アクセス失敗"; 18 var_dump($e); 19 die(); 20 } 21 } 22 23 public function getTest() { 24 try { 25 $sql = "SELECT * FROM test WHERE name like :name"; 26 $stmt = $this->dbh->prepare($sql); 27 $param = [':name' => '%test%']; 28 $stmt->execute($param); 29 return $stmt->fetchAll(PDO::FETCH_ASSOC); 30 } catch (PDOException $e) { 31 echo "getTest失敗"; 32 var_dump($e); 33 die(); 34 } 35 } 36}

利用する側

php

1$dbsql = new Sql(); 2var_dump($dbsql->getTest());

newしたときに実行されるコンストラクタでnullだった$dbhに接続情報が入るので、生成されたインスタンスを使えば$dbhは有効です。

投稿2019/03/05 00:31

m.ts10806

総合スコア80850

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問