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

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

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

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

PHP

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

Q&A

解決済

5回答

1579閲覧

検索するまでDBのデータを表示させたくない

ariiiiiga

総合スコア66

MySQL

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

PHP

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

0グッド

0クリップ

投稿2019/01/12 07:45

前提・実現したいこと

検索するまでDBのデータを表示させたくない
エラーはでませんが、ページを開いた段階でデータがすべて表示されてしまいます。

該当のソースコード

index.php <?php include('search.php'); $userData = getUserData($_GET); ?> <!DOCTYPE HTML> <html lang="ja"> <head> <meta charset="utf-8" > <meta name="viewport" content="width=device-width, initial-scale=1"> <title>トップページ</title> </head> <body> <h1 class="col-xs-6 col-xs-offset-3">検索フォーム</h1> <div class="col-xs-6 col-xs-offset-3 well"> <?php //②検索フォーム ?> <form method="get"> <div class="form-group"> <label for="InputName"名前</label> <input name="name" class="form-control" id="InputName" value="<?php echo isset($_GET['name'])? htmlspecialchars($_GET['name']) : '' ?>"> </div> <button type="submit" class="btn btn-default" name="search">検索</button> </form> </div> <div class="col-xs-6 col-xs-offset-3"> <?php if(isset($userData) && count($userData)): ?> <p class="alert alert-success"><?php echo count($userData) ?>件見つかりました。</p> <table class="table"> <thead> <tr> <th>名前</th> </tr> </thead> <tbody> <?php foreach($userData as $row): ?> <tr> <<td><?php echo htmlspecialchars($row['name']) ?></td> </tr> <?php endforeach; ?> </tbody> </table> <?php else: ?> <p class="alert alert-danger">検索対象は見つかりませんでした。</p> <?php endif; ?> </div> </body> </html>
search.php <?php function getUserData($params){ //DBの接続情報 $dbname = "siteDB"; $host = "localhost"; $username = "root"; $password = ""; //DBコネクタを生成 $Mysqli = new mysqli($host, $username, $password, $dbname); $Mysqli->query('SET NAMES utf8'); if ($Mysqli->connect_error) { error_log($mysqli->connect_error); exit; } //入力された検索条件からSQl文を生成 $where = []; if(!empty($params['name'])){ $where[] = "name like '%{$params['name']}%'"; } if($where){ $whereSql = implode(' AND ', $where); $sql = 'select * from users where ' . $whereSql ; }else{ $sql = 'select * from users'; } //SQL文を実行する $UserDataSet = $Mysqli->query($sql); $result = []; while($row = $UserDataSet->fetch_assoc()){ $result[] = $row; } return $result; }

試したこと

ここに問題に対して試したことを記載してください。

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

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答5

0

表示したくない範囲の前と後に
phpコード上で if (count($userData) > 0) : endif;を設けて
検索できる条件を受信している場合(検索結果がある場合)のみ有効にするだけでよいかと。


コードの冒頭で、

include('search.php'); $userData = getUserData($_GET); var_dump($userData); // ←これを付け加えてデータ取得できているか点検するとかしてみては?

ってあるのですが、これ本当に検索処理動いてますか?
getUserData()のコードを見ていないので、
ちゃんと動くのかどうか第三者の目ではわかりかねます。

投稿2019/01/12 07:55

編集2019/01/12 09:49
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

ariiiiiga

2019/01/12 09:33 編集

<div class="col-xs-6 col-xs-offset-3"> <?php if (count($userData) > 0) :?> <p class="alert alert-success"><?php echo count($userData) ?>件見つかりました。</p> <table class="table"> <thead> <tr> <th>名前</th> </tr> </thead> <tbody> <?php foreach($userData as $row): ?> <tr> <<td><?php echo htmlspecialchars($row['name']) ?></td> </tr> <?php endforeach; ?> </tbody> </table> <?php else: ?> <p class="alert alert-danger">検索対象は見つかりませんでした。</p> <?php endif; ?> </div> こういうことでしょうか?
退会済みユーザー

退会済みユーザー

2019/01/12 09:37

実行すれば分かる話を、なぜ聞く? 想定どおりに動かなかったのかな? こちらでは再現実行していないため、テストも含めて質問者さんが頑張ってくれないと解決しませんよ。
ariiiiiga

2019/01/12 09:41

変わりませんでした。
退会済みユーザー

退会済みユーザー

2019/01/12 09:44

twitterやLINEじゃないので、何がどう変わらなかったのか、意図しない動作なのか、誤解が生じないように具体的に書いてほしいです。 そもそも示したコードの場合、count($userData)が0よりも大きい数字を取らないと発揮しないため、 適切に$userDataに検索結果が格納されているかが鍵になります。 検索処理は万全ですか?
ariiiiiga

2019/01/12 09:56

私が質問で添付したコードと比べて表示したときに初めからデータが全て表示されていてなにも変わっていません。 万全だと思います。
退会済みユーザー

退会済みユーザー

2019/01/12 09:59

count()の代わりにarray_count_values($userData)を使えば、配列が持つ値の個数を取得できるので、こっちも試してほしい。
ariiiiiga

2019/01/12 10:00

データベースの内容が配列として表示されていました。
ariiiiiga

2019/01/12 10:07

Warning: array_count_values(): Can only count STRING and INTEGER values! このエラーが出てしまいます。
guest

0

$_GETにsearchというKeyが含まれるかどうかで
search.phpを読み込むかどうか決めては。

投稿2019/01/12 07:48

m.ts10806

総合スコア80850

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

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

ariiiiiga

2019/01/12 09:39

同いう意味でしょうか?
m.ts10806

2019/01/12 10:26

そのままです。 formを送信したときに検索処理をさせたいんですよね? formを送信するとsubmitのsearchも送信されます。 GETに含まれるので取得すれば「検索ボタンが押された」=検索処理をさせる という流れにできます。 初期時点ではsearchというパラメータは存在しないので検索処理を走らせないことができます
guest

0

function getHostData($params){
if(!isset($params['search'])){ <-追加
return[];        <-追加
}

投稿2019/01/16 06:01

ariiiiiga

総合スコア66

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

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

0

自己解決

function getHostData($params){
if(!isset($params['search'])){ <-追加
return[];        <-追加
}

投稿2019/01/16 06:00

ariiiiiga

総合スコア66

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

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

0

根本的な解決のためには考え方を改めたほうがいいと思いますがとりあえず

PHP

1 if(!empty($params['name'])){ 2 $where[] = "name like '%{$params['name']}%'"; 3 }else{ 4 $where[] = "0"; 5 }

だけでもいけるかもしれません

投稿2019/01/15 01:17

yambejp

総合スコア114775

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問