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

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

ただいまの
回答率

89.54%

渡されたIDを元にデータベースからデータを持ってくる

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,024

ryohasegawa

score 120

このコードは、ある講座で使用したログイン時のユーザデータ取得のコードです。
なお下2つのコードは、呼び出しと、SQL実行の関数は別ファイルにあり、SQL実行の関数は2つとも同一ファイルにあります。
ですが、ファイルは呼び出せています。

try {
        $userModel = new \MyApp\Model\User();
    $user = $userModel->login([
        'email' => $_POST['email'],
        'password' => $_POST['password']
    ]);
} catch (\MyApp\Exception\UnmatchEmailOrPassword $e) {
    $this->setErrors('login', $e->getMessage());
    return;
}

//    ログイン
    //  渡されたデータでSQLを組み立てる
  public function login($values) {
    //  ユーザーの取得
    $stmt = $this->db->prepare("select * from users where email = :email");
    $stmt->execute([
      ':email' => $values['email']
    ]);
    //  データはオブジェクトモードで取得
    $stmt->setFetchMode(\PDO::FETCH_CLASS, 'stdClass');
    $user = $stmt->fetch();

    //  ユーザーが存在しない場合
    if (empty($user)) {
      throw new \MyApp\Exception\UnmatchEmailOrPassword();
    }
    // パスワードがマッチしなかった場合
    if (!password_verify($values['password'], $user->password)) {
      throw new \MyApp\Exception\UnmatchEmailOrPassword();
    }
    return $user;
  }


このコードは、呼び出し元から引数で値を渡し、その結果をうまく返しているんですが、これを少しいじって自分で作ってみると上手く動かすエラーが出ます。

$Get_Id = substr($_SERVER['QUERY_STRING'], 3);

//  IDでユーザの情報を探す
try {
    $userModel = new \MyApp\Model\User();
    $user = $userModel->findUser([
        'number' => $Get_Id
    ]);

} catch (\MyApp\Exception\UnmatchUserData $e) {
    $this->setErrors('Get_User', $e->getMessage());
    return;
}


//  引数で指定されたユーザのデータを返す
    public function findUser($values) {
        $stmt = this->db->prepare("select * from users where anumber = :number");
        $stmt->execute([
            ':number' => $values['number']
        ]);
        $stmt->setFetchMode(\PDO::FETCH_CLASS, 'stdClass');
        return $stmt->findUser();
    }


下のエラーが出ます。

Fatal error: Uncaught Error: Call to undefined method PDOStatement::findUser() in /Users/hasegawaryou/Dropbox/alpha/lib/Model/User.php:89 Stack trace: #0 /Users/hasegawaryou/Dropbox/alpha/public/Admin/User_Data/index.php(59): MyApp\Model\User->findUser(Array) #1 {main} thrown in /Users/hasegawaryou/Dropbox/alpha/lib/Model/User.php on line 89

追記です。現状報告

try {
    $userModel = new \MyApp\Model\User();
    $user = $userModel->findUser([
        'number' => $Get_Id
    ]);

} catch (\MyApp\Exception\UnmatchUserData $e) {
    $this->setErrors('Get_User', $e->getMessage());
    return;
}


  //  引数で指定されたユーザのデータを返す
    public function findUser($values) {
        $stmt = $this->db->prepare("select * from users where anumber = ?");
        $stmt->execute([$values['number']]);
        $row=$stmt->fetch(PDO::FETCH_ASSOC);
        return $row;
    }
Fatal error: Uncaught Error: Class 'MyApp\Model\PDO' not found in /Users/hasegawaryou/Dropbox/alpha/lib/Model/User.php:86 Stack trace: #0 /Users/hasegawaryou/Dropbox/alpha/public/Admin/User_Data/index.php(59): MyApp\Model\User->findUser(Array) #1 {main} thrown in /Users/hasegawaryou/Dropbox/alpha/lib/Model/User.php on line 86


yambejp さんの返答を元に書き直したコードです。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

$this->db->query()
しているようですが

$this->db->prepare()
しなくても大丈夫なのでしょうか?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/06/01 23:19

    追記しました。

    キャンセル

  • 2017/06/02 09:32

    MyApp\Model\PDOなんてクラスないよ、といわれていますが
    当該のUser.phpはDropbox側のものですかね?
    なにか参照の仕方が悪いのだとおもいますが?

    キャンセル

  • 2017/06/02 13:02

    一度このsql文を変えて、実際入るであろう値をそのまま書き込んで、実際に欲しい値が帰ってくるかを先に調べた方が良さそうですかね?

    キャンセル

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

  • ただいまの回答率 89.54%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる