php+MySQLでの検索 - PHPプロ!Q&A掲示板

2396

  • 0P

php+MySQLでの検索

質問日時 / 2009年12月8日 16:53    回答数 / 9件

Questioner:  jzx90  このエントリーをはてなブックマークに追加 

キーワード / php    MySQL    検索   

お世話になります。
現在簡単な検索フォームを作成しています。
某書籍のコードを手入力して実行したのですが、XAMPPの旧版である1.68では検索機能が動くのですが、最新版である1.72では検索機能が動きません。
超初心者なので、行き詰っております。
以下にコードを記しますので、打開策をご教示ください。宜しくお願いします。
  1. <?php
  2.  $pkey = trim($_RESUEST['pkey']);
  3.  
  4.  $db = mysql_connect('localhost''root''root');
  5.  
  6.  $rc = mysql_select_db('myblog');
  7.  
  8.  $query = "select product, factory, cost from address";
  9.  if($pkey !="")
  10.     $query = $query"where product like '%$pkey%'";
  11.  
  12.  $result = mysql_query($query);
  13.  
  14.  mysql_close();
  15.  
  16. ?>
  17.  
  18. <html lang="ja">
  19. <head>
  20. <meta http-equiv="Content-Type" content="text/html; charset=utf8">
  21. <title>データベース</title>
  22. </head>
  23.  
  24. <form>
  25. file name:<input type="text" name="pkey" value="<?= $pkey ?>"><input type="submit" value="検索">
  26. </form>
  27.  
  28. <P><?= mysql_num_rows($result) ?>件あります.</P>
  29. </html>

この質問への意見の募集は締め切られ、ポイントは既に配分されました。
意見を投稿することはできますが、ポイントを受け取ることはできません。



ツリー一覧

┣A01shimix>$pkey = trim($_RESUEST['pkey']); $_RESUESTとい
┃┗A01-1jzx90>shimixさま 早速の返信ありがとうございます。
┗A02NurseAngel本当にその状態で動いていたのであれば間違いなくregi
 ┣A02-1win_php//この時点で$pkeyはエスケープ処理をしていないよう
 ┃┗A02-1-1jzx90>win_phpさま 回答ありがとうございます。 書籍を
 ┗A02-2jzx90> NurseAngelさま ご返信ありがとうございました。
  ┣A02-2-1shimixshort_open_tagのon/offはフォームへの再表示の部分で
  ┃┗A02-2-1-1jzx90>shimixさま 再度返信をいただきありがとうござい
  ┗A02-2-2NurseAngel>推奨しないということですよね。 register_globals

回答一覧

並び替え:

A01
answerershimix [12月8日 17:43] (最終編集:12月8日 17:51)

>$pkey = trim($_RESUEST['pkey']);

$_RESUESTというのはtypoでしょうか?

>mysql_close();

とりあえず、この行を削除してみてください。手元のテスト環境では問題ありませんでしたが、かといってこのタイミングでcloseする必要もないでしょう(基本的にどのタイミングでも不要ですし)。


(追記)
xamppのバージョンよりは、phpとMySQLの各々のバージョンを書かれた方がいいと思います。

この意見に回答する

ツリーへ TOPへ

A01-1
replyerjzx90 [12月9日 12:11]

>shimixさま

早速の返信ありがとうございます。
まず、お詫びを...

誤:$pkey = trim($_RESUEST['pkey']);
正:$pkey = trim($_REQUEST['pkey']);

手元に書籍しかない状態で、実際に利用したphpファイルを持ち合わせていなかったため、手入力した際にタイプミスをしていました。
申し訳ありません。

xamppのVerを書いても仕方ないですね・・・
動作するMysqlのVer・・・5.0.67
動作しないMysqlのVer・・5.1.37

でした。
なんとか動作しました。ありがとうございました。

この意見に回答する

ツリーへ TOPへ

A02
answererNurseAngel [12月8日 21:22] (最終編集:12月8日 21:25)

本当にその状態で動いていたのであれば間違いなくregister_globals
http://jp.php.net/manual/ja/ini.core.php#ini.register-globals
typoであればおそらくshort_open_tag
http://jp.php.net/manual/ja/ini.core.php#ini.short-open-tag
あるいはその両方。

オンにして動作するようにするべきではなく、オフの状態で動くように修正しましょう。



動くようになったら、そのフォームに

"><script type="text/javascript">alert("JavaScript");</script>"

とか、

%' JOIN address address2 JOIN address address3 JOIN address address4
ON address4.product LIKE '%

とかを入れると楽しいことになると思いますのでどうにかしましょう。
(後者は多分エラーになるので他に存在するテーブル名を入れるといいかも)


どうにかする方法が書いていない本であれば、今すぐ窓から投げ捨てましょう。

この意見に回答する

ツリーへ TOPへ

A02-1
replyerwin_php [12月9日 01:12]

//この時点で$pkeyはエスケープ処理をしていないようです。
$pkey = trim($_RESUEST['pkey']);

// ということはここで生のデータが挿入されるということです。
if($pkey !="")10.    $query = $query. "where product like '%$pkey%'";


このことについてなにも述べていない書籍なら窓から捨てるに同意見ですね。

私が悪意を持ってあなたのサイトを訪れたなら、DBの中身を消すことも可能かもしれません。

http://php.s3.to/man/function.mysql-real-escape-string.html

この意見に回答する

ツリーへ TOPへ

A02-1-1
replyerjzx90 [12月9日 15:12]

>win_phpさま

回答ありがとうございます。
書籍を調べたところ、エスケープに関する記述が別枠でありました。
書籍では、エスケープ処理をしなくても平気という内容でしたが、記述があったので、処理を行いました。

この度はご教示いただきありがとうございました。

この意見に回答する

ツリーへ TOPへ

A02-2
replyerjzx90 [12月9日 12:16]

> NurseAngelさま

ご返信ありがとうございました。
的確なアドバイスで非常に助かりました。

動作しないVerのphp.iniでは、(やはり)short_open_tagがオフになっていました。
Onにすることで検索機能を問題なく使うことができました。が・・・
NurseAngelさまがOffで動作するように...と仰るということは、推奨しないということですよね。

書籍にはこの件についての記述は特にないです・・・

正直、今使っている書籍に固着する必要もないと思いました。
書店に行って、もっと視野を広げたいと思います。

register_globals、short_open_tagについて色々と勉強になりました。ありがとうございました。

この意見に回答する

ツリーへ TOPへ

A02-2-1
replyershimix [12月9日 12:46]

short_open_tagのon/offはフォームへの再表示の部分ですね。それを「動かない」と表現されているのだとしたら、正確に伝える表現をして欲しいところです。普通は検索結果が0件になると推測しますので(こちらはregister_globalsとtypoの複合技のようですが・・)。

というか、出来ればmethod="post"にして$_POSTで扱いたいし、他の方が指摘されているようにエスケープ処理も(書籍で言及されていないなら)考慮しないとマズイです。とりあえず書籍を探す前に下記をどうぞ。

  http://www.phppro.jp/school/security/

この意見に回答する

ツリーへ TOPへ

A02-2-1-1
replyerjzx90 [12月9日 15:17]

>shimixさま

再度返信をいただきありがとうございます。
short_open_tagの意味も明確になりました。。

ただ、私もPOSTを使って値を受け渡したほうがいいのでは??と思っていたところでしたので、他の手法も当ってみます。
この書籍は入門書のようで、稼働を目的としていないのか、セキュリティに関する表記が非常に少なかったので、リンクHP非常に役に立ちました。

ありがとうございます。

この意見に回答する

ツリーへ TOPへ

A02-2-2
replyerNurseAngel [12月10日 00:21] (最終編集:12月10日 00:21)

>推奨しないということですよね。
register_globalsについてははっきりと「使用してはいけない」ですが、
short_open_tagについては特に非推奨ということはありません。

ただ単に、
・short_open_tag無しで動くページはshort_open_tagオンでもほぼ動く
・short_open_tag前提で動くページはshort_open_tagオフだと動かない

のでshort_open_tag無しで作っておいた方がよい、ということです。


>書籍では、エスケープ処理をしなくても平気という内容でしたが、
今すぐ投げ捨てるんだ!
いや、先に書籍名教えてください。


#なんとなくその本はmagic_quotes_gpc=onのような気がするので、万一そうだったらこれもオフにしましょう

この意見に回答する

ツリーへ TOPへ

<<質問一覧へ



Pick Up Q&A

Q
PHPのHTML埋め込み記述について
 このエントリーをはてなブックマークに追加 
A
$_POST["data"] == "男" ? $val = "checked" : $val = "" ; の意味は以下と同じです。 if($_POST["data"] == "男"){ $val = "checked; } e...

>>続きを読む

kende様のご指摘通り、三項演算子を使用する際には、コードの複雑度などを考慮する必要がありますね。書きやすさと共に可読性も追求したいところですね。

▲解説者:岡本(アシアル株式会社 教育コーディネーター兼 システムエンジニア)