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

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

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

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

PHP

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

Q&A

解決済

3回答

1126閲覧

検索条件を追加したい

ariiiiiga

総合スコア66

SQL

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

PHP

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

0グッド

0クリップ

投稿2019/01/23 03:09

前提・実現したいこと

検索後にデータベースの情報を取得する機能をを作っています。、
user_id(完全一致)、name(一部でも可)、shop(一部でも可)の3種類をどれかを検索欄に入力し検索すると、レコードの指定した情報が表示される機能を作りたいです。

下記のコードにuser_id(完全一致)とname(一部でも可)を追加して、検索時にどれかを1つを検索すると入力したカラムと一致した条件が出てくるようにしたいのですが、同じパターンが調べても出てこなかったので教えて頂きたいです。

*データベース接続、検索結果の出力確認済み
よろしくお願いします。

該当のソースコード

<?php function getHostData($params){ if(!isset($params['search'])){ return[]; } //DBの接続情報 try {    $pdo = new PDO('mysql:host=localhost;dbname=mydb;charset=utf8','root','',    array(PDO::ATTR_EMULATE_PREPARES => false));    } catch (PDOException $e) {    exit();    }       //入力された検索条件からSQl文を生成 $where = []; if(!empty($params['shop'])){ $where[] = "shop like '%{$params['shop']}%'"; } if($where){ $whereSql = implode(' AND ', $where); $sql = 'select * from hosts where ' . $whereSql ; }else{ $sql = 'select * from hosts'; } //SQL文を実行する $HostDataSet = $pdo->query($sql); //扱いやすい形に変える $result = []; while($row = $HostDataSet->fetch( PDO::FETCH_ASSOC )){ $result[] = $row; } return $result; } ?> <!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"> <form method="get"> <div class="form-group"> <label for="InputShop">店舗名</label> <input name="shop" class="form-control" id="InputShop" value="<?php echo isset($_GET['shop'])? htmlspecialchars($_GET['shop']) : '' ?>"> </div> <button type="submit" class="btn btn-default" name="search">検索</button> </form> </div>

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

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

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

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

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

yambejp

2019/01/23 05:38

回答にも書きましたが、質問文に user_id、name、shopの相関関係を追記ください ・何が必須で、何と何がand/or検索なのか ・空データをおくったときはどうしたいのか
guest

回答3

0

仕様がちゃんとまとまっていません

user_id(完全一致)、name(一部でも可)、shop(一部でも可)

検索条件は

  • user_idは必須?getされる?
  • nameやshopは両方設定される可能性がある?その時検索条件はor/andどちら?

簡単なsampleだけ

PHP

1<?PHP 2$h=[]; 3$data=[]; 4foreach(["user_id","name","shop"] as $val){ 5 $$val=filter_input(INPUT_GET,$val,FILTER_VALIDATE_REGEXP,["options"=>["regexp"=>"/.+/"]]); 6 $h[$val]=htmlspecialchars($$val); 7} 8$sql = 'select * from hosts where 1 '; 9 10if(!is_null($user_id) and $user_id!==false){ 11 if($user_id!==false){ 12 $sql .="and user_id=? "; 13 $data[]=$user_id; 14 }else{ 15 $sql .="and 0 "; 16 } 17 if($name!==false){ 18 $sql .="and name like ? "; 19 $data[]="%{$name}%"; 20 } 21 if($shop!==false){ 22 $sql .="and shop like ? "; 23 $data[]="%{$shop}%"; 24 } 25 print $sql."<br>"; 26 print_r($data); 27/* 検索部分 28 * $stmt = $pdo->prepare($sql); 29 * $stmt->execute($data); 30 * $rows=$stmt->fetchAll(PDO::FETCH_ASSOC); 31 * print_r($rows); 32 */ 33} 34 35?> 36<form method="get"> 37user_id:<input name="user_id" value="<?=$h["user_id"]?>"><br> 38name:<input name="name" value="<?=$h["name"]?>"><br> 39shop:<input name="shop" value="<?=$h["shop"]?>"><br> 40<input type="submit" value="検索"> 41</form>
  • user_idは必須としました
  • nameとshopはand検索としました

※微調整しました

投稿2019/01/23 03:46

編集2019/01/23 04:08
yambejp

総合スコア114574

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

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

0

ベストアンサー

1.user_id、nameのフォームを追加
2.SQL生成部分にuser_id(完全一致)、name(部分一致)を追加
3.AND検索からOR検索に変更

PHP

1<?php 2function getHostData($params){ 3 if(!isset($params['search'])){ 4 return[]; 5 } 6 //DBの接続情報 7 try { 8 $pdo = new PDO('mysql:host=localhost;dbname=mydb;charset=utf8','root','', 9 array(PDO::ATTR_EMULATE_PREPARES => false)); 10 } catch (PDOException $e) { 11 exit(); 12 } 13 14 //入力された検索条件からSQl文を生成 15 $where = []; 16 if(!empty($params['shop'])){ 17 $where[] = "shop like '%{$params['shop']}%'"; 18 } 19 20 //ユーザーID(完全一致) 21 if(!empty($params['user_id'])){ 22 $where[] = "user_id = '{$params['user_id']}'"; 23 } 24 25 //名前(部分一致) 26 if(!empty($params['name'])){ 27 $where[] = "name like '%{$params['name']}%'"; 28 } 29 30 if($where){ 31// $whereSql = implode(' AND ', $where); 32 // OR検索 33 $whereSql = implode(' OR ', $where); 34 35 $sql = 'select * from hosts where ' . $whereSql ; 36 }else{ 37 $sql = 'select * from hosts'; 38 } 39 40 //SQL文を実行する 41 $HostDataSet = $pdo->query($sql); 42 //扱いやすい形に変える 43 $result = []; 44 while($row = $HostDataSet->fetch( PDO::FETCH_ASSOC )){ 45 $result[] = $row; 46 } 47 return $result; 48} 49?> 50<!DOCTYPE HTML> 51<html lang="ja"> 52<head> 53<meta charset="utf-8" > 54<meta name="viewport" content="width=device-width, initial-scale=1"> 55<title>トップページ</title> 56</head> 57<body> 58<h1 class="col-xs-6 col-xs-offset-3">検索フォーム</h1> 59<div class="col-xs-6 col-xs-offset-3 well"> 60 <form method="get"> 61 <div class="form-group"> 62 <label for="InputShop">店舗名</label> 63 <input name="shop" class="form-control" id="InputShop" value="<?php echo isset($_GET['shop'])? htmlspecialchars($_GET['shop']) : '' ?>"> 64 </div> 65 66 <!-- ユーザーIDのフォームを追加 --> 67 <div class="form-group"> 68 <label for="InputShop">ユーザーID</label> 69 <input name="user_id" class="form-control" id="InputUser" value="<?php echo isset($_GET['user_id'])? htmlspecialchars($_GET['user_id']) : '' ?>"> 70 </div> 71 72 <!-- 名前のフォームを追加 --> 73 <div class="form-group"> 74 <label for="InputShop">名前</label> 75 <input name="name" class="form-control" id="InputName" value="<?php echo isset($_GET['name'])? htmlspecialchars($_GET['name']) : '' ?>"> 76 </div> 77 <button type="submit" class="btn btn-default" name="search">検索</button> 78 </form> 79</div>

投稿2019/01/23 03:35

編集2019/01/23 05:31
mayoi_maimai

総合スコア1583

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

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

ariiiiiga

2019/01/23 04:52

Parse error: syntax error, unexpected '$pdo' (T_VARIABLE) in D:\xampp\htdocs\test\2.php on line 8 8行名:$pdo = new PDO('mysql:host=localhost;dbname=mydb;charset=utf8','root','', このエラーが出るのは何故でしょうか?
mayoi_maimai

2019/01/23 05:13

全角スペースが入っていますね。。 try { $pdo = new PDO('mysql:host=localhost;dbname=mydb;charset=utf8','root','',array(PDO::ATTR_EMULATE_PREPARES => false)); } catch (PDOException $e) { exit(); }
ariiiiiga

2019/01/23 07:20

解決できました!ありがとうございます! 検索欄を1つにまとめることはできないでしょうか?
mayoi_maimai

2019/01/23 07:40

1つにまとめるとは?? 改行しないでフォームを一列に並べるということでしょうか??
ariiiiiga

2019/01/23 08:18

<label for="InputShop">店舗名</label> <input name="shop" class="form-control" id="InputShop" value="<?php echo isset($_GET['shop'])? htmlspecialchars($_GET['shop']) : '' ?>"> 今上記のような検索欄が3つあるのですが、1つだけ残して3つ分の機能があるようなイメージです。
mayoi_maimai

2019/01/23 08:29

無理ですw どれを残しても一応動きますが、店舗を残せば店舗のみ、名前を残せば名前のみ。 データはフォームから送られてくるので一つのフォームで複数処理は無理です。 検索条件の数分フォームが必要です。
ariiiiiga

2019/01/23 08:32

わかりました! ありがとうございます!
guest

0

php

1 //入力された検索条件からSQl文を生成 2 $where = []; 3 if(!empty($params['shop'])){ 4 $where[] = "shop like '%{$params['shop']}%'"; 5 } 6 if(!empty($params['user_id'])){ 7 $where[] = "user_id = '{$params['user_id']}'"; 8 } 9 if(!empty($params['name'])){ 10 $where[] = "name like '%{$params['name']}%'"; 11 }

html

1 <input name="shop" class="form-control" id="InputShop" value="<?php echo isset($_GET['shop'])? htmlspecialchars($_GET['shop']) : '' ?>"> 2 <input name="user_id" class="form-control" id="InputUserId" value="<?php echo isset($_GET['user_id'])? htmlspecialchars($_GET['user_id']) : '' ?>"> 3 <input name="name" class="form-control" id="InputName" value="<?php echo isset($_GET['name'])? htmlspecialchars($_GET['name']) : '' ?>">

の追加ではだめですか?

getHostDataの部分の記載がないのでuser_idnameを加える手法は不明

投稿2019/01/23 03:18

編集2019/01/23 06:28
rururu3

総合スコア5545

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

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

ariiiiiga

2019/01/23 04:59

shopとuser_idは全件表示になってしまい、 nameだと Fatal error: Uncaught Error: Call to a member function fetch() on boolean in D:\xampp\htdocs\test\1.php:45 Stack trace: #0 D:\xampp\htdocs\test\1.php(76): getHostData(Array) #1 {main} thrown in D:\xampp\htdocs\test\1.php on line 45 45行目 while($row = $HostDataSet->fetch( PDO::FETCH_ASSOC )){ このエラーが出てしまいました。
rururu3

2019/01/23 06:27

input name部分変えてませんでしたね。編集します
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問