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

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

ただいまの
回答率

87.49%

#pdoの検索結果を代入した変数$resultがnullになってしまう

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 773

score 13

pdoにて検索した値を$resultに代入しているのですが、それがhtmlで使う時にnullになってしまいます。

いつもお世話になっております。
よろしくお願い致します。

現在、phpにて記事タイトルのtext検索機能を実装しております。

出来ないこと

splで検索し、それを$resultに代入しておりますが、そのresulutの中身がnullになってしまっています。var_dump()でpdo実行後の$resultの中身を見ると値が入っているのですが、それが使えません。
また、ファイルまたぎでのデータの受け渡しではなく、1つのファイルで利用しております。

初学者なので、コードも非常に長く汚いです。見にくくて大変申し訳ありません。
初歩的な質問で申し訳ありませんが、よろしくお願い致します。

以下、ソースコードです。

makeNews.php

if ($_SERVER['REQUEST_METHOD'] === 'GET') {

    if (isSet($_GET['name'])) {
        $name = $_GET['name'];
        try {
          $db = new PDO('mysql:dbname=test_db;host=localhost', 'root', '');
         //この辺りはページャです。
          define('MAX','10');

          $page = $_GET['page'];

          if (isset($_GET['page'])) {
            $now = 1;
          } else {
            $now = $_GET['page_id'];
          }

          if ($now > 1) {
            $start = ($now * 10) - 10;
          } else {
            $start = 0;
          }
         //問題の部分です。
          $result = $db->prepare("
            SELECT *
            FROM news
            WHERE title = ?
            ORDER BY id DESC
            LIMIT {$start}, 10
          ");
          $result->bindValue(1, $name);
          $result->execute();
          $result = $result->fetchAll(PDO::FETCH_ASSOC);
          //ここでvar_dump();を行い$resultを確認すると、検索した値が入っています。

         //以下もページャです。
          $page_num1 = $db->prepare("
            SELECT COUNT(*) id
            FROM news
            WHERE title = :name
          ");
          $page_num1->bindParam(':name', $name, PDO::PARAM_STR);
          $page_num1->execute();
          $page_num1 = $page_num1->fetchColumn();

          $pagination = $page_num1 / 10;
          $pagination = ceil($page_num1 / 10);
          $max_page = ceil($page_num1 / MAX);

        } catch (PDOException $exception) {
            echo $exception->getMessage();
            exit();
        }
    }
}

そして、上記で取得した$resultを使いたいのが

makeNews.php

<?php if ($_SERVER['REQUEST_METHOD'] === 'GET') { ?>
              //結果がなければ該当結果なしと表示されます。今回はこちらの値になってしまいます。
              <?php if (empty($result)) {
               //上記の$resultをvar_dumpすると配列には中身が入っていないことが確認できました。
                ?>
                  <strong>該当する結果はなし。</strong>
              <?php } else { ?>
                <table>
                  <tr>
                    <th>ID</th> <th>タイトル</th> <th>表示時間</th> <th>編集</th> <th>削除</th>
                  </tr>
                  <?php foreach ($result as $value) {?>
                  <tr>
                    <td><?php echo $value['id'] ?></td> <td><?php echo $value['title'] ?></td> <td><?php echo date('Y年m月d日',  strtotime($value['day'])) ?></td> <td><a href="http://iwaki.icoma.jp/edit_news.php?id=<?php echo $value['id'] ?>">編集<a></td> <td><a href="http://iwaki.icoma.jp/delete_news.php?id=<?php echo $value['id'] ?>">削除<a></td>
                  </tr>
                  <?php } ?>
                </table>

どこかで$resultの値がnullに変わってしまっているのでしょうか。
どなたか、ヒントでもなんでも宜しいのでご教授いただけますと幸いです。

値を入れるフォームは

makeNews.php

//日付のフォームは省略しております。

            <label>
                <input type='text' name='name'>
            </label>
            <input type='submit' value='検索'>
            <input type="hidden" name="day" value="<?php echo $_GET['year1'].'-'. $_GET['month1'].'-'. $_GET['date1']; ?>">
            <input type="hidden" name="dayAfter" value="<?php echo $_GET['year'].'-'. $_GET['month'].'-'. $_GET['date']; ?>">
        </form>

行ったこと

ちなみに、このpdoのコードの下に日付での検索コードがあります。
そちらのコードのせいで初期化されているのでしょうか。
一応、そちらも含めたコードを貼っておきます。

makeNews.php

if ($_SERVER['REQUEST_METHOD'] === 'GET') {

    if (isSet($_GET['name'])) {
        $name = $_GET['name'];
        try {
          $db = new PDO('mysql:dbname=test_db;host=localhost', 'root', '');
          define('MAX','10');

          $page = $_GET['page'];

          if (isset($_GET['page'])) {
            $now = 1;
          } else {
            $now = $_GET['page_id'];
          }

          if ($now > 1) {
            $start = ($now * 10) - 10;
          } else {
            $start = 0;
          }
          $result = $db->prepare("
            SELECT *
            FROM news
            WHERE title = ?
            ORDER BY id DESC
            LIMIT {$start}, 10
          ");
          $result->bindValue(1, $name);
          $result->execute();
          $result = $result->fetchAll(PDO::FETCH_ASSOC);

          $page_num1 = $db->prepare("
            SELECT COUNT(*) id
            FROM news
            WHERE title = :name
          ");
          $page_num1->bindParam(':name', $name, PDO::PARAM_STR);
          $page_num1->execute();
          $page_num1 = $page_num1->fetchColumn();

          $pagination = $page_num1 / 10;
          $pagination = ceil($page_num1 / 10);
          $max_page = ceil($page_num1 / MAX);

        } catch (PDOException $exception) {
            echo $exception->getMessage();
            exit();
        }
    }
}

if ($_SERVER['REQUEST_METHOD'] === 'GET') {

  if (isset($_GET["year"]) && isset($_GET["month"]) && isset($_GET["date"])){
      $day = $_GET['year1'].'-'. $_GET['month1'].'-'. $_GET['date1']; 
      $dayAfter = $_GET['year'].'-'. $_GET['month'].'-'. $_GET['date'];
      try {
        $db = new PDO('mysql:dbname=test_db;host=localhost', 'root', '');
        define('MAX','10');

        $page = $_GET['page'];

        if (isset($_GET['page'])) {
          $now = 1;
        } else {
          $now = $_GET['page_id'];
        }

        if ($now > 1) {
          $start = ($now * 10) - 10;
        } else {
          $start = 0;
        }
        $result = $db->prepare("
          SELECT *
          FROM news
          WHERE day BETWEEN ? AND ?
          ORDER BY id DESC
          LIMIT {$start}, 10
        ");
        $result->bindValue(1, $day, PDO::PARAM_STR);
        $result->bindValue(2, $dayAfter, PDO::PARAM_STR);
        $result->execute(array($day,$dayAfter));
        $result = $result->fetchAll(PDO::FETCH_ASSOC);

        $page_num1 = $db->prepare("
          SELECT COUNT(*) id
          FROM news
          WHERE day BETWEEN ? AND ?
        ");
        $page_num1->bindValue(1, $day, PDO::PARAM_STR);
        $page_num1->bindValue(2, $dayAfter, PDO::PARAM_STR);
        $page_num1->execute();
        $page_num1 = $page_num1->fetchColumn();

        $pagination1 = $page_num1 / 10;
        $pagination1 = ceil($page_num1 / 10);
        $max_page = ceil($page_num1 / MAX);


      } catch (PDOException $exception) {
          echo $exception->getMessage("接続できませんでした");
          exit();
      }
  }
}

日付での検索は正しく表示されておりますので、両者の違いを確かめてみましたが特に分かりませんでした。

お手数ですが、エンジニアの先輩方の知識を貸していただけませんでしょうか。
何卒、よろしくお願い致します。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • tech_first

    2020/04/30 15:12

    ご質問いただきありがとうございます。

    別のphpファイルではなく、1つのファイル内で$resultを利用しようとしております。
    スコープの可能性も考えましたが、日付検索も同じ実装でコードが正常に動いているのでその可能性は低いと思っています。
    プリペアドステートメントの件もありがとうございました。

    キャンセル

  • 退会済みユーザー

    退会済みユーザー

    2020/04/30 15:51

    あと、念のため、phpのバージョン、テスト実行している環境のOSとかmysql/mariadbやwebサーバーなどの情報も。

    キャンセル

  • tech_first

    2020/04/30 16:12

    ありがとうございます!
    今後は最初からバージョンなども記載します。

    php 7.1
    mariadb

    です。

    キャンセル

回答 2

checkベストアンサー

+1

isSet()って関数はないから、そのスコープ内のクエリーとか全然実行していないのではないかと。
PHP: isset - Manual
is_set()でもなく、isset()なのです。

もしもコンソール(windowsならコマンド・プロンプト)が使えるなら、

php -l makeNews.php

などとして文法エラーが生じていないかチェックしてください。


$resultとか$page_num1とか、
場面で中身が変わってしまうような使い方は避けるべきです。
例えばSQL文を入れておくなら$sql_*
プリペアドステートメントにしたら$stmt_*
クエリー実行結果は$result_*などとネーミングをルールを決めておかないと、
1週間後、1ヶ月後、1年後などに読み返したときに意味がわからなくなってしまいがちです。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2020/04/30 15:45

    ご回答いただきましてありがとうございます。

    命名規則にまで頭が回っておりませんでした。

    ご回答いただいた内容のissetを直したのですが、検索結果は変わりませんでした。

    isset($result)
    がexecuteの後のvar_dump()で値が入っているということはクエリは実行されていると思っておったのですが、実行されていなかったということでしょうか?

    キャンセル

  • 2020/04/30 15:50

    var_dump()してそれなりに意味のある値が入っているのか、エラーなりに別の値が入っているのかわからないですが。
    var_dump()しているということはちゃんとそこは処理が通過しているということになりますね。
    try~catch()の外側で予め初期化しておくと、どうでしょう?

    キャンセル

  • 2020/04/30 23:31

    なるほど、
    データの初期化はしておりませんでしたし、やったこともありませんでした。

    丁寧にご回答いただきまして、誠にありがとうございます。

    キャンセル

+1

PHPが上下にわかれているのは別ファイルということですか?
セッションなどで渡さない限りページの遷移によって変数は引き継がれません

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2020/04/30 15:13

    お答えいただきありがとうございます。
    こちら同じファイル内での利用となっております。

    質問を編集しておきます。

    キャンセル

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

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

関連した質問

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