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

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

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

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

4回答

1581閲覧

空白判定のやり方について

takoyaking

総合スコア19

PHP

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2019/07/24 15:34

編集2019/07/24 15:48

前提・実現したいこと

複数指定して検索できる機能を作りたい
if文でemptyで空文字の箇所を調べてsqlを書いていくしかないのでしょうか?
6つ判定しようとif文を書くと6の階乗個(約750個)のif文を書かなければいけない。
(下記のスクリーンショット参考)

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

if文以外で対処できないか?

該当のソースコード

php

1<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 2<html> 3<head> 4<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 5<title>PHP課題</title> 6</head> 7<body> 8<?php 9try 10{ 11 $dsn = 'mysql:dbname=personal;host=localhost'; 12 $user = 'root'; 13 $password = ''; 14 $dbh = new PDO($dsn,$user,$password); 15 $dbh->query('SET NAMES utf8'); 16 17 $Flag = TRUE; 18 19 $gender=$_POST['gender']; 20 $blood=$_POST['bloodtype']; 21 $kenmei=$_POST['kenmei']; 22 $fromold=$_POST['fromold']; 23 $old=$_POST['old']; 24 $carrier=$_POST['carrier']; 25 $fromcurry=$_POST['fromcurry']; 26 $curry=$_POST['curry']; 27 28 $gender=htmlspecialchars($gender); 29 $blood=htmlspecialchars($blood); 30 $kenmei=htmlspecialchars($kenmei); 31 $fromold=htmlspecialchars($fromold); 32 $old=htmlspecialchars($old); 33 $carrier=htmlspecialchars($carrier); 34 $fromcurry=htmlspecialchars($fromcurry); 35 $curry=htmlspecialchars($curry); 36 37 if(empty($gender)&&empty($blood)&&empty($kenmei)&&(empty($fromold)||empty($old))&&empty($carrier)&&(empty($fromcurry)||empty($curry))) 38 { 39 print '入力されていません'; 40 $Flag=FALSE; 41 } 42 else if(!empty($gender)) 43 { 44 $sql = 'SELECT info.name, info.furigana, info.address, info.gender, 45 info.old, info.birthday, info.marriage, info.bloodtype, 46 kenmei.name AS kenmei, info.phone, info.carrier, info.curry 47 FROM info 48 INNER JOIN kenmei ON info.code = kenmei.id 49 WHERE info.gender = "'.$gender.'"'; 50 //'SELECT * FROM info WHERE name = "'.$namae.'"'; 51 } 52 else if(!empty($blood)) 53 { 54 $sql = 'SELECT info.name, info.furigana, info.address, info.gender, 55 info.old, info.birthday, info.marriage, info.bloodtype, 56 kenmei.name AS kenmei, info.phone, info.carrier, info.curry 57 FROM info 58 INNER JOIN kenmei ON info.code = kenmei.id 59 WHERE info.bloodtype = "'.$blood.'"'; 60 } 61 else if(!empty($kenmei)) 62 { 63 $sql = 'SELECT info.name, info.furigana, info.address, info.gender, 64 info.old, info.birthday, info.marriage, info.bloodtype, 65 kenmei.name AS kenmei, info.phone, info.carrier, info.curry 66 FROM info 67 INNER JOIN kenmei ON info.code = kenmei.id 68 WHERE code = "'.$kenmei.'"'; 69 //$sql = 'SELECT * FROM info WHERE code = "'.$kenmei.'"'; 70 } 71 else if(!empty($fromold)&&!empty($old)) 72 { 73 $sql = 'SELECT info.name, info.furigana, info.address, info.gender, 74 info.old, info.birthday, info.marriage, info.bloodtype, 75 kenmei.name AS kenmei, info.phone, info.carrier, info.curry 76 FROM info 77 INNER JOIN kenmei ON info.code = kenmei.id 78 WHERE info.old BETWEEN "'.$fromold.'"AND"'.$old.'"'; 79 } 80 else if(!empty($carrier)) 81 { 82 $sql = 'SELECT info.name, info.furigana, info.address, info.gender, 83 info.old, info.birthday, info.marriage, info.bloodtype, 84 kenmei.name AS kenmei, info.phone, info.carrier, info.curry 85 FROM info 86 INNER JOIN kenmei ON info.code = kenmei.id 87 WHERE info.carrier = "'.$carrier.'"'; 88 } 89 else if(!empty($fromcurry)&&!empty($curry)) 90 { 91 $sql = 'SELECT info.name, info.furigana, info.address, info.gender, 92 info.old, info.birthday, info.marriage, info.bloodtype, 93 kenmei.name AS kenmei, info.phone, info.carrier, info.curry 94 FROM info 95 INNER JOIN kenmei ON info.code = kenmei.id 96 WHERE info.curry = "'.$fromcurry.'・'.$curry.'"'; 97 } 98 99 //if(!empty($sql)) 100 if($Flag) 101 { 102 $stmt = $dbh->prepare($sql); 103 $stmt->execute(); 104 105 $a = 0; 106 107 while(1) 108 { 109 $rec = $stmt->fetch(PDO::FETCH_ASSOC); 110 if($rec==false&&$a==0) 111 { 112 print '検索結果がありません'; 113 break; 114 } 115 else if($rec==false&&$a==1) 116 { 117 break; 118 } 119 $a = 1; 120 print '<table border="1" cellspacing="0" cellpadding="5">'; 121 print '<tr>'; 122 print '<th>名前</th>'; 123 print '<th>ふりがな</th>'; 124 print '<th>メールアドレス</th>'; 125 print '<th>性別</th>'; 126 print '<th>年齢</th>'; 127 print '<th>誕生日</th>'; 128 print '<th>結婚</th>'; 129 print '<th>血液型</th>'; 130 print '<th>都道府県</th>'; 131 print '<th>電話番号</th>'; 132 print '<th>キャリア</th>'; 133 print '<th>カレーの食べ方</th>'; 134 135 print '</tr>'; 136 print '<tr>'; 137 print '<td>'.$rec['name'].'</td>'; 138 print '<td>'.$rec['furigana'].'</td>'; 139 print '<td>'.$rec['address'].'</td>'; 140 print '<td>'.$rec['gender'].'</td>'; 141 print '<td>'.$rec['old'].'</td>'; 142 print '<td>'.$rec['birthday'].'</td>'; 143 print '<td>'.$rec['marriage'].'</td>'; 144 print '<td>'.$rec['bloodtype'].'</td>'; 145 print '<td>'.$rec['kenmei'].'</td>'; 146 print '<td>'.$rec['phone'].'</td>'; 147 print '<td>'.$rec['carrier'].'</td>'; 148 print '<td>'.$rec['curry'].'</td>'; 149 print '</tr>'; 150 print '</table>'; 151 } 152 153 $dbh = null; 154} 155} 156catch(Exception $e) 157{ 158 print $e; 159} 160 print '</br>'; 161 print'<input type="button" onclick="history.back()" value="戻る">'; 162 163?> 164 165</body> 166</html>

試したこと

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

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

イメージ説明

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

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

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

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

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

mikkame

2019/07/24 15:41

やりたい事は、現状、入力されていません となっているものを、なにがしが入力されていませんにしたいって事?
guest

回答4

0

ベストアンサー

質問の意図がよく分からないが
strpos で特定の文字(空白含む)がある場所が分かる。

繰り返し処理をしないといけないならforeachで回せばいいと思う。

———-

追加
質問の意図を理解したので追加

and検索を実装したいという事ですね。
最初にベースとなるselectからfrom where の始まりまで書いて
空文字でなければ、whereのand文をSQLに追加。
最後にSQL文を実行する。

という考え方で書けば良いかと思います。

コツとしては最初に where 1=1のような全てにマッチするようなwhere文を書いておくと後は必ずandから始めればいいから楽ですね。

あと解決したらSQLインジェクションについても調べて欲しいです。

投稿2019/07/24 15:39

編集2019/07/24 15:48
mikkame

総合スコア5036

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

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

mikkame

2019/07/24 15:40

もしかして、空白ではなく、空文字(からもじ)のことを言ってる?
takoyaking

2019/07/24 15:45

質問が分かりずらくてすみません。 例えば、男女別検索と血液別検索を同時にかけたいとか、都道府県別とキャリア別とカレーの食べ方など複数指定しても検索できる機能を付けたいということです。
takoyaking

2019/07/24 15:46

そうです!空文字判定をしたいということです。
mikkame

2019/07/24 15:49

追加しました。 空文字と空白は違うので質問内容を修正しておいてください。
takoyaking

2019/07/24 15:52

それはif文で空文字判定をするということですか?
mikkame

2019/07/24 15:55

はい、if文で6回で済むはずです。 6!は不要です。 foreachと組み合わせれば1回でもできると思いますが、まずは6回if文でやってみてください
takoyaking

2019/07/24 16:00

if文だと値があった時点で抜けるので6回すべてみることはできないとおもうのですが、抜けない方法がありますでしょうか?
takoyaking

2019/07/24 16:08

elseを使わないif文ということでしょうか?
mikkame

2019/07/24 16:23

はい、elseは使いません
takoyaking

2019/07/24 16:32

なるほど、やってみます!
takoyaking

2019/07/24 16:39

やってみたのですがwhere句に追加する方法がわかりません。
mikkame

2019/07/25 03:28

何がどうわかりませんか?文字の連結方法がわからないのでしょうか?
takoyaking

2019/07/25 04:47

if(empty($gender)&&empty($blood)&&empty($kenmei)&&(empty($fromold)||empty($old))&&empty($carrier)&&(empty($fromcurry)||empty($curry))) { print '入力されていません'; $Flag=FALSE; } if(!empty($gender)&&$Flag) { $where_gender = 'AND info.gender ="' .$gender.'"'; } if(!empty($blood)&&$Flag) { $where_blood = 'AND info.bloodtype ="' .$blood.'"'; } if(!empty($kenmei)&&$Flag) { $where_kenmei = 'AND info.code ="' .$kenmei.'"'; } if(!empty($fromold)&&!empty($old)&&$Flag) { $where_old = 'AND info.old BETWEEN"' .$fromold. '"AND"'.$old.'"'; } if(!empty($carrier)&&$Flag) { $where_carrier = 'AND info.carrier ="' .$carrier.'"'; } if(!empty($fromold)&&!empty($old)&&$Flag) { $where_curry = 'AND info.curry ="' .$fromcurry. '・'.$curry.'"'; } $sql = 'SELECT info.name, info.furigana, info.address, info.gender, info.old, info.birthday, info.marriage, info.bloodtype, kenmei.name AS kenmei, info.phone, info.carrier, info.curry FROM info INNER JOIN kenmei ON info.code = kenmei.id WHERE 1 = 1"' .$where_gender..$where_blood..$where_kenmei..$where_old..$where_carrier..$where_curry.;
takoyaking

2019/07/25 04:47

このように作ったのですが・・・
guest

0

$sql = 'SELECT info.name, info.furigana, info.address, info.gender, info.old, info.birthday, info.marriage, info.bloodtype, kenmei.name AS kenmei, info.phone, info.carrier, info.curry FROM info INNER JOIN kenmei ON info.code = kenmei.id WHERE true '; if($gender){ $sql .= ' AND info.gender ="' .$gender.'"'; } if($blood){ $sql .= ' AND info.bloodtype ="' .$blood.'"'; } ...

if文以外については質問者の書いたものをコピペしただけなので動くかどうか分かりません

投稿2019/07/25 05:09

編集2019/07/25 05:11
hentaiman

総合スコア6415

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

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

takoyaking

2019/07/25 05:30

回答ありがとうございます。 $sqlの部分でsyntax errorが出ているので実行できませんでした。 改善して実行してみます。
hentaiman

2019/07/25 05:33

if文の考え方さえ伝わればいいと思って書いたので、伝わったのなら十分です。 phpに慣れたらPDO使うように改善していってくださいね。
takoyaking

2019/07/25 05:35

ありがとうございます。
guest

0

たとえばチェックボックスとdisabledを組み合わせて処理するとか

javascript

1<?PHP 2$flg=filter_input(INPUT_POST,"flg",FILTER_VALIDATE_INT)===1; 3$a=filter_input(INPUT_POST,"a"); 4$b=filter_input(INPUT_POST,"b"); 5$c=filter_input(INPUT_POST,"c"); 6if($flg){ 7 $sql ="select * from tbl where 1 "; 8 $data=[]; 9 if(!is_null($a)){ 10 $sql.="and aaa=? "; 11 $data[]=$a; 12 } 13 if(!is_null($b)){ 14 $sql.="and bbb=? "; 15 $data[]=$b; 16 } 17 if(!is_null($c)){ 18 $sql.="and ccc=? "; 19 $data[]=$c; 20 } 21 print $sql.";<br>\n"; 22 print_r($data); 23} 24?> 25<script> 26window.addEventListener('DOMContentLoaded', function(e){ 27 [].forEach.call(document.querySelectorAll('[type=checkbox]'),x=>{ 28 x.addEventListener('change',e=>{ 29 x.closest('label').nextElementSibling.disabled=!x.checked; 30 }); 31 }); 32}); 33</script> 34<form method="post"> 35<input type="hidden" name="flg" value="1" > 36<label><input type="checkbox">項目A:</label><input type="text" name="a" value="" required disabled><br> 37<label><input type="checkbox">項目B:</label><input type="text" name="b" value="" required disabled><br> 38<label><input type="checkbox">項目C:</label><input type="text" name="c" value="" required disabled><br> 39<input type="submit" value="send"> 40</form> 41

投稿2019/07/25 01:48

編集2019/07/25 04:31
yambejp

総合スコア114769

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

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

takoyaking

2019/07/25 04:56

回答ありがとうございます。 $sql.="and bbb=? ";  という文は$sqlに="and bbb=? "を結合するということでしょうか? それだとしたら=は必要でしょうか?
yambejp

2019/07/25 05:09

実際に入力してサブミットすれば どういったsqlが生成されるかわかりますよね?
takoyaking

2019/07/25 05:11

わかりました。実行してみます。
guest

0

「検索条件が空白でなかったらand条件に追加」でしたら私の過去回答参考になるのではと。

要は、配列に詰め込んでおいて、andでimplode()。
配列の件数でwhereを追加するかどうか判断する。

投稿2019/07/24 21:54

編集2019/07/24 22:38
m.ts10806

総合スコア80850

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

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

takoyaking

2019/07/25 04:52

回答ありがとうございます。参考にしつつプログラミングしていきます。
m.ts10806

2019/07/25 05:03

質問のコード、他の回答についているコメントやコードからすると PHPもSQLも結構めちゃくちゃだと思います。 もう少し簡単な最小構成のコードで文字列を作る練習をしてからのほうが良さそうです。 今仮にしっかりとした解説を受けたり熟練者のコードをもらっても 手に負えずそのコードをそのままで質問をすることになりそうです。
m.ts10806

2019/07/25 05:04 編集

まずはPHPマニュアルを活用できるようになるところからですね。 ※これ(PHPマニュアル活用)ができない人はずっと初心者から抜け出せず、teratailでもずっと「まだこんなこと聞く?」という質問を繰り返している人ばかりです
takoyaking

2019/07/25 05:08

初心者なものですみません。 まだまだ勉強が必要なことは自分でもわかっています。 上級者の質問ができるように勉強したいと思います。
m.ts10806

2019/07/25 05:11

いえ、質問の内容や仕方の話ではないですよ。 あくまでコードの話です。
takoyaking

2019/07/25 05:21

それも含めてということです! ご指摘ありがとうございます。
m.ts10806

2019/07/25 05:23

はい。なので、今の段階からでももう少し簡単なコードから組んでください。 入力項目もはじめは1つから、多くても2,3項目くらいから。 扱う項目数が多ければ多いほどやることが増えて本来すべきことに注力できませんので。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問