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

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

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

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

PHP

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

検索

検索は、あるデータの集まりの中から 目的のデータを見つけ出すことです。

Q&A

解決済

1回答

639閲覧

DBの検索・結果画面作成に日本語入力を使う方法他

dreamers

総合スコア61

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

PHP

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

検索

検索は、あるデータの集まりの中から 目的のデータを見つけ出すことです。

0グッド

0クリップ

投稿2020/01/15 07:15

質問内容

皆様、こんにちは、
初心者です、宜しくお願い致します。

https://www.suzuco.net/entry/php-search/
をカスタマイズして検索・結果画面を作成しようと思っています。
その作業中、いくつか疑問が生じ、質問させていただきます。


初期表示の画面で全データが表示されますが、初期表示の画面でデータを表示させないにはどうすればよろしいものでしょうか

検索初期画面(全データ10件が全て初期表示されます)
イメージ説明


下記ソースコードindex.phpについての質問

(1)

<option value="1" <?php echo isset($_GET['sex']) && $_GET['sex'] == '1' ? 'selected' : '' ?>>男性</option> は <option value="1" >男性</option> でもいいのでしょうか、 <?php echo isset($_GET['sex']) && $_GET['sex'] == '1' ? 'selected' : '' ?> は必要なのでしょうか、何をしているのでしょうか

(2)

<option value="1" <?php echo isset($_GET['sex']) && $_GET['sex'] == '1' ? 'selected' : '' ?>>男性</option> を,下記の様に文字検索に変更できました。 <option value='"男性"'>男性</option>

ただ、上記のvalue='"男性"'のシングルクオーテーションをはずしvalue="男性" としたいのですが、どうしたらいいものでしょうか

該当のソースコード【index.php】

PHP

1 2<?php 3//①データ取得ロジックを呼び出す 4include_once('model.php'); 5$userData = getUserData($_GET); 6?> 7<!DOCTYPE HTML> 8<html lang="ja"> 9<head> 10<meta charset="utf-8" /> 11<meta name="viewport" content="width=device-width, initial-scale=1"> 12<title>PHPの検索機能</title> 13<link rel="stylesheet" href="style.css"> 14<!-- Bootstrap読み込み(スタイリングのため) --> 15<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.0/css/bootstrap.min.css"> 16</head> 17<body> 18<h1 class="col-xs-6 col-xs-offset-3">検索フォーム</h1> 19<div class="col-xs-6 col-xs-offset-3 well"> 20 21 <?php //②検索フォーム ?> 22 <form method="get"> 23 <div class="form-group"> 24 <label for="InputName">名前</label> 25 <input name="name" class="form-control" id="InputName" value="<?php echo isset($_GET['name']) ? htmlspecialchars($_GET['name']) : '' ?>"> 26 </div> 27 <div class="form-group"> 28 <label for="InputSex">性別</label> 29 <select name="sex" class="form-control" id="InputSex"> 30 <option value="0" <?php echo empty($_GET['sex']) ? 'selected' : '' ?>>選択しない</option> 31 <option value="1" <?php echo isset($_GET['sex']) && $_GET['sex'] == '1' ? 'selected' : '' ?>>男性</option> 32 <option value="2" <?php echo isset($_GET['sex']) && $_GET['sex'] == '2' ? 'selected' : '' ?>>女性</option> 33 </select> 34 </div> 35 <div class="form-group"> 36 <label for="InputAge">年齢</label> 37 <select name="age" class="form-control" id="InputAge"> 38 <option value="0" <?php echo empty($_GET['age']) ? 'selected' : '' ?>>選択しない</option> 39 <option value="10" <?php echo isset($_GET['age']) && $_GET['age'] == '10' ? 'selected' : '' ?>>10代</option> 40 <option value="20" <?php echo isset($_GET['age']) && $_GET['age'] == '20' ? 'selected' : '' ?>>20代</option> 41 <option value="30" <?php echo isset($_GET['age']) && $_GET['age'] == '30' ? 'selected' : '' ?>>30代</option> 42 </select> 43 </div> 44 <button type="submit" class="btn btn-default" name="search">検索</button> 45 </form> 46 47</div> 48<div class="col-xs-6 col-xs-offset-3"> 49 <?php //③取得データを表示する ?> 50 <?php if(isset($userData) && count($userData)): ?> 51 <p class="alert alert-success"><?php echo count($userData) ?>件見つかりました。</p> 52 <table class="table"> 53 <thead> 54 <tr> 55 <th>名前</th> 56 <th>性別</th> 57 <th>年齢</th> 58 </tr> 59 </thead> 60 <tbody> 61 <?php foreach($userData as $row): ?> 62 <tr> 63 <td><?php echo htmlspecialchars($row['name']) ?></td> 64 <td><?php echo htmlspecialchars($row['sex'] == 1 ? '男性' : '女性') ?></td> 65 <td><?php echo htmlspecialchars($row['age']) ?></td> 66 </tr> 67 <?php endforeach; ?> 68 </tbody> 69 </table> 70 <?php else: ?> 71 <p class="alert alert-danger">検索対象は見つかりませんでした。</p> 72 <?php endif; ?> 73 74</div> 75</body> 76</html> 77

該当のソースコード【model.php】

PHP

1<?php 2function getUserData($params){ 3 //DBの接続情報 4 include_once('config/database.php'); 5 //DBコネクタを生成 6 $Mysqli = new mysqli($host, $username, $password, $dbname); 7 if ($Mysqli->connect_error) { 8 error_log($Mysqli->connect_error); 9 exit; 10 } 11 //入力された検索条件からSQl文を生成 12 $where = []; 13 if(!empty($params['name'])){ 14 $where[] = "name like '%{$params['name']}%'"; 15 } 16 if(!empty($params['sex'])){ 17 $where[] = 'sex = ' . $params['sex']; 18 } 19 if(!empty($params['age'])){ 20 $where[] = 'age <= ' . ((int)$params['age'] + 9) . ' AND age <= ' . (int)$params['age']; 21 } 22 if($where){ 23 $whereSql = implode(' AND ', $where); 24 $sql = 'select * from users where ' . $whereSql ; 25 }else{ 26 $sql = 'select * from users'; 27 } 28 29 //SQL文を実行する 30 $UserDataSet = $Mysqli->query($sql); 31 //扱いやすい形に変える 32 $result = []; 33 while($row = $UserDataSet-&gt;fetch_assoc()){ 34 $result[] = $row; 35 } 36 return $result; 37}

DB作成のソースコード【ini.sql】

SQL

1CREATE TABLE `users` ( 2 `id` INT UNSIGNED NOT NULL AUTO_INCREMENT, 3 `name` VARCHAR(45) NOT NULL COMMENT '名前', 4 `sex` INT UNSIGNED NOT NULL COMMENT '性別\n1:男\n2:女', 5 `age` INT UNSIGNED NOT NULL COMMENT '年齢', 6 `valid` INT UNSIGNED NOT NULL, 7 PRIMARY KEY (`id`)); 8 9INSERT INTO `users` (`name`, `sex`, `age`, `valid`) VALUES ('田中太郎', '1', '26', '1'); 10INSERT INTO `users` (`name`, `sex`, `age`, `valid`) VALUES ('山田花子', '2', '16', '1'); 11INSERT INTO `users` (`name`, `sex`, `age`, `valid`) VALUES ('高橋正樹', '1', '18', '1'); 12INSERT INTO `users` (`name`, `sex`, `age`, `valid`) VALUES ('金子優子', '2', '31', '1'); 13INSERT INTO `users` (`name`, `sex`, `age`, `valid`) VALUES ('吉井佳子', '2', '21', '1'); 14INSERT INTO `users` (`name`, `sex`, `age`, `valid`) VALUES ('橘勇気', '1', '13', '1'); 15INSERT INTO `users` (`name`, `sex`, `age`, `valid`) VALUES ('小林隆', '1', '39', '1'); 16INSERT INTO `users` (`name`, `sex`, `age`, `valid`) VALUES ('影山夏生', '1', '11', '0'); 17INSERT INTO `users` (`name`, `sex`, `age`, `valid`) VALUES ('加藤裕太', '1', '23', '1'); 18INSERT INTO `users` (`name`, `sex`, `age`, `valid`) VALUES ('後藤由美', '2', '20', '1');

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

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

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

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

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

m.ts10806

2020/01/15 07:46

回答はしてるんですが、要件や角度が違う質問はできれば別々にしていただきたく。
dreamers

2020/01/17 05:19

スイマセン 今後気を付けます
guest

回答1

0

ベストアンサー

SQLインジェクションの脆弱性があるのが気にはなりますが

1
検索時には$_GETでsearchが送信されているのでその存在有無によって一覧を表示させるかどうかを決めては如何でしょうか。
とりあえずはそれでいいはずです。とりあえずは。
要件によっては必須条件の設置など多少作り込みが必要になるかもしれません。

は必要なのでしょうか、何をしているのでしょうか

一行ずつ読みといていきましょう。
PHPマニュアルを利用すれば見えてくるはずです。
「三項演算子」もキーワードです。


ちょっと意味がわからない。
そもそも、この手のマスター系のデータはコードで扱うのが一般的でわざわざ名称にするのは改悪だと思うのですけど。

投稿2020/01/15 07:30

編集2020/01/15 07:35
m.ts10806

総合スコア80850

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

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

m.ts10806

2020/01/15 07:31

要件が全く違う方向性の質問が紛れてるとは…
dreamers

2020/01/17 12:35

ご回答ありがとうございました。 m.ts10806さんのアドバイスに従って、トライしてみます。
m.ts10806

2020/01/17 14:36

「トライしてみる」だと「保留中」だと思うので、「解決済み」にするのは尚早かと。
dreamers

2020/01/21 12:42

m.ts10806さんの投稿に気づかず、返事が遅れスイマセン。 当方の力量では、m.ts10806さんのアドバイスに従い、実装するには、ややしばらく時間を要するかと思いますので、「良いアドバイスをいただく目標は達成」ということで、一旦解決済みにさせていただきました。実装途中で不明な点がでてきましたら、そのときは、またどうぞよろしくお願い致します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問