PHPとMySQLでプログラムを作っています。

<slect name=”var”>
<option value=”a”>a
<option value=”b”>b
<option value=”c”>c
<option value=”*”>すべて
</select>
<slect name=”hoo”>
<option value=”い”>い
<option value=”ろ”>ろ
<option value=”は”>は
<option value=”*”>すべて
</select>
というようにhtmlをかき、varとhooの二つの条件を重ねてAND条件にしたいと思っています。
すべてというのはどうやって書けば良いでしょうか。

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:
  • 終了:--
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答8件)

id:esseesse No.1

回答回数192ベストアンサー獲得回数0

ポイント14pt

http://www.hatena.ne.jp/1098698728#

PHPとMySQLでプログラムを作っています。 <slect name=”var”> <option value=”a”>a <option value=”b”>b <option value=”c”>c <option value=”*”>すべ.. - 人力検索はてな

URLはダミーで失礼します。

MySQLに渡すSELECT文をどう書けばいいのかを知りたいということで質問を理解しましたが、間違っていたらすみません。

「全て」の場合はWHERE句に条件を入れなければいいだけです。

・*がない場合の例

SELECT * FROM table WHERE hoo=’い’ AND var=’い’

・varのみ*の場合の例

SELECT * FROM table WHERE hoo=’い’

・fooのみ*の場合の例

SELECT * FROM table WHERE var=’い’

・両方とも*の場合

SELECT * FROM table

質問の趣旨が違いましたらごめんなさい。

id:takeuchi_k

ありがとうございます。

分かりにくい質問ですいません。

$sql=”select * from table var=$var and foo=$foo;

といったSQL文を作成することになるのですが、

「varまたはfooですべてを選んだ場合はAND条件を無効にする」という作業をスマートにやる方法はないだろうか、ということです。

if ( $foo == null and $var != null ) {

$sql=( ”select ... var=$var

} else if { ...

なんてふうにif文で分ければいいのでしょうけど、少しどんくさい感じがして。

$

2004/10/25 21:42:30
id:takasiym No.2

回答回数165ベストアンサー獲得回数0

ポイント14pt

http://www.amazon.co.jp/exec/obidos/ASIN/4881359770/249-9544399-...

Amazon.co.jp: MySQL徹底入門―ウェブに最適な高速フリー・データベース・サーバー: 本: 日本MySQLユーザー会,とみた まさひろ,Soft Agency

上記はMySQL入門書です。

varとhooがDB内のテーブル「tbl_a」のフィールドとして定義されていると仮定します。

「varとhooの二つの条件を重ねてAND条件にしたい」を、

「varとhooの二つの”検索”条件を重ねてAND条件にしたい」

と読み替えますと、

求めるphpスクリプトは、だいたい以下のようになります。

# 動かなかったらゴメンなさい。

=======================================================

<?php

$con=mysql_connect(”servername”,”username”,”password”);

if($var==”*”) {

if($hoo==”*”) {

$hResult=mysql_query(”select var, hoo from tbl_a”);

}

else {

$hResult=mysql_query(”select var, hoo from tbl_a where hoo like $_POST[hoo]”);

}

}

elseif($hoo==”*”) {

$hResult=mysql_query(”select var, hoo from tbl_a where var like $_POST[var]”);

}

else {

$hResult=mysql_query(”select var, hoo from tbl_a where var like $_POST[var] and hoo like $_POST[hoo]”);

}

while($row=mysql_fetch_array($hResult)) {

$vars[]=$row[var];

$hoos[]=$row[hoo];

}

mysql_free_result($hResult);

mysql_close($con);

?>

=======================================================

varとhooが両方すべての場合のsql文は5行目、

varのみがすべての場合のsql文は8行目、

hooのみがすべての場合のsql文は12行目、

すべてという条件がない場合のsql文は15行目になります。

検索結果は、配列変数$vars、$hoosにそれぞれ格納されます。

id:takeuchi_k

ありがとうございます。

やはり、if文でsql文そのものの構造を分けていくのですね。

2004/10/25 21:50:28
id:takasiym No.3

回答回数165ベストアンサー獲得回数0

ポイント14pt

http://www.hatena.ne.jp/1098698728##

PHPとMySQLでプログラムを作っています。 <slect name=”var”> <option value=”a”>a <option value=”b”>b <option value=”c”>c <option value=”*”>すべ.. - 人力検索はてな

間違えました。

文字列内に配列変数を埋め込めない仕様になっている事に留意していませんでした。

すみません。

この回答についてのポイントは不要です。

=======================================================

<?php

$con=mysql_connect(”servername”,”username”,”password”);

if($var==”*”) {

if($hoo==”*”) {

$hResult=mysql_query(”select var, hoo from tbl_a”);

}

else {

$hResult=mysql_query(sprintf(”select var, hoo from tbl_a where hoo like %s”, $_POST[hoo]));

}

}

elseif($hoo==”*”) {

$hResult=mysql_query(sprintf(”select var, hoo from tbl_a where var like %s”, $_POST[var]));

}

else {

$hResult=mysql_query(sprintf(”select var, hoo from tbl_a where var like %s and hoo like %s”, $_POST[var], $_POST[hoo]));

}

while($row=mysql_fetch_array($hResult)) {

$vars[]=$row[var];

$hoos[]=$row[hoo];

}

mysql_free_result($hResult);

mysql_close($con);

?>

=======================================================

varとhooが両方すべての場合のsql文は5行目、

varのみがすべての場合のsql文は8行目、

hooのみがすべての場合のsql文は12行目、

すべてという条件がない場合のsql文は15行目になります。

検索結果は、配列変数$vars、$hoosにそれぞれ格納されます。

id:takeuchi_k

ご丁寧にありがとうございます。

2004/10/25 21:51:10
id:html1983 No.4

回答回数72ベストアンサー獲得回数0

ポイント14pt

http://homepage2.nifty.com/sak/w_sak3/doc/sysbrd/sq_k04.htm

SQL 基礎編 (その四) データ照会 select、where、group by、order by - SAK Streets

すべてが選ばれたフィールドについてのwhere句を生成しないようにすれば、よろしいのではないでしょうか。

id:takeuchi_k

varやfooの値に”*”が指定できれば、

select * from table where var=* and foo=*;

というようになって、スマートに実現できるかと思ったのですが、うまくいきませんでした。

2004/10/25 21:52:55
id:esseesse No.5

回答回数192ベストアンサー獲得回数0

ポイント14pt

http://www.hatena.ne.jp/1098698728

PHPとMySQLでプログラムを作っています。 <slect name=”var”> <option value=”a”>a <option value=”b”>b <option value=”c”>c <option value=”*”>すべ.. - 人力検索はてな

>作業をスマートにやる方法はないだろうか

とのことなので、その方針で。

$varと$hooにはすでに展開済みという条件の下。

$sql = ”select * from table”;

$where = ””;

if($hoo != ”*”) {

if($var != ”*”) {

$where = ” WHERE hoo=’”+$hoo+”’ AND $var=’”+$var+”’”;

} else {

$where = ” WHERE $var=’”+$var+”’”;

}

} else {

if($var != ”*”) {

$where = ” WHERE hoo=’”+$hoo+”’”;

}

}

$sql += $where;

で、$sqlが状態によって4パターンになります。

id:takeuchi_k

ありがとうございます。

2004/10/30 10:59:00
id:swpostit No.6

回答回数11ベストアンサー獲得回数0

ポイント14pt

http://www.mysql.gr.jp/

日本MySQLユーザ会

↑URLはダミーです。

文字列を変数に代入することで少しだけすっきりさせました。

// ベースの SQL 構文

$sql = ”SELECT * FROM table”;

// var 指定あり

if ( $var != ”*” ) {

// hoo 指定あり

if ( $hoo != ”*” ) $sql .= ” WHERE var = $var AND hoo = $hoo”;

// hoo 指定なし

else $sql .= ” WHERE var = $var”;

}

// var 指定なし

else {

// hoo 指定なし

if ( $hoo != ”*” ) $sql .= ” WHERE hoo = $hoo”;

}

$result = mysql_query( $sql, $conn );

できてこの程度だと思います。

id:takeuchi_k

なるほど。

2004/10/30 10:59:20
id:sasada No.7

回答回数1482ベストアンサー獲得回数133

ポイント13pt

http://www.hatena.ne.jp/1098698728?

PHPとMySQLでプログラムを作っています。 <slect name=”var”> <option value=”a”>a <option value=”b”>b <option value=”c”>c <option value=”*”>すべ.. - 人力検索はてな

>varやfooの値に”*”が指定できれば、

>select * from table where var=* and foo=*;

>というようになって、スマートに実現できるかと思ったのですが、うまくいきませんでした。

とのことですが、SQLで「すべて」を表すのは「%(半角)」ですので、

select * from table where var like ”%” and foo like ”%”;

が正解かと思います。

 varとlikeの文字数が固定なら、文字数の数だけ「_(半角アンダーバー)」を使用すればマッチします。

 たとえば、varが1文字、fooが2文字固定なら、

select * from table where var like ”_” and foo like ”__”;

です。

 もっとも、likeはパフォーマンスが落ちるので、泥臭くてもif分で分岐した方がマシなことも多いです。

id:takeuchi_k

泥臭くてもifで分岐ですか。

現実的ですね。

2004/10/30 10:59:54
id:semisig No.8

回答回数1ベストアンサー獲得回数0

ポイント13pt

URLはダミーです。

パフォーマンスが落ちるのが気になりますが

イコールではなく、likeを使用するのはなしでしょうか?

where var like % and foo like %;

id:takeuchi_k

前の方も書いておられました。

パフォーマンスをそれほど気にしないので、検討してみます。

2004/10/30 11:00:25

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません