お疲れ様です。
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);
$this->db に PDO オブジェクトが正しく代入されていないのでしょうね。
どういうデータをもとにどういう値をリクエストしたのでしょうか。
あと、Exeption握りつぶしてたら起きてるエラーも見えなくなります。
追記致しました。
また、リクエストは以下です。
$array = ["password" => "'pass'", "mail_address" => "'address@gmail.com'"];
このリクエストを「getOneByColumns」に送信します。。。。。
聞かれていることがわからないなら、素直にわからないと聞きましょう。
なんとなく受け答えしているようで返答が全くの見当違いです。
わかりません。。。。
「$this->db に PDO オブジェクトが正しく代入されていない」
これ、どこのコードの部分かはわかっている?
$this->db = new PDO($this->dsn, $this->user, $this->password);
$this->db->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);
これで接続してます。
今朝までは、レコードを取得できておりましたので、dbの部分は間違っていないように思うのですが。。。。
>Exeption握りつぶしてたら起きてるエラーも見えなくなります。
ここ。
} catch (PDOException $exception) {
return false;
}
捕捉したExeptionの中身を出力してないので問題が隠れている。
あと「思う」では何一つ伝わらないので、きちんとデバッグするか、コードを全て提示してください。
> 今朝までは、レコードを取得できておりましたので、dbの部分は間違っていないように思うのですが。。。。
ファクトチェック(=事実確認)しないでそう言う思い込みしてるから「できない」んだよ。
熟練者だって、一発で動くコード書いているわけじゃない。
動かない時にどこがおかしいか調べて、調査して、仮説を立て、試行錯誤してコード書いている。
動くコード教えてもらって、なんとなく動いたらOKってやっていれば、身につかない。
$this->db = new PDO($this->dsn, $this->user, $this->password);
var_dump($this->db);
とでもやってみて、接続されているかを「推測」するのではなく、「確認」してください。
分かりました。
検索する値が
'データ'という風にコーテーションも含めてました。
第三者が、「原因」とその「対応方法」がちゃんとわかるように、自己解決で質問をクローズしてください。
回答1件
あなたの回答
tips
プレビュー