プロが教える店舗&オフィスのセキュリティ対策術

環境:php5、mysql5

条件検索はできるのですが検索状況の違いによる条件分岐について
どなたがアドバイスをお願いします。
$sql内でWHERE以降を「 if ~ else ~ 」などを使って変更するか
WHILE以降を変更する気がするのですがやり方がよくわかりません。
よろしくお願いします。

以下設定

テーブル  :tbl_item [int]
フィールド1:item_id [int]
フィールド2:cate_id [int] ←他テーブル(名前に変換)
フィールド3:item_name [varchar]
フィールド4:price [decimal]
フィールド5:stock_id [int]   ←他テーブル

条件1:cate_id(プルダウン)を検索条件に加えている時
$sql = "SELECT tbl_item.*, tbl_stock.item_stock FROM tbl_item
LEFT JOIN tbl_stock ON tbl_item.item_id = tbl_stock.item_id
WHERE
tbl_item.cate_id = '" . mysql_real_escape_string( $_GET['cate_id'] ) . "' AND
tbl_item.item_name LIKE '%" . mysql_real_escape_string( $_GET['item_name'] ) . "%' AND
price BETWEEN '" . mysql_real_escape_string( $_GET['price_s'] ) . "' AND '" . mysql_real_escape_string( $_GET['price_e'] ) . "'
ORDER BY tbl_item.item_id desk LIMIT ${_GET['page']}, ${_GET['rows']} ";
$result = mysql_query( $sql ) ;
$num_rows = mysql_num_rows( $result );

条件2:cate_id(プルダウン)を検索条件に加えていない時
$sql = "SELECT tbl_item.*, tbl_stock.item_stock FROM tbl_item
LEFT JOIN tbl_stock ON tbl_item.item_id = tbl_stock.item_id
WHERE
tbl_item.item_name LIKE '%" . mysql_real_escape_string( $_GET['item_name'] ) . "%' AND
price BETWEEN '" . mysql_real_escape_string( $_GET['price_s'] ) . "' AND '" . mysql_real_escape_string( $_GET['price_e'] ) . "'
ORDER BY tbl_item.item_id desk LIMIT ${_GET['page']}, ${_GET['rows']} ";
$result = mysql_query( $sql ) ;
$num_rows = mysql_num_rows( $result );




アイテム数 <?= $num_rows ?> 種類


<? WHILE ( $item = mysql_fetch_array( $result ) ) { ?>



<? $n ++; } ?>

A 回答 (9件)

>>最初のSQL文とあとからのSQL文を両方printで表示させて


>この調べ方がよく解らないです。

ということなので、この部分だけ。

$sqlという変数への代入を書いていますよね?そのあとで$sqlをmysql_query()に渡す代わりに

  print "<br />\nSQL_String = " . $sql;

などとして表示させます。それから別の$sqlへの代入も転記して同じようにprintします。最後にexitを追加して、ここまでで処理を終了させます。で、ブラウザに表示されたSQL文をじっくり比較すれば「どこか違う」ハズです(まったく同じなら違う結果にはならないので)。その違いを元のソースを追いながら考えてください。

(すでに言及されていますが)表示されたSQL文を修正しながらphpMyAdminなどで実行させて「こういう記述にすればOK」となった時点でソースに反映させるのが一番いいです。

この回答への補足

おぉ!!感動でっす!!!
こんな便利な手法があったなんて!!!!
プロの方々はこうやって調べていくのですね。

エラーがでました!!何だかとってもウレシイでっす。
なぜなら、自分で判断ができるから♪
これでエラー内容を表示してくれるから調べることができます!!!

補足日時:2008/02/07 16:17
    • good
    • 0
この回答へのお礼

う~ん。
答えが解るより答えに辿り着くための手法を1つでも
身につけることができてウレシイです。
独学だと何が正しいのかを知らないからそれを自分で知ることができるなんて
何て素晴らしいことでしょう!!

有難う御座いました!!!
多謝!多謝!多謝!多謝!多謝!多謝!多謝!多謝!多謝!多謝!多謝!多謝!多謝!

また、行き詰ったらお願いします!
頑張ります。

お礼日時:2008/02/07 16:31

#連投失礼(汗



差し出がましいようですが・・

>ブラウザ上で真っ白になっているので文法エラーだと思います。

通常エラーがあれば、そのエラー内容が表示されるのがphpです。本番環境ではセキュリティ上の理由でエラー表示を抑制したりしますが、少なくともデバッグ時にはエラー表示を抑制しないのがスジです。

(参考)
  http://www.php.net/manual/ja/function.error-repo …


適宜printなどを挿入して、どこまで動いているのかを確認してください。たとえば

  $num_rows = mysql_num_rows( $result );

の次行に

  print "<br />\nNum_Rows = " . $num_rows;

といった感じでいいと思います。

この回答への補足

なるほど~。
こうやって使うんですね!!

>通常エラーがあれば、その・・・
今までエラー表示させたことないんです。
表示のさせ方がわからなかったです・・・。

>本番環境ではセキュリティ上の理由で
エラーが表示されたら詳しい人に進入されてしまうかもですものね。

>#連投・・・
とんでもないですぅ~。
もっのすごぉ~っく参考になりました。
勉強になりました。
どんなコトでも基本が一番大切ですからね!!

有難うございました。

補足日時:2008/02/07 16:33
    • good
    • 0
この回答へのお礼

先ほどは嬉しくて、ついはしゃいでしまいました。

ご教授頂いたように調べてみるとWHERE以前にエラーがあることがわかりました。
ですので、どちらの条件でも同じ箇所にエラーが発生しています。

表示されたエラーは以下です。
#1064 - Something is wrong in your syntax : 'SQL_String = SELECT tbl_item.*, tbl_stock.item_stock FROM tbl_item LEFT JOIN tbl' 付近 : 1 行目

テーブル構成は以下です。
テーブルI :tbl_item
フィールド1:item_id [int] auto_increment
フィールド2:cate_id [int] ←他テーブル(名前に変換)
フィールド3:item_name [varchar]
フィールド4:price [decimal]
フィールド5:stock_id [int]   ←他テーブル

テーブルII :tbl_stock
フィールド1:item_id [int]
フィールド2:item_stock [int]

となっております。

間違いがないような気がするのですが、
経験者の目からみておかしな箇所はありませんでしょうか?

そして疑問点が1つ。
今回のように一方では答えが返ってきて、一方では返ってこないなどのように
sqlエラーがでてもDBからの希望通りの答えが返ってくる場合もあるのかという点です。

よろしくお願いします。

お礼日時:2008/02/07 18:13

>マニュアルを何十回も何百回も読みなさいとは言わないで下さい。


>悲しくなります・・・。
キツイ事申しますが、「PHPはマニュアル以上のドキュメントはない」です。
教えてくれる人以上に親切なドキュメントです。見れば答えが載ってるわけですから。
人に聞く前に「既にある答え」を知るのは最低限のマナーです。
悲しくなることを承知で申しますが「あと42回読みましょう」
// 42回の所以は42でぐぐりませう。


・・・と書いてみましたが、
これまでの経緯から察するに質問者様の場合はマニュアル読むよりも
原因の究明を行うセンスを磨くと良いと思います。

SQLとの連携の場合は
・SQLクエリをphpで吐き出す前に「正常なSQL」を先に組み立ててdebug
・phpからSQLクエリをechoし、それをDBに直接叩いて正常なクエリか確認
・条件分岐する場合はクエリそのものを変える
・動的パラメータの場合はSQL内にPHP変数を埋め込む
・インジェクション対策
この辺の順序に注力すると開発効率が上がると思いますよ。
質問文では三つ目のものが該当しますが、それ以前にやるべきことが二つあります。
振り分けは「正常に吐き出されるべきSQL文を完璧に構築」してからでも遅くありません。

// 当方的には「SQLクエリ自体がオブジェクト」という理念で
// SQLそのものをクラス化してます。
// 所詮はカラム名、from句、where句、order句などを動的に生成しているだけなので
// setter(動的パラメータ設置)とgetter(SQL取得)さえキッチリ作ってしまえば
// 単一のSQL文を作るのには楽だったりします。
// 実力が上がればサブクエリやLEFT JOINなど実装したりすることも出来ますしね。

直接的な回答にはなっていませんが、参考まで。

この回答への補足

ご指摘有難うございます。
おっしゃる通りなので頑張ります(汗
>原因の究明を行うセンスを磨くと良いと思います。
正におっしゃる通りです。磨きたいです。
>SQLとの連携の場合は
このようにやっていきたいです。

仕事でお金を貰っているわけではなく
仕事の合間に勉強しているので、
かなりやり方が我流なため作ったものを
直接テスト用サーバーに.htaccess認証ファイルに
アップして真っ白表示になるとカッコが抜けているか
DBの名称ミスなんだぁとか、
DB上の数字が返ってこなければDBに接続できていないんだぁ
などなどブラウザ上での変化で調べておりました。
そのため、debugなるものの使い方や文法エラー表示のための
echoやprintなどの使い方(何処に書くべきなのか)が
よく解らないのです。

上手く使いたいと思い調べるのですがエラーがでた後のことは
非常に沢山資料があるのですが、
どうやってエラーを表示させているんだ?という感じです。

きちんと基本を身につけたいので、何か良いサイトやマニュアルの
どの辺りをよく読めば良いのか教えて頂けると有難いです。

補足日時:2008/02/07 14:59
    • good
    • 0
この回答へのお礼

色々アドバイスをいただき有難うございました。

phpで吐き出した文をphpmyadminから操作すると
単なるselect文まで縮めてもエラーがでるし、
最後はサーバーから直接試したら普通に抽出されるし、

結局何がいけないのか解らずじまいです。
どうやら、皆さんのお話ではsql文がダメだということらしいですが、
phpmyadminではエラー。
サーバーから直接命令すればOK。
phpからでもできたりできなかったりと
色々知ることはできても結局何の解決にもなりませんでした。

どうやら、
ここで質問するにはかなりの実務経験者の方しか相手にして頂けないようですね...。

もぅ少し、解るようになったら登場します。
最も、その時は聞く必要もないかもしれませんが・・・。

有難うございました。
今まで誰にも聞いたこと無くて全部1人でやってきたので、
これからも負けじと頑張ります。

お礼日時:2008/02/08 02:02

> ただ、「SELECT~FROM~」、「LEFT JOIN~ON~」、「ORDER BY~」は皆


> さん同じですね。
私は質問にあったSQL文字列をコピペしただけですので、
SQLの保証はしていません。
個人的にLEFT JOINは使わない派です^^;
直感的に分かりづらいので。

> 残念ながら、なぜか今回のにも挑戦したのですが上手く動作しません。
何を以って『上手く動作しない』のでしょうか?
$result = mysql_query( $sql ) ;を実行後にMySQL側のSQL文法エラーが
発生していない事は確認しましたか?
また、正しくSQLが発行されたとしても、それが意図するレコードを取得してくれていないのですか?
PHPは関係なく、意図するレコードを取得してくれるSQLは2パターン出来上がっていますか?

> この最後には『;』をつけなくても良いのですか?
いりません。(確か、あっても動作しますが)
そこら辺を気にしないとSQLインジェクションという脆弱性に絡んできます。
(MySQLはバージョンによってはSQLの文法エラーになるか、回避されるか
だった気もしますが)

> >if (条件1:cate_id(プルダウン)を検索条件に加えている時) {
> のif()の中には、この場合どのように書いたら良いのでしょうか?
0 選択なし
1 選択A
2 選択B
というプルダウンであり、要素の名前がcate_idだった時、
if ($_GET['cate_id'] == 1 or $_GET['cate_id'] == 2) {
などとなるはずです。
ここはMySQLのお話とは関係なしです。どう制御したいか、というお話になります。

この回答への補足

お世話になっております。
>個人的にLEFT JOINは使わない派です^^;
使わなくてもできるのですね。
勉強になりました。

>何を以って『上手く動作しない』のでしょうか?
ブラウザ上で真っ白になっているので文法エラーだと思います。
原因は只今格闘中です(汗

>いりません。(確か、あっても動作しますが)
わかりました。

>>>if (条件1:cate_id(プルダウン)を検索条件に加えている時) {
のご教授に対する質問なのですが、
cate_idは別テーブルで固定数のものではないので、増減をしてしまいます。
自分の力量を考えて、(条件1:cate_id(プルダウン)を検索条件に加えている時)を基準に
するのではなく、(条件2:cate_id(プルダウン)を検索条件に加えていない時)を基準にsql文を
作りたいと思います。
現在、プルダウンメニューは
<select name="cate_id">
<option value=>指定しない
と作ってあります。その時のif文は
if ($_GET['cate_id'] == '') {
これで宜しいのでしょうか?
また、本来は以下のように作るべきなのでしょうか?
<select name="cate_id">
<option value=0>指定しない

ご指摘お願い致します。

補足日時:2008/02/07 15:33
    • good
    • 0
この回答へのお礼

色々、有難うございます。
結局、今のところできませんでした。

でも、諦めずに頑張ります。

有難うございました。

お礼日時:2008/02/08 02:04

>この最後には『;』をつけなくても良いのですか?



つけなくても良いです(というかつけてはいけません)。

「検索できなくなる」という件ですが、最初のSQL文とあとからのSQL文を両方printで表示させて違いを見れば(ブラウザの表示では見つけにくいのでブラウザのソース表示から切り出してエディタなどに貼り付けて)MySQLに投げているSQLが必ず違っているハズです。

この回答への補足

お世話になります。

>つけなくても良いです(というかつけてはいけません)。
わかりました。

>最初のSQL文とあとからのSQL文を両方printで表示させて
この調べ方がよく解らないです。
>>条件1:cate_id(プルダウン)を検索条件に加えている時
を例にprint表示をさせるにはどうすれば良いのかを教えて頂けると有難いです。
そうすれば、自分でも調べることができるようになるので是非、是非、教えて下さい。
基本過ぎてお恥ずかしいですが呆れて見捨てずに
ご教授お願い致します。

補足日時:2008/02/07 15:21
    • good
    • 0
この回答へのお礼

有難うございます。
調べ方がわかって良かったです。
でも、調べることができるようになった分だけ疑問も増えました。

本に書いてある通りにやってもできないものなのですね。
もっとも、素人でもわかるような間違いだらけのヒドイ本もありますが...。

今回、初めて聞いてみて色々な方のアドバイスから沢山のことを
知ることができたので、も少し調べながらやってみます。

頑張ります。
有難うございました!!

お礼日時:2008/02/08 02:17

違いがあるのって


tbl_item.cate_id = '" . mysql_real_escape_string( $_GET['cate_id'] ) . "' AND
ここだけですよね?

$sql = "SELECT tbl_item.*, tbl_stock.item_stock FROM tbl_item
LEFT JOIN tbl_stock ON tbl_item.item_id = tbl_stock.item_id
";
$where = "WHERE ";
if (条件1:cate_id(プルダウン)を検索条件に加えている時) {
$where = "tbl_item.cate_id = '" . mysql_real_escape_string( $_GET['cate_id'] ) . "' AND "
}
$where .= "tbl_item.item_name LIKE '%" . mysql_real_escape_string( $_GET['item_name'] ) . "%' AND
price BETWEEN '" . mysql_real_escape_string( $_GET['price_s'] ) . "' AND '" . mysql_real_escape_string( $_GET['price_e'] ) . "'
ORDER BY tbl_item.item_id desk LIMIT ${_GET['page']}, ${_GET['rows']} "
$sql .= $where;

echo $sql;
$result = mysql_query( $sql ) ;
$num_rows = mysql_num_rows( $result );

これで十分だと思いますけど・・・。
生成されたSQL文をechoしておいて、思いどおりの結果が得られないなら、
echoされたSQL文をMySQL側で直接流して、ともかくSQLが正しくなる状態がわかってから、
PHPでの『SQL生成制御処理』に手を加えれて、echoで確認すればいいと思います。
つまり、PHPに書くSQLは『動作が保証されているSQL』である前提があれば、
問題の早期発見も出来るはずです。

あと、変数を文字列に設定するとき、命令を利用している所は
{}を利用していないのに、ただの変数の時は{}を利用していて
分かりづらいので、一切{}を使わない方が良いですよ。

この回答への補足

ご指摘ならびにご教授有難うございます。

同じ結果を出すのにもこんなに沢山の手法があるんですね!
今回だけでも5通りありますね。
ただ、「SELECT~FROM~」、「LEFT JOIN~ON~」、「ORDER BY~」は皆さん同じですね。やはりWHEREと条件分岐に関しては多種多様なのですね・・・。
ネットでも書籍でも自分で調べれば調べる程、やり方が多すぎて、こんがらがってきますです。
残念ながら、なぜか今回のにも挑戦したのですが上手く動作しません。
初心者なのでよくわからないので1つ思ったのですが、
>ORDER BY tbl_item.item_id desk LIMIT ${_GET['page']}, ${_GET['rows']} "
この最後には『;』をつけなくても良いのですか?
あと
>if (条件1:cate_id(プルダウン)を検索条件に加えている時) {
のif()の中には、この場合どのように書いたら良いのでしょうか?

マニュアルを何十回も何百回も読みなさいとは言わないで下さい。
悲しくなります・・・。

ご教授の程、宜しくお願い致します。

補足日時:2008/02/07 02:58
    • good
    • 0

>何も検索されなくなってしまいました。



一応これだけにはレスを(汗

最終的なSQL文を確認してみてください。多分「where」という文字列が抜けていませんか?私は$whereを連結する前のリテラルに入れてることが多いのですが、説明を省略し過ぎましたかね・・。でもSQL文をprintすれば気付きそうな(@言い訳モード)

やはりこう書くべきだったか・・

  $sql = 'select * from ~~ where ' . $where . ' order by ~~';

この回答への補足

お世話になっております。
まずは掲載箇所に誤りがありましたが
↓以下
>>$where .= " AND sale_price BETWEEN '" . mysql_real_escape_string( $_GET['sale_price_s'] ) . "' AND '" . mysql_real_escape_string( $_GET['sale_price_e'] ) . "' ";
正しくは
>>$where .= " AND price BETWEEN '" . mysql_real_escape_string( $_GET['price_s'] ) . "' AND '" . mysql_real_escape_string( $_GET['price_e'] ) . "' ";
です。

>$sql = 'select * from ~~ where ' . $where . ' order by ~~';
↑最初はこのようにして試してみましたがやはり検索されませんでしたので、忠実に修正をしたのですが、検索されませんでした。

何がいけないのでしょうか?
最初の状態から変更してしまうと検索ができなくなってしまいます。

補足日時:2008/02/06 19:45
    • good
    • 0
この回答へのお礼

実は、最初にSQLを書いたときには、

$sql = "SELECT tbl_item.*, tbl_stock.item_stock FROM tbl_item
LEFT JOIN tbl_stock ON tbl_item.item_id = tbl_stock.item_id
WHERE 1 AND
tbl_item.cate_id = '" . mysql_real_escape_string( $_GET['cate_id'] ) . "' AND
tbl_item.item_name LIKE '%" . mysql_real_escape_string( $_GET['item_name'] ) . "%' AND
price between '" . mysql_real_escape_string( $_GET['price_s'] ) . "' AND '" . mysql_real_escape_string( $_GET['price_e'] ) . "'
ORDER BY tbl_item.item_id desc LIMIT ${_GET['page']}, ${_GET['rows']} ";

上記のように書いていたのですが、
何故か未記入で検索ボタンを押すと全件表示される筈が、
表示部分がなくなってしまうので1を削除してコードを作りました。
どのような場合にこのようなことが起こるのでしょうか?

できれば、経験者としての予測を教えて頂きたいと思います。
宜しくお願いします。

お礼日時:2008/02/07 03:20

方法を3つほど紹介します。


とりあえずエスケープはあらかじめやっておきます

$_GET['cate_id'] =mysql_real_escape_string($_GET['cate_id']);
$_GET['item_name'] =mysql_real_escape_string($_GET['item_name']);
$_GET['price_s'] =mysql_real_escape_string($_GET['price_s']);
$_GET['price_e'] =mysql_real_escape_string($_GET['price_e']);

そこで・・・(1)姑息ですが、汎用性があるもの
$sql = <<<eof
SELECT tbl_item.*, tbl_stock.item_stock FROM tbl_item
LEFT JOIN tbl_stock ON tbl_item.item_id = tbl_stock.item_id
WHERE 1
AND ('{$_GET['cate_id']}'='' OR tbl_item.cate_id = '{$_GET['cate_id']}')
AND tbl_item.item_name LIKE '%{$_GET['item_name']}%'
AND price BETWEEN '{$_GET['price_s']}' AND '{$_GET['price_e']}'
ORDER BY tbl_item.item_id desk
LIMIT {$_GET['page']}, {$_GET['rows']}
eof;
ただちょっとオーバーヘッドが気になります。

(2)ちょっとみにくいですがsqlにごみが残りにくいもの
if (!empty($_GET['cate_id'])) $str_cate_id_check="AND tbl_item.cate_id = '".$_GET['cate_id']."'";

$sql = <<<eof
SELECT tbl_item.*, tbl_stock.item_stock FROM tbl_item
LEFT JOIN tbl_stock ON tbl_item.item_id = tbl_stock.item_id
WHERE 1
{$str_cate_id_check}
AND tbl_item.item_name LIKE '%{$_GET['item_name']}%'
AND price BETWEEN '{$_GET['price_s']}' AND '{$_GET['price_e']}'
ORDER BY tbl_item.item_id desk
LIMIT {$_GET['page']}, {$_GET['rows']}
eof;

(3)おもいきってプログラムで制御
たとえば工夫してこんな風にするとよいかと・・・

function cutComment($str,$not_cut=null){
if(is_array($not_cut)){
foreach($not_cut as $val) $vals.=($vals==""?"":"|").$val;
$pettern="/\/\*[^\[]*\[(".$vals.")\](.*?)\*\//mis";
$str=preg_replace($pettern,"$2",$str);
}
$pettern="/\/\*[^\*\/]*\*\//mis";
preg_match_all($pettern,$str,$matches);
$str=str_replace($matches[0],"",$str);
return $str;
}

$sql=<<<eof
SELECT tbl_item.*, tbl_stock.item_stock
FROM tbl_item
LEFT JOIN tbl_stock ON tbl_item.item_id = tbl_stock.item_id
WHERE 1
/*[cate_id]AND tbl_item.cate_id = '{$_GET['cate_id']}' */
AND tbl_item.item_name LIKE '%{$_GET['item_name']}%'
AND price BETWEEN '{$_GET['price_s']}' AND '{$_GET['price_e']}'
ORDER BY tbl_item.item_id desk
LIMIT {$_GET['page']}, {$_GET['rows']}
eof;

//コメントを単純にカットするなら、第2引数をつけない
$sql1=cutComment($sql);
print "<pre>";
print_r($sql1);
print "</pre>";

//コメントをはずしたいものには第2引数を配列でわたす
$sql2=cutComment($sql,Array("cate_id"));
print "<pre>";
print_r( $sql2);
print "</pre>";

ここまでくればもうちょい工夫するとsqlは外部ファイルにして管理できます。

この回答への補足

す、すごいですね!!
回答有難うございます。

かなり高度ですね。
とりあえず、
>(1)汎用性があるもの
ということで自分の力量にあったものからやってみたのですが、
検索されなくなってしまいました。
何回も確認したのですが原因がよく解りません。

どこが、いけないのでしょう・・・。

補足日時:2008/02/06 19:40
    • good
    • 0
この回答へのお礼

詳細な説明やコードを教えて頂き有難うございました。

こんなにスラスラできたら気持ちいいでしょうね!!
あぁ~、羨ましいっ!!

未だ、何がいけないのか解らず、
質問前と同じ状態のままですが頑張ります!!

有難うございました!!

お礼日時:2008/02/08 02:08

基本的にSQL文のwhereを書き替えますね。

データベースに処理させてから取り出すほうが確実に速いですから(というかそうなるように設計すべき)。

  $where = '(1)';  // 必ず設定される条件があればそれを記述してもOK

としておいて、条件が追加のたびに

  $where .= 'and (~追加条件~)';

 などとandで追記しておいてから、

  $sql = 'select * from ~~' . $where . ' order by ~~';

 などとしています。whileのLoopなどで自前でチェックするのは「どうしてもそれしか方法がない」ときだけですね。CASE WHENなどを多用してSQL文が長くなっても実行するデータベースエンジンは気にしませんから。

この回答への補足

アドバイスいただき有難うございます。

ご指示頂いた通りにやってみたのですが、
何も検索されなくなってしまいました。
どこが違っているのか検討がつきません。
再度、ご指摘をお願いします。

また、検索条件が変わった時の書き方が
いまひとつピンとこないのですが
併せてアドバイスをお願いします。

※検索条件の違いによる修正ができないので条件毎に試しました。

以下修正
$where = '(1)';
$where .= " AND tbl_item.cate_id = '" . mysql_real_escape_string( $_GET['cate_id'] ) . "' ";
$where .= " AND item_name like '%" . mysql_real_escape_string( $_GET['item_name'] ) . "%' ";
$where .= " AND sale_price BETWEEN '" . mysql_real_escape_string( $_GET['sale_price_s'] ) . "' AND '" . mysql_real_escape_string( $_GET['sale_price_e'] ) . "' ";

条件1:cate_id(プルダウン)を検索条件に加えている時
$sql = "SELECT tbl_item.*, tbl_stock.item_stock FROM tbl_item
LEFT JOIN tbl_stock ON tbl_item.item_id = tbl_stock.item_id "
. $where . "ORDER BY tbl_item.item_id desk LIMIT ${_GET['page']}, ${_GET['rows']} ";
$result = mysql_query( $sql ) ;
$num_rows = mysql_num_rows( $result );

条件2:cate_id(プルダウン)を検索条件に加えていない時
$sql = "SELECT tbl_item.*, tbl_stock.item_stock FROM tbl_item
LEFT JOIN tbl_stock ON tbl_item.item_id = tbl_stock.item_id "
. $where . "ORDER BY tbl_item.item_id desk LIMIT ${_GET['page']}, ${_GET['rows']} ";
$result = mysql_query( $sql ) ;
$num_rows = mysql_num_rows( $result );

補足日時:2008/02/06 18:46
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!