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

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

新規登録して質問してみよう
ただいま回答率
85.48%
MySQL

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

PHP

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

Q&A

解決済

4回答

2601閲覧

PHP

tyaduke

総合スコア12

MySQL

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

PHP

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

0グッド

0クリップ

投稿2017/02/14 04:30

###前提・実現したいこと
・作ってる物
現在、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

1<?php 2 $hostserver = ""; //ホストサーバ 3 $user = ""; //ユーザー 4 $password = ""; //パスワード 5 $databasename = ""; //データベース名 6 $datalink = mysqli_connect($hostserver,$user,$password,$databasename); //MySQLへの接続 7 $datalink->set_charset("utf8"); //データベース側の文字コード取得 8 if($datalink->connect_error){ //エラーを返す処理 9 die("接続失敗しました。" .connect_error); 10 exit(); 11 } 12 $keyword = $_GET['movie_search']; //inputの文字列を代入 13 $get_table = "SELECT * FROM movie WHERE Name LIKE '%$keyword%'"; //セレクトのテーブル 14 $sqlquery = mysqli_query($datalink,$get_table); 15 $sqlquery_table = $sqlquery->num_rows; 16 while ($table = mysqli_fetch_assoc($sqlquery)) { 17 $table_rows[] = $table; 18 } 19 ?> 20<!DOCTYPE html> 21<html> 22 <head> 23 <link rel="stylesheet" href="../css/layout.css" type="text/css"> 24 <meta charset="utf-8"> 25 <title><?php echo "「",$keyword,"」の検索結果 - MOVIE_FLIE"; ?></title> 26 </head> 27 <body> 28 <p><?php echo "「",$keyword,"」の検索結果は"; ?><?php echo $sqlquery_table,"件ヒットしました"; ?></p> 29 <table border="1"> 30 <tr> 31 32 <td>Name</td> 33 <td>Year</td> 34 <td>Genre</td> 35 <td>Time</td> 36 </tr> 37 <tr> 38 <?php 39 foreach ($table_rows as $table) { 40 if($table){?> 41 <td><?php print(htmlspecialchars($table["Name"])); //映画作品名?></td> 42 <td><?php print(htmlspecialchars($table["Year"])); //公開した年?></td> 43 <td><?php print(htmlspecialchars($table["Genre"])); //映画ジャンル?></td> 44 <td><?php print(htmlspecialchars($table["Screening_time"])); //上映時間?></td> 45 <?php }else{ 46 print("該当する検索はありません。"); 47 } ?> 48 </tr> 49 <?php } ?> 50 </table> 51 <a class="buttondesign" href="index.html">ホーム</a> 52 </body> 53</html> 54 55

###補足情報(言語/FW/ツール等のバージョンなど)
PHP 7.0.13を使ってます。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

ベストアンサー

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

PHP

1~省略~ 2$table_rows = array(); //←追加 3while ($table = mysqli_fetch_assoc($sqlquery)) { 4 $table_rows[] = $table; 5} 6~省略~

投稿2017/02/14 04:41

ttyp03

総合スコア16998

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tyaduke

2017/02/14 05:03

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

0

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


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

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

SQL

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

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

SQL

1INSERT INTO `movie_info` 2 (`movieid`, 3 `movie_name`) 4VALUES (NULL, 5 'おおきなほげお'), 6 (NULL, 7 'ほげとふが'), 8 (NULL, 9 'はらぺこぴよむし'), 10 (NULL, 11 'ほげほげたちのいるところ'), 12 (NULL, 13 '長靴をはいたほげら'), 14 (NULL, 15 'fooとbarはともだち'), 16 (NULL, 17 'みにくいspamの子'), 18 (NULL, 19 'いないいないばあ'), 20 (NULL, 21 'おおきなはむ'), 22 (NULL, 23 'ネタ切れ')

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

PHP

1<?php 2ini_set("display_errors", 1); 3error_reporting(E_ALL); 4 5function h($str) 6{ 7 return htmlspecialchars($str, ENT_QUOTES, "UTF-8"); 8} 9 10$movies_data = array(); 11$result_count = 0; 12if (filter_input(INPUT_GET, "movie_search")) { 13 $data_link = mysqli_connect("localhost", "root", "password", "movie_info"); 14 15 if (mysqli_connect_errno()) { 16 echo "接続エラー: " . mysqli_connect_error(); 17 exit(); 18 } else { 19 mysqli_set_charset($data_link, "utf8"); 20 } 21 22 $sql = "SELECT * FROM `movie_info` WHERE `movie_name` LIKE ?"; 23 if ($stmt = mysqli_prepare($data_link, $sql)) { 24 $search_word = filter_input(INPUT_GET, "movie_search"); 25 $search_word = "%{$search_word}%"; 26 mysqli_stmt_bind_param($stmt, "s", $search_word); 27 mysqli_stmt_execute($stmt); 28 $result = mysqli_stmt_get_result($stmt); 29 $result_count = mysqli_num_rows($result); 30 while ($data = mysqli_fetch_assoc($result)) { 31 $movies_data[] = $data; 32 } 33 mysqli_stmt_close($stmt); 34 } 35 mysqli_close($data_link); 36} 37?> 38<!DOCTYPE html> 39<html lang="ja"> 40<head> 41 <meta charset="utf-8"> 42 <title><?= "「" . h(filter_input(INPUT_GET, "movie_search")) . "」の検索結果" ?></title> 43 <style type="text/css"> 44 body { 45 margin: 0; 46 padding: 0; 47 } 48 49 table, td, th { 50 border: 1px solid #000000; 51 } 52 </style> 53</head> 54<body> 55<form action="" method="get"> 56 <label> 57 映画名: 58 <input type="text" name="movie_search" value=""> 59 </label> 60 <input type="submit"> 61</form> 62<?php if ($result_count !== 0): ?> 63 <p><?= "「" . h(filter_input(INPUT_GET, "movie_search")) . "」の検索結果は{$result_count}件ヒットしました" ?></p> 64 <table> 65 <tr> 66 <th>id</th> 67 <th>name</th> 68 </tr> 69 <?php foreach ($movies_data as $value): ?> 70 <tr> 71 <td> 72 <?= h($value["movieid"]) ?> 73 </td> 74 <td> 75 <?= h($value['movie_name']) ?> 76 </td> 77 </tr> 78 <?php endforeach; ?> 79 </table> 80<?php else: ?> 81 <p><?= "「" . h(filter_input(INPUT_GET, "movie_search")) . "」の検索結果は{$result_count}件ヒットしました。" ?></p> 82 <p>該当する結果はありません。</p> 83<?php endif; ?> 84<a class="buttondesign" href="#">ホーム</a> 85</body> 86</html>

投稿2017/02/14 08:48

s8_chu

総合スコア14731

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tyaduke

2017/02/14 10:01

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

0

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

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

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

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

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

投稿2017/02/14 05:06

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tyaduke

2017/02/14 05:19

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

退会済みユーザー

2017/02/14 05:36

大体コピペで動かしている時期だと思いますが、参考にするサンプルを選んだほうがイイです。セキュリティ的に誤ったサンプルも大量に存在するので。 あと、できれば、エラーはちゃんと検索して、指摘箇所を理解して下さい。 それと、ここを読んで理解できるようになると、いろいろ理解が早くなります。変なブログを参考にするより、まずマニュアルを参考にして下さい。 https://secure.php.net/manual/ja/index.php 最後に、質問はちゃんと求める結果を書かないと、質問として成立しないですよ。がんばって^^
退会済みユーザー

退会済みユーザー

2017/02/14 09:06

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

2017/02/14 09:23

マイナスというと 「->」のような所でしょうか?
退会済みユーザー

退会済みユーザー

2017/02/14 09:28

いえ、低評価が一票入っていたので。 どっか間違った回答をしているのかもしれません。 低評価を入れた人が理由を書いてくれると分かるんですけど、ちょっと今どこが間違っているかは不明です。 tyaduke さんに余計な混乱させてすみません^^;
guest

0

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

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

投稿2017/02/14 04:51

yambejp

総合スコア114769

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yambejp

2017/02/14 04:54

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問