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

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

ただいまの
回答率

88.10%

PHP fetchAllについて

受付中

回答 2

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 1,259

score 6

前提・実現したいこと

PHPでfetchallで"goods"よりデータを持ってきたいのですが“non-object”なるエラーが出てしまいます

該当のソースコード

<index.php>
<?php
  require 'common.php';
  $pdo = connect();
  if($_GET['type'] == null){
  $st = $pdo->query("SELECT * FROM goods");
  }else{
  $type = $_GET['type'];
  $st = $pdo->query("SELECT * FROM goods WHERE type=$type");
  $st->closeCursor();
  }
 $goods = $st->fetchAll();
  require 'n_index.php';
?>
<common.php>
<?php
  // session_start();

   function connect() {
     return new PDO("mysql:dbname=shop", "root" , "pass");
   }
 ?>
<n_selected.php><追記>
<?php
//種類を選択して行を取得し送る
    //common.phpでデータべースを指定
    require 'common.php';
    $pdo = connect();

    //n_index.phpで送られた値を取得
    $prepare = $_GET['type'];

    //送られた値とgoodsにあるtypeと同じものを指定し行をSELECTする
    $st = $pdo->query("SELECT * FROM goods WHERE type=$prepare");

    //指定したカラムの全ての値を取得する
    $goods = $st->fetchAll(PDO::FETCH_COLUMN, 0);

    //n_index.phpに戻る
    require 'n_index.php';
?>
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • m.ts10806

    2017/05/29 12:46 編集

    non-objectはどの変数に対して出ていますか?エラーメッセージ全体も含めてそちらも明記してください。

    キャンセル

  • abcdef

    2017/05/30 09:47

    errormessage「Fatal error: Call to a member function fetchAll() on a non-object in C:\xampp\htdocs\php\shop\Main3\index.php on line 10 」  $goods = $st->fetchAll();の記述部分になります  

    キャンセル

  • m.ts10806

    2017/05/30 10:46

    prepareはこちらを参考にしてください。http://php.net/manual/ja/pdo.prepared-statements.php 

    キャンセル

回答 2

0

closeCursorしないでやってみては?

ちなみに$_GET['type'] == nullなど、存在をあらかじめ確認しない
やりかたはあまりおすすめできません。
またWHERE type=$typeのように外からもってきたデータをそのまま
SQL文に流し込むのは書き方は最悪の書き方なので改めて下さい
(できればprepareで処理)
fetchAllするときにはassocの指定もしたほうがいいと思います

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/05/30 09:41

    >yambejp
    ご回答ありがとうございます。 参考にさせていただきます。closeCursorは“Fatal error: Call to a member function execute() on a non-object”のエラー文が出た際に記述するとエラーが消えると別サイトよりの引用になります。

    キャンセル

0

closeCursor
「カーソルを閉じてステートメントを再実行できるようにする」
「他の SQL ステートメントを発行できるようにサーバーへの接続を解放する」
ので、$pdo->query()の結果はfetchAll()等で参照できないんじゃないでしょうか?
fetchAll()にnon-objectのエラーが出ているということはそういうことじゃないかなと。
closeCursor()の後に$stに対してvar_dump()をしてみるとステートメントがどういう状態か確認できます。
今回のケースではyambejpさんの仰るとおりcloseCursor()なしで実行すべきかと思います。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

関連した質問

同じタグがついた質問を見る