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

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

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

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

Q&A

解決済

1回答

1725閲覧

PHPデータベースからの返り値がフォルスになる。(値が取得できない)

Chandler_Bing

総合スコア673

PHP

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

0グッド

1クリップ

投稿2021/02/08 05:47

編集2021/02/08 05:58

お疲れ様です。

PHPのPDOオブジェクトを用いた、データベース操作を行っているのですが、値が取得できず、falseになってしまいます。

操作の流れは以下です。

①sselectしたいカラム名をセットした、配列を投げる
②メソッドが、ステートメントを作成する
③PDOのエクセキュートに配列をわたしてレコードを取得する

php

1 //分かりにくいですが、受け取る値は「"キー" => "値"」の連想配列で、 2 // foreach内では、"キー"のみ使用しています。 3 public function makeSelectQuery($array) 4 { 5 $sql = 'select * from members where '; 6 $where_string = ''; 7 8 9 foreach($array as $column => $value){ 10 11 $where_string .= $column . ' = :' . $column; 12 13 if($value !== end($array)){ 14 $where_string .= ' and '; 15 } 16 } 17 18 return $sql = $sql . $where_string; 19 }

log

1// こんな感じになります。 2string(81) "select * from members where password = :password and mail_address = :mail_address" string(1) " "

php

1 /** 2 * メールアドレスとパスワードからメンバーを取得. 3 * 4 */ 5 public function getOneByColumns($array) 6 { 7 try { 8 $sql = $this->makeSelectQuery($array); //←この部分で上記のメソッドを使用し、クエリを作成 9 $statement = $this->db->prepare($sql); 10 $statement->execute($this->makeExecuteArray($array)); 11 $result = $statement->fetchAll(PDO::FETCH_ASSOC); 12 return $result; 13 } catch (PDOException $exception) { 14 return false; 15 } 16 } 17 18 // ["カラム名" => "値"]という形の連想配列を受け取り、 19 // [":カラム名" => "値"]という形の連想配列を作成し、 20 // パラメータと一致するようにしています。 21 public function makeExecuteArray($array) 22 { 23 $return = []; 24 25 foreach($array as $column => $value){ 26 $return[':' . $column] = $value; 27 } 28 29 return $return; 30 }

ソースが落ちたりはしなのですが、レコードを取得できません。
何が問題なのでしょうか。。。。。。
sqlのエラーログにも何も吐かれていません。

★追記★
オブジェクトが生成されていないということはないような気がします。
今朝までは以下のような形で実行し、問題なく値が取得できていたのですが、

拡張性がないので、改良しました。

php

1 $sql = 'SELECT * FROM members WHERE mail_address = ? AND password = ?'; 2 $stmt = $this->db->prepare($sql); 3 $stmt->bindValue(1, $mail_address, PDO::PARAM_STR); 4 $stmt->bindValue(2, $password, PDO::PARAM_STR); 5 $stmt->execute(); 6 $res = $stmt ->fetchAll(PDO::FETCH_ASSOC);

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

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

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

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

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

phper.k

2021/02/08 05:51

$this->db に PDO オブジェクトが正しく代入されていないのでしょうね。
m.ts10806

2021/02/08 05:51

どういうデータをもとにどういう値をリクエストしたのでしょうか。 あと、Exeption握りつぶしてたら起きてるエラーも見えなくなります。
Chandler_Bing

2021/02/08 05:59

追記致しました。 また、リクエストは以下です。 $array = ["password" => "'pass'", "mail_address" => "'address@gmail.com'"];
Chandler_Bing

2021/02/08 06:00

このリクエストを「getOneByColumns」に送信します。。。。。
phper.k

2021/02/08 06:01

聞かれていることがわからないなら、素直にわからないと聞きましょう。 なんとなく受け答えしているようで返答が全くの見当違いです。
phper.k

2021/02/08 06:06

「$this->db に PDO オブジェクトが正しく代入されていない」 これ、どこのコードの部分かはわかっている?
Chandler_Bing

2021/02/08 06:11

$this->db = new PDO($this->dsn, $this->user, $this->password); $this->db->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION); これで接続してます。 今朝までは、レコードを取得できておりましたので、dbの部分は間違っていないように思うのですが。。。。
m.ts10806

2021/02/08 06:15

>Exeption握りつぶしてたら起きてるエラーも見えなくなります。 ここ。 } catch (PDOException $exception) { return false; } 捕捉したExeptionの中身を出力してないので問題が隠れている。 あと「思う」では何一つ伝わらないので、きちんとデバッグするか、コードを全て提示してください。
phper.k

2021/02/08 06:16

> 今朝までは、レコードを取得できておりましたので、dbの部分は間違っていないように思うのですが。。。。 ファクトチェック(=事実確認)しないでそう言う思い込みしてるから「できない」んだよ。 熟練者だって、一発で動くコード書いているわけじゃない。 動かない時にどこがおかしいか調べて、調査して、仮説を立て、試行錯誤してコード書いている。 動くコード教えてもらって、なんとなく動いたらOKってやっていれば、身につかない。 $this->db = new PDO($this->dsn, $this->user, $this->password); var_dump($this->db); とでもやってみて、接続されているかを「推測」するのではなく、「確認」してください。
Chandler_Bing

2021/02/08 06:18

分かりました。 検索する値が 'データ'という風にコーテーションも含めてました。
phper.k

2021/02/08 06:23 編集

第三者が、「原因」とその「対応方法」がちゃんとわかるように、自己解決で質問をクローズしてください。
guest

回答1

0

自己解決

テストデータに誤りがありました。

SQLの検索時に使用する文字をコーテーションで囲んでいたため、

コーテーション付の文字を検索していたので、レコードを取得できておりませんでした。

ありがとうございました。

投稿2021/02/08 06:29

Chandler_Bing

総合スコア673

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

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

m.ts10806

2021/02/08 06:41

変にカタカナ英語使わないほうが良いです。情報が正しく伝わらず、根本理解からも遠ざかります。 書いたとおりにしか動かないプログラミングにおいて勝手解釈は致命的になります。 今からでも直すべき。
m.ts10806

2021/02/08 06:43

そしてExeption握りつぶしたままだと原因調査を放棄しているのと等しいです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問