• ベストアンサー

複数検索時の条件分岐について

環境: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 ++; } ?>

  • PHP
  • 回答数9
  • ありがとう数10

質問者が選んだベストアンサー

  • ベストアンサー
  • shimix
  • ベストアンサー率54% (865/1590)
回答No.8

>>最初のSQL文とあとからのSQL文を両方printで表示させて >この調べ方がよく解らないです。 ということなので、この部分だけ。 $sqlという変数への代入を書いていますよね?そのあとで$sqlをmysql_query()に渡す代わりに   print "<br />\nSQL_String = " . $sql; などとして表示させます。それから別の$sqlへの代入も転記して同じようにprintします。最後にexitを追加して、ここまでで処理を終了させます。で、ブラウザに表示されたSQL文をじっくり比較すれば「どこか違う」ハズです(まったく同じなら違う結果にはならないので)。その違いを元のソースを追いながら考えてください。 (すでに言及されていますが)表示されたSQL文を修正しながらphpMyAdminなどで実行させて「こういう記述にすればOK」となった時点でソースに反映させるのが一番いいです。

plinchan
質問者

お礼

う~ん。 答えが解るより答えに辿り着くための手法を1つでも 身につけることができてウレシイです。 独学だと何が正しいのかを知らないからそれを自分で知ることができるなんて 何て素晴らしいことでしょう!! 有難う御座いました!!! 多謝!多謝!多謝!多謝!多謝!多謝!多謝!多謝!多謝!多謝!多謝!多謝!多謝! また、行き詰ったらお願いします! 頑張ります。

plinchan
質問者

補足

おぉ!!感動でっす!!! こんな便利な手法があったなんて!!!! プロの方々はこうやって調べていくのですね。 エラーがでました!!何だかとってもウレシイでっす。 なぜなら、自分で判断ができるから♪ これでエラー内容を表示してくれるから調べることができます!!!

その他の回答 (8)

  • shimix
  • ベストアンサー率54% (865/1590)
回答No.9

#連投失礼(汗 差し出がましいようですが・・ >ブラウザ上で真っ白になっているので文法エラーだと思います。 通常エラーがあれば、そのエラー内容が表示されるのがphpです。本番環境ではセキュリティ上の理由でエラー表示を抑制したりしますが、少なくともデバッグ時にはエラー表示を抑制しないのがスジです。 (参考)   http://www.php.net/manual/ja/function.error-reporting.php 適宜printなどを挿入して、どこまで動いているのかを確認してください。たとえば   $num_rows = mysql_num_rows( $result ); の次行に   print "<br />\nNum_Rows = " . $num_rows; といった感じでいいと思います。

plinchan
質問者

お礼

先ほどは嬉しくて、ついはしゃいでしまいました。 ご教授頂いたように調べてみると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からの希望通りの答えが返ってくる場合もあるのかという点です。 よろしくお願いします。

plinchan
質問者

補足

なるほど~。 こうやって使うんですね!! >通常エラーがあれば、その・・・ 今までエラー表示させたことないんです。 表示のさせ方がわからなかったです・・・。 >本番環境ではセキュリティ上の理由で エラーが表示されたら詳しい人に進入されてしまうかもですものね。 >#連投・・・ とんでもないですぅ~。 もっのすごぉ~っく参考になりました。 勉強になりました。 どんなコトでも基本が一番大切ですからね!! 有難うございました。

  • wp_
  • ベストアンサー率54% (132/242)
回答No.7

>マニュアルを何十回も何百回も読みなさいとは言わないで下さい。 >悲しくなります・・・。 キツイ事申しますが、「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など実装したりすることも出来ますしね。 直接的な回答にはなっていませんが、参考まで。

plinchan
質問者

お礼

色々アドバイスをいただき有難うございました。 phpで吐き出した文をphpmyadminから操作すると 単なるselect文まで縮めてもエラーがでるし、 最後はサーバーから直接試したら普通に抽出されるし、 結局何がいけないのか解らずじまいです。 どうやら、皆さんのお話ではsql文がダメだということらしいですが、 phpmyadminではエラー。 サーバーから直接命令すればOK。 phpからでもできたりできなかったりと 色々知ることはできても結局何の解決にもなりませんでした。 どうやら、 ここで質問するにはかなりの実務経験者の方しか相手にして頂けないようですね...。 もぅ少し、解るようになったら登場します。 最も、その時は聞く必要もないかもしれませんが・・・。 有難うございました。 今まで誰にも聞いたこと無くて全部1人でやってきたので、 これからも負けじと頑張ります。

plinchan
質問者

補足

ご指摘有難うございます。 おっしゃる通りなので頑張ります(汗 >原因の究明を行うセンスを磨くと良いと思います。 正におっしゃる通りです。磨きたいです。 >SQLとの連携の場合は このようにやっていきたいです。 仕事でお金を貰っているわけではなく 仕事の合間に勉強しているので、 かなりやり方が我流なため作ったものを 直接テスト用サーバーに.htaccess認証ファイルに アップして真っ白表示になるとカッコが抜けているか DBの名称ミスなんだぁとか、 DB上の数字が返ってこなければDBに接続できていないんだぁ などなどブラウザ上での変化で調べておりました。 そのため、debugなるものの使い方や文法エラー表示のための echoやprintなどの使い方(何処に書くべきなのか)が よく解らないのです。 上手く使いたいと思い調べるのですがエラーがでた後のことは 非常に沢山資料があるのですが、 どうやってエラーを表示させているんだ?という感じです。 きちんと基本を身につけたいので、何か良いサイトやマニュアルの どの辺りをよく読めば良いのか教えて頂けると有難いです。

回答No.6

> ただ、「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のお話とは関係なしです。どう制御したいか、というお話になります。

plinchan
質問者

お礼

色々、有難うございます。 結局、今のところできませんでした。 でも、諦めずに頑張ります。 有難うございました。

plinchan
質問者

補足

お世話になっております。 >個人的に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>指定しない ご指摘お願い致します。

  • shimix
  • ベストアンサー率54% (865/1590)
回答No.5

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

plinchan
質問者

お礼

有難うございます。 調べ方がわかって良かったです。 でも、調べることができるようになった分だけ疑問も増えました。 本に書いてある通りにやってもできないものなのですね。 もっとも、素人でもわかるような間違いだらけのヒドイ本もありますが...。 今回、初めて聞いてみて色々な方のアドバイスから沢山のことを 知ることができたので、も少し調べながらやってみます。 頑張ります。 有難うございました!!

plinchan
質問者

補足

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

回答No.4

違いがあるのって 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』である前提があれば、 問題の早期発見も出来るはずです。 あと、変数を文字列に設定するとき、命令を利用している所は {}を利用していないのに、ただの変数の時は{}を利用していて 分かりづらいので、一切{}を使わない方が良いですよ。

plinchan
質問者

補足

ご指摘ならびにご教授有難うございます。 同じ結果を出すのにもこんなに沢山の手法があるんですね! 今回だけでも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()の中には、この場合どのように書いたら良いのでしょうか? マニュアルを何十回も何百回も読みなさいとは言わないで下さい。 悲しくなります・・・。 ご教授の程、宜しくお願い致します。

  • shimix
  • ベストアンサー率54% (865/1590)
回答No.3

>何も検索されなくなってしまいました。 一応これだけにはレスを(汗 最終的なSQL文を確認してみてください。多分「where」という文字列が抜けていませんか?私は$whereを連結する前のリテラルに入れてることが多いのですが、説明を省略し過ぎましたかね・・。でもSQL文をprintすれば気付きそうな(@言い訳モード) やはりこう書くべきだったか・・   $sql = 'select * from ~~ where ' . $where . ' order by ~~';

plinchan
質問者

お礼

実は、最初に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を削除してコードを作りました。 どのような場合にこのようなことが起こるのでしょうか? できれば、経験者としての予測を教えて頂きたいと思います。 宜しくお願いします。

plinchan
質問者

補足

お世話になっております。 まずは掲載箇所に誤りがありましたが ↓以下 >>$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 ~~'; ↑最初はこのようにして試してみましたがやはり検索されませんでしたので、忠実に修正をしたのですが、検索されませんでした。 何がいけないのでしょうか? 最初の状態から変更してしまうと検索ができなくなってしまいます。

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.2

方法を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は外部ファイルにして管理できます。

plinchan
質問者

お礼

詳細な説明やコードを教えて頂き有難うございました。 こんなにスラスラできたら気持ちいいでしょうね!! あぁ~、羨ましいっ!! 未だ、何がいけないのか解らず、 質問前と同じ状態のままですが頑張ります!! 有難うございました!!

plinchan
質問者

補足

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

  • shimix
  • ベストアンサー率54% (865/1590)
回答No.1

基本的にSQL文のwhereを書き替えますね。データベースに処理させてから取り出すほうが確実に速いですから(というかそうなるように設計すべき)。   $where = '(1)';  // 必ず設定される条件があればそれを記述してもOK としておいて、条件が追加のたびに   $where .= 'and (~追加条件~)';  などとandで追記しておいてから、   $sql = 'select * from ~~' . $where . ' order by ~~';  などとしています。whileのLoopなどで自前でチェックするのは「どうしてもそれしか方法がない」ときだけですね。CASE WHENなどを多用してSQL文が長くなっても実行するデータベースエンジンは気にしませんから。

plinchan
質問者

補足

アドバイスいただき有難うございます。 ご指示頂いた通りにやってみたのですが、 何も検索されなくなってしまいました。 どこが違っているのか検討がつきません。 再度、ご指摘をお願いします。 また、検索条件が変わった時の書き方が いまひとつピンとこないのですが 併せてアドバイスをお願いします。 ※検索条件の違いによる修正ができないので条件毎に試しました。 以下修正 $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 );

関連するQ&A

  • php5+Mysql5による条件検索とその表示方法が上手く動作しないのでどなたかご指摘をお願いします。

    phpにて条件検索を行っているのですが、『where』以下を$変数にすると動かなくなってしまいます。記述部分で何が間違っているのでしょうか? 以下記述↓ <? $link = db_con(); //←DB接続 $sql = "select * from tbl where id = '" . mysql_real_escape_string( $_GET['id'] ) . "' and name like '%" . mysql_real_escape_string( $_GET['name'] ) . "%' "; $result = mysql_query( $sql ) ; $num_rows = mysql_num_rows( $result ); ?> ここまで↑ を下記のように『where』以下を$変数にして代入 $変数した場合↓ <? $where .= "id = '" . mysql_real_escape_string( $_GET['id'] ) . "' and name like '%" . mysql_real_escape_string( $_GET['name'] ) . "%' "; $link = db_con(); //←DB接続 $sql = "select * from tbl where $where "; $result = mysql_query( $sql ) ; $num_rows = mysql_num_rows( $result ); ?> ここまで↑ どなたかご指摘をお願いします。

  • 複数の条件の検索

    会員の名前の更新するときに、会員以外の重複がないか調べたいです 会員以外のidと名前の一致を取得しようとしましたがうまくうごきません やりたいことは 会員以外の名前と入力した名前が重複してないか調べたいです $id = mysql_real_escape_string($_POST['id]); $name = mysql_real_escape_string($_POST['name']); $name3 = mysql_query("SELECT name FROM hoge2 WHERE NOT id='.$id.' AND name='".$name."'");

    • ベストアンサー
    • MySQL
  • エラーの意味

    $con=mysql_connect(localhost,***,***); mysql_select_db("shopdb"); $passwd=mysql_real_escape_string($_POST['passwd']); $email=mysql_real_escape_string($_POST['email']); $name=mysql_real_escape_string($_POST['name']); $sql="select * from users where email={$email} and passwd={$passwd}"; $_SESSION['name']=$name; $rs=mysql_query($sql); if(mysql_num_rows($rs)>0){ $_session['login']=1; header("localhost:". "top.php"); exit; } を入力したら Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource が出てしまいました・・・ なんのエラーでしょうか?

    • ベストアンサー
    • PHP
  • 別テーブルからselectした値を他のテーブルにinsertしたいのですが、上手くできません

    以下のように行ったのですが、 全ての値が別テーブルにinsertされません。 $sql = "SELECT tbl_A.id, tbl_A.data FROM tbl_A "; $rst = mysql_query( $sql ); while ( $col = mysql_fetch_array( $rst ) ) { $sql = "INSERT INTO tbl_B (          date, id, data ) VALUES ( '" . date( 'Y-m-d' ) . "', '" . mysql_real_escape_string( $col['id'] ) . "', '" . mysql_real_escape_string( $col['data'] ) . "' )"; } このやり方では、テーブル内の1つの値しかinsertされません。 selectされた全ての値をinsertするにはどのようにしたら良いのでしょうか? よろしくお願いします。 DB:mysql5 SP:php5

    • ベストアンサー
    • MySQL
  • PHPのPDOについて

    例えば手続き型でしたら、値をデータベースに追加するとき $sql = sprintf( 'INSERT INTO member SET id=%d, message="%s" ', mysql_real_escape_string($id), mysql_real_escape_string($message) ); mysql_query($sql) or die(mysql_error()); など「mysql_real_escape_string」を使って多少なりともセキュリティーをかけると思うのですが、PDOですと下記に書かれている以外に見たことないのですが、「mysql_real_escape_string」などはやらなくても大丈夫ということなのでしょうか? PDOの場合 $sql = 'INSERT INTO member SET id=?, message=?'; $stmt = $db->prepare($sql); $stmt->execute(array($id, $message)); 色々調べてみたのですがいまいち分からないためよろしくお願いします。

    • ベストアンサー
    • PHP
  • これでSQLインジェクション対策できてますか??

    $search_query = "select SQL_CALC_FOUND_ROWS * from king"; $usersearch= mysql_real_escape_string($_GET['usersearch']); $clean_search = str_replace('、', ' ',$clean_search); $clean_search = str_replace(' ', ' ',$usersearch); $search_words = explode(' ', $clean_search); $final_search_words = array(); if (count($search_words) > 0) { foreach ($search_words as $word) { if (!empty($word)) { $final_search_words[] = $word; } } } // Generate a WHERE clause using all of the search keywords $where_list = array(); if (count($final_search_words) > 0) { foreach($final_search_words as $word) { $where_list[] = "syou LIKE '%$word%'"; } } $where_clause = implode(' AND ', $where_list); // Add the keyword WHERE clause to the search query if (!empty($where_clause)) { $search_query .= " WHERE $where_clause"; } $pid = intval($_GET['pid']); if ($pid < 1) $pid = 1; $limit_start_rows = ( $pid - 1 ) * 10; $search_query .= " LIMIT {$limit_start_rows}, 10"; $result = mysql_query($search_query); $num_rows_result = mysql_query("SELECT FOUND_ROWS()"); $num_rows = mysql_fetch_assoc($num_rows_result); $num_rows = $num_rows['FOUND_ROWS()']; if($num_rows== 0){ $message="該当データは見つかりませんでした。"; } else $message=$num_rows ."件該当しました<br/>"; echo $message; while($row = mysql_fetch_array($result) 2行目でGETした文字をmysql_real_escape_string()で囲っただけですが大丈夫でしょうか。。

    • ベストアンサー
    • PHP
  • 検索においてフィールド名+likeを複数使いたい

    環境:php+mysql ■やりたこと イメージ <form method="get"action="result.php"> <p> 検索ワード:<input type="text" name="key" /> 好きな果物: <select name="cate"> <option VALUE="0"> <option VALUE="りんご">りんご <option VALUE="みかん">みかん </select> <input type="submit" value="送信" />  <input type="reset" value="取り消し" /> </p> </form> と検索フォームをした場合 入力された内容が  検索ワード=愛媛  好きな果物=みかん だとすると みかんのカテゴリに属するレコードで 且つ  みかんのキーワードを含むname またはDescriptionフィールドに該当する 結果数を取得したいです。 補足: $cate(formのプルダウンで VALUE="xx" のxxが入ってきて  これはDB上フィールドに入っている日本語です。) $a(これは検索キーワードが入ってきます。) ■現在書いているphp $sql="select * from item where category=$cate and name like '%".$a."%' or Description like '%".$a."%' "; $datas = mysql_query($sql , $db ); $num = mysql_num_rows($datas); ←75行目 エラー結果 Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in /home/xxx/result.php on line 75 おそらく、73行目の命令文が間違っていると思うのですが、どう対応するのか 検索しても対象になりそうなものがみつからず、、質問させていただきました。 アドバイスのほどよろしくお願いします。

    • ベストアンサー
    • PHP
  • AJAXでGET出来ない(直接記載ならGET可)

    外部サーバー(192.168.1.5)から、データベース(192.168.1.6)の情報を取り出すことが可能なPHPを作っています。 問題点 $sqlのパスワードの部分を $sql = "SELECT * FROM usr WHERE `userId`=$userId_e AND `pw`='p3kchds243j5'"; というように、直接記載すれば問題なく外部サーバー(192.168.1.5)でデータベース(192.168.1.6)の情報をGETできますが、 $sql = "SELECT * FROM usr WHERE `userId`=$userId_e AND `pw`=$pwd_e";や $sql = "SELECT * FROM usr WHERE `userId`=$userId_e AND `pw`=$pwd2_e"; だと、なぜかGETすることができません。 同じ条件で指示しているはずなのですが、何が問題なのでしょうか? 尚、外部サーバーからのGET指示はnumber,userId,pwdでありここでの間違いはありません。 よろしくお願いいたします。 【データベース(192.168.1.6)のPHP】 <?php header('Access-Control-Allow-Origin: *'); require_once('/home/sql/login.php'); //外部サーバー(192.168.1.5)からGET送信されたデータを受け取る $number = $_GET['number']; $userId = $_GET['userId']; $pwd = $_GET['pwd']; $pwd2 = 'p3kchds243j5'; //GET送信されたデータをエスケープ $number_e = mysql_real_escape_string($number); $userId_e = mysql_real_escape_string($userId); $pwd_e = mysql_real_escape_string($pwd); $pwd2_e = mysql_real_escape_string($pwd2); mysql_set_charset('utf8'); $sql = "SELECT * FROM usr WHERE `userId`=$userId_e AND `pw`=$pwd_e"; $result = mysql_query($sql); if (mysql_num_rows($result) > 0){ while($row = mysql_fetch_object($result)){ $string11 .= $row->a1; $string12 .= $row->userId; $string13 .= $row->pw; $string14 .= $row->nickname; } }else{ $string = "No matches!"; } //GET送信されてきたデータの確認 if($number == 9999){ //渡すデータを配列で格納 $array_data = array(string11=>$string11, string12=>$string12, string13=>$string13, string14=>$string14); } //ヘッダーの設定 header('Content-type:application/json; charset=utf8'); //渡すデータ(配列)をJSON形式にデコードして出力 echo json_encode($array_data); ?>

  • mysql_real_escape_string

    独学数ヶ月の初心者の質問で恐縮です。 もろもろの事情で仕方なくmysql_real_escape_stringを 以下(1)のように使用しなくてはならないと仮定し、 セキュリテイの面で(2)のようにシングルクオテーションつける 事で危険を回避できますか? またシングルクオテーションは(2)のようにつけてはいけない とかありますか?(記述の基本が曖昧なため、ただの確認の質問) (1) $sql = sprintf("SELECT id , password FROM `adminDatabase` where id = '%s' and password = '%s' order by id", mysql_real_escape_string($id), mysql_real_escape_string($password)); (2) $sql = sprintf("SELECT id , password FROM `adminDatabase` where id = '%s' and password = '%s' order by id", ’mysql_real_escape_string($id)’, ’mysql_real_escape_string($password)’); よろしくお願いします。

    • ベストアンサー
    • MySQL
  • mysqlのinsert文について、ご指導をお願いいたします。

    はじめまして。 プログラミング初心者です。 現在、PHP&MySQLで会員制掲示板を制作しようと奮闘しております。 会員登録フォームを作成し、下記SQL文にて会員登録を行おうとしているのですが、「エラーは出ていないのに、DBにデータが登録されない。」状況で、なにがおかしいのかわからず非常に困っております。尚、DBには正常に接続されています。 環境はVISTAにXAMPPを入れております。 私、PHP初心者のため、本のサンプルソースを加工して使用しようとしています。 下記にソースを記載いたしますので、 どうかご指導のほどお願いいたします。 (※情報が不足しておりましたら申し訳ありません。必要な情報をお教えいただけましたら幸いです。) // 接続 $link = mysql_connect( $db_host, $db_user, $db_password ); mysql_select_db( $db_name ); $result = mysql_query( 'set character set utf8' ); $sql = "select email1 from users where email = '" . mysql_real_escape_string( $_POST['email'] ) . "'"; $result = mysql_query( $sql ); // if ( $error != '' ) exit; // 会員データの挿入 $sql = "insert into member ( login_id, passwd, register_date, nickname, sex, birthday, email, pref, division, state ) values ( '" . mysql_real_escape_string( $_POST['email'] ) . "', '" . md5( $_POST['passwd'] ) . "', '" . date( 'Y-m-d H:i:s' ) . "', '" . mysql_real_escape_string( $_POST['nickname'] ) . "', '" . mysql_real_escape_string( $_POST['sex'] ) . "', '" . mysql_real_escape_string( $_POST['year'] . '-' . $_POST['month'] . '-' . $_POST['day'] . ' 00:00:00' ) . "', '" . mysql_real_escape_string( $_POST['email'] ) . "', '" . mysql_real_escape_string( $_POST['pref'] ) . "', '" . mysql_real_escape_string( $_POST['division'] ) . "', '1' )"; $result = mysql_query( $sql ); //echo $sql; // $title = '会員登録[3/4]'; ?>

    • ベストアンサー
    • PHP

専門家に質問してみよう