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

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

ただいまの
回答率

90.34%

  • PHP

    21316questions

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

  • MySQL

    6164questions

    MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

解決済

回答 4

投稿

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

tyaduke

score 4

前提・実現したいこと

・作ってる物
現在、PHPを使った検索システムを作っています。

・問題になっている所
HTMLのフォームタグの情報をMySQLにアクセスし、PHPで出力しています。
データベースにないものを検索するとエラーが発生します。

発生している問題・エラーメッセージ

Notice: Undefined variable: table_rows in C:\xampp\htdocs\movie_flie\html\search.php on line 39
Warning: Invalid argument supplied for foreach() in C:\xampp\htdocs\movie_flie\html\search.php on line 39

該当のソースコード

<?php
  $hostserver = "";  //ホストサーバ
  $user = ""; //ユーザー
  $password = ""; //パスワード
  $databasename = ""; //データベース名
  $datalink = mysqli_connect($hostserver,$user,$password,$databasename); //MySQLへの接続
  $datalink->set_charset("utf8"); //データベース側の文字コード取得
    if($datalink->connect_error){ //エラーを返す処理
        die("接続失敗しました。" .connect_error);
        exit();
    }
  $keyword = $_GET['movie_search']; //inputの文字列を代入
  $get_table = "SELECT * FROM movie WHERE Name LIKE '%$keyword%'"; //セレクトのテーブル
  $sqlquery = mysqli_query($datalink,$get_table);
  $sqlquery_table = $sqlquery->num_rows;
    while ($table = mysqli_fetch_assoc($sqlquery)) {
      $table_rows[] = $table;
    }
 ?>
<!DOCTYPE html>
<html>
  <head>
    <link rel="stylesheet" href="../css/layout.css" type="text/css">
    <meta charset="utf-8">
    <title><?php echo "「",$keyword,"」の検索結果 - MOVIE_FLIE"; ?></title>
  </head>
  <body>
    <p><?php echo "「",$keyword,"」の検索結果は"; ?><?php echo $sqlquery_table,"件ヒットしました"; ?></p>
    <table border="1">
      <tr>

        <td>Name</td>
        <td>Year</td>
        <td>Genre</td>
        <td>Time</td>
      </tr>
      <tr>
        <?php
            foreach ($table_rows as $table) {
              if($table){?>
                <td><?php print(htmlspecialchars($table["Name"]));  //映画作品名?></td>
                <td><?php print(htmlspecialchars($table["Year"]));  //公開した年?></td>
                <td><?php print(htmlspecialchars($table["Genre"])); //映画ジャンル?></td>
                <td><?php print(htmlspecialchars($table["Screening_time"]));  //上映時間?></td>
              <?php }else{
                print("該当する検索はありません。");
              } ?>
      </tr>
      <?php } ?>
    </table>
    <a class="buttondesign" href="index.html">ホーム</a>
  </body>
</html>

補足情報(言語/FW/ツール等のバージョンなど)

PHP 7.0.13を使ってます。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 4

checkベストアンサー

+6

$table_rowsが未定義のままforeachに使っているからですね(配列として認識されていない)
なので、事前にこの変数は配列ですよ、と初期化しておけばよいと思います。

~省略~
$table_rows = array();         //←追加
while ($table = mysqli_fetch_assoc($sqlquery)) {
    $table_rows[] = $table;
}
~省略~

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/02/14 14:03

    回答ありがとうございます。
    $table_rowsを定義したおかけでうまくエラーが解決できました。

    キャンセル

+3

席を外している間に解決済みになってしまいましたが、先ほど書いた回答をおいておきます。 何かの役に立つことが出来れば嬉しいです。


die()exit()と続けて記述している部分がありますが、どちらかひとつだけで十分だと思います。htmlspecialcharsを複数個所で使用する場合は関数化してしまうと良いと思います。また、mysqliを使う特別な理由がないならば、複数のベータベースに対応することができるPDOを使用することをお勧めします。
今回データベースの構造などが不明だったので、そこから定義しています。

まず、データベースを以下のように定義します。

CREATE TABLE `movie_info`(
    `movieid` INT(11) UNSIGNED NOT NULL,
    `movie_name` VARCHAR(255) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT ''
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_unicode_ci;


次に、作成したデータベースにデータを入れます。

INSERT INTO `movie_info`
            (`movieid`,
             `movie_name`)
VALUES     (NULL,
            'おおきなほげお'),
            (NULL,
             'ほげとふが'),
            (NULL,
             'はらぺこぴよむし'),
            (NULL,
             'ほげほげたちのいるところ'),
            (NULL,
             '長靴をはいたほげら'),
            (NULL,
             'fooとbarはともだち'),
            (NULL,
             'みにくいspamの子'),
            (NULL,
             'いないいないばあ'),
            (NULL,
             'おおきなはむ'),
            (NULL,
             'ネタ切れ')


その後、コードを書いていきます。詳しい道程は省略します。

<?php
ini_set("display_errors", 1);
error_reporting(E_ALL);

function h($str)
{
    return htmlspecialchars($str, ENT_QUOTES, "UTF-8");
}

$movies_data = array();
$result_count = 0;
if (filter_input(INPUT_GET, "movie_search")) {
    $data_link = mysqli_connect("localhost", "root", "password", "movie_info");

    if (mysqli_connect_errno()) {
        echo "接続エラー: " . mysqli_connect_error();
        exit();
    } else {
        mysqli_set_charset($data_link, "utf8");
    }

    $sql = "SELECT * FROM `movie_info` WHERE `movie_name` LIKE ?";
    if ($stmt = mysqli_prepare($data_link, $sql)) {
        $search_word = filter_input(INPUT_GET, "movie_search");
        $search_word = "%{$search_word}%";
        mysqli_stmt_bind_param($stmt, "s", $search_word);
        mysqli_stmt_execute($stmt);
        $result = mysqli_stmt_get_result($stmt);
        $result_count = mysqli_num_rows($result);
        while ($data = mysqli_fetch_assoc($result)) {
            $movies_data[] = $data;
        }
        mysqli_stmt_close($stmt);
    }
    mysqli_close($data_link);
}
?>
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="utf-8">
    <title><?= "「" . h(filter_input(INPUT_GET, "movie_search")) . "」の検索結果" ?></title>
    <style type="text/css">
        body {
            margin: 0;
            padding: 0;
        }

        table, td, th {
            border: 1px solid #000000;
        }
    </style>
</head>
<body>
<form action="" method="get">
    <label>
        映画名:
        <input type="text" name="movie_search" value="">
    </label>
    <input type="submit">
</form>
<?php if ($result_count !== 0): ?>
    <p><?= "「" . h(filter_input(INPUT_GET, "movie_search")) . "」の検索結果は{$result_count}件ヒットしました" ?></p>
    <table>
        <tr>
            <th>id</th>
            <th>name</th>
        </tr>
        <?php foreach ($movies_data as $value): ?>
            <tr>
                <td>
                    <?= h($value["movieid"]) ?>
                </td>
                <td>
                    <?= h($value['movie_name']) ?>
                </td>
            </tr>
        <?php endforeach; ?>
    </table>
<?php else: ?>
    <p><?= "「" . h(filter_input(INPUT_GET, "movie_search")) . "」の検索結果は{$result_count}件ヒットしました。" ?></p>
    <p>該当する結果はありません。</p>
<?php endif; ?>
<a class="buttondesign" href="#">ホーム</a>
</body>
</html>

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/02/14 19:01

    ご回答ありがとうございます。
    詳しい詳細を教えてくださりありがとうございます。
    ぜひ、参考にさせていただきます。

    キャンセル

0

ttyp03さんの回答がベストだと思いますが、foreachにはおまじないがあります

foreach ($table_rows as $table) {
↓↓↓
foreach ((array) $table_rows as $table) {

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/02/14 13:54

    あ、でも結局$table_rowsが定義されてないとエラーか・・・

    キャンセル

0

期待する結果が書かれていないので、適当に気になったところを記述します。

・セキュリティ的な問題
DBへのアクセスは、可能な限りプリペアドステートメントを作成して使用して下さい。自力でエスケープしてもイイですが、手っ取り早いです。
あと、出力の一部にだけ htmlspecialchars を使用していますが、なれないうちは全出力に適用した方がいいです。関数でも作って、対応しましょう。

・変数に入るべき値が入らなかった時の挙動
$_GET と $sqlquery, $table_rows は、notice を発生させる可能性があります。
キチンと回避してあげて下さい。
$_GET は filter_input() を使用すると処理が楽です。
$sqlquery は 返り値の FALSE をチェックします。型変換してして無視する方針もありですが、最初はちゃんと調べたほうが理解しやすいと思います。
$table_rows は処理方法によりますが、必要なら foreach の手前で確認したほうが良いです。

・配列として使用する変数の初期化
$table_rows を配列として初期化してあげましょう。
ループの中で使用する変数は、ループの手前で初期化してあげると、分かりやすいです。

とりあえず、思いつくままですが、参考になれば。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/02/14 14:19

    ご回答ありがとうございます。
    PHPを始めて3週間程度だったのでそこまで気が回りませんでした。
    どれも参考になるものばかりです。
    ありがとうございます。

    キャンセル

  • 2017/02/14 14:36

    大体コピペで動かしている時期だと思いますが、参考にするサンプルを選んだほうがイイです。セキュリティ的に誤ったサンプルも大量に存在するので。

    あと、できれば、エラーはちゃんと検索して、指摘箇所を理解して下さい。
    それと、ここを読んで理解できるようになると、いろいろ理解が早くなります。変なブログを参考にするより、まずマニュアルを参考にして下さい。
    https://secure.php.net/manual/ja/index.php

    最後に、質問はちゃんと求める結果を書かないと、質問として成立しないですよ。がんばって^^

    キャンセル

  • 2017/02/14 18:06

    マイナスの理由が知りたいです。

    キャンセル

  • 2017/02/14 18:23

    マイナスというと 「->」のような所でしょうか?

    キャンセル

  • 2017/02/14 18:28

    いえ、低評価が一票入っていたので。
    どっか間違った回答をしているのかもしれません。

    低評価を入れた人が理由を書いてくれると分かるんですけど、ちょっと今どこが間違っているかは不明です。

    tyaduke さんに余計な混乱させてすみません^^;

    キャンセル

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

  • PHP

    21316questions

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

  • MySQL

    6164questions

    MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。