onclick等からselect文を書き換える方法について - PHPプロ!Q&A掲示板

2428

  • 0P

onclick等からselect文を書き換える方法について

質問日時 / 2009年12月27日 19:21    回答数 / 9件

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

キーワード / mysql    function    onclick   

mysqlのデータをphpで表示する方法について勉強中です。

現在は下記のように通信費の一覧を出していますが、

通信費をクリックしたら通信費の一覧、
消耗品費をクリックしたら消耗品費の一覧を出したいです。

javascriptのように、function ●●と指定してonclickから値を渡し、
SELECT文内の'$tushinhi'の箇所を書きかえるのかな?と考えましたが
phpで実現したい場合、どのように表現すれば良いでしょうか?

onclickでなくとも、最適な方法があればご教授いただけますと幸いです。
宜しくお願いいたします。


  1. <?PHP
  2. (略)
  3. //karikata 内の 通信費 のみ抽出
  4. $tushinhi = "通信費";
  5. $sql = "SELECT * FROM `shiwake` WHERE karikata = '$tushinhi' order by karikata";
  6. $rs = mysql_db_query($db,$sql);
  7. $rows = mysql_num_rows($rs);
  8. while($row=mysql_fetch_array($rs)){
  9.   $tempHtml .= "<p>$row[1]</p>";
  10. }
  11. mysql_close($dbkidou);
  12. ?>
  13.  
  14. <html>
  15. <head></head>
  16. <body>
  17.  
  18. <a href="#" onclick="★">消耗品費</a> / 
  19. <a href="#" onclick="★">通信費</a> / 
  20.  
  21. <?= $tempHtml ?>
  22.  
  23. </body>
  24. </heml>

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



ツリー一覧

┣A01Kanonbell>javascriptのように、function ●●と指定してonclick
┃┗A01-1skmotoKanonbell様、詳しい解説ありがとうございます!
┗A02win_phpえっと、リンクの場合、 単純にGETで投げてswitch()
 ┣A02-1Kanonbellあー確かにそれが一般的というか基本ですね。 質問
 ┗A02-2skmotowin_php様、ご返信ありがとうございます! 画面遷
  ┣A02-2-1shimix#closedですが、気になったので(汗 >switchで判
  ┗A02-2-2NurseAngel質問に直接関係する話ではないですが。 >switchで
   ┗A02-2-2-1win_phpご指摘どうも。 掲示板という性質上、多くのユーザ
    ┗A02-2-2-1-1NurseAngel遅レス Webアプリの設計としては、 ・入力値は生

回答一覧

並び替え:

A01 参考になった
answererKanonbell [12月27日 23:10]

>javascriptのように、function ●●と指定してonclickから値を渡し、
>SELECT文内の'$tushinhi'の箇所を書きかえるのかな?と考えましたが
>phpで実現したい場合、どのように表現すれば良いでしょうか?

無理です。

JavaScriptはクライアントサイド。PHPはサーバサイド。
PHPは、ブラウザでWebページを表示するためのHTML+JavaScript+CSSを生成しています。
ブラウザは生成されたHTML+JavaScript+CSSを解釈して画面表示を行っています。

JavaScript的には、ブラウザでHTMLソースを見た状態がある意味すべてなので、PHP側に
値を返すなんてことは基本的に出来ないです。


仰るような手法は無理ですが、やりたいことを実現する方法は二つほどあります。

・あらかじめ「通信費の一覧」「消耗品費の一覧」のデータを出力しておく
画面表示時にすでにこれらのデータが確定していているならお奨めかな?
実際に表示後のHTMLデザインをPHP側で出力しておくことになります。
divタグなどで囲んでおき、CSS定義で最初は隠しておいて、onclickイベントで
表示させると良いです。
結構使うやり方です。難しくもないし。

・Ajaxを使用する。
複数の選択項目の内容が揃わないと確定しないデータ、などの場合に使用します。
画面表示用のPHPとは別に、JavaScriptがデータを取得するための別のページを
用意するような形。
それなりに難しいというか慣れがいる。
昨今はJavaScript関連のライブラリはAjax作成支援が当たり前についてるけれど、
最初は素で組んでみて慣れていくのがお奨め。


まあ前者のやり方のほうがいいと思います。

この意見に回答する

ツリーへ TOPへ

A01-1
replyerskmoto [12月28日 22:49]

Kanonbell様、詳しい解説ありがとうございます!

クライアントサイドとサーバサイドの違いがよくわかりました。
あらためて質問を見返すと、勉強不足すぎて申し訳なく思います。

お教えいただいた内容についてですが、

●あらかじめ「通信費の一覧」「消耗品費の一覧」のデータを出力しておく

画面表示時にデータは確定しています。
こちらはcssとJavaScriptに慣れているぶん、入りやすそうな表現だと思いました。
後々、表示された内容の合計が行の最下部に出るよう作って行きたいのですが、
「表示されている箇所のみの合計」を指定することは出来るのでしょうか。
試行錯誤してみようと思います。

●Ajaxを使用する

Ajaxも、自由度が高そうですね。
今はphpの勉強で頭がいっぱいですが、次の段階で是非チャレンジしてみたいと思います。

この意見に回答する

ツリーへ TOPへ

A02 満足
answererwin_php [12月28日 02:23] (最終編集:12月28日 02:27)

えっと、リンクの場合、
単純にGETで投げてswitch()で判定するのがphpだと一般的な
モード切替かな?と。

  1. <?php
  2. $type = htmlspecialchars($_GET['type']ENT_QUOTES);
  3.  
  4. switch($type){
  5.  
  6. case 1:
  7. $query = "消耗品費";
  8. break;
  9.  
  10. case 2:
  11. $query = "通信費";
  12. break;
  13. }
  14. ?>
  15.  
  16. <a href="?type=1">消耗品費</a>
  17. <a href="?type=2">通信費</a>

この意見に回答する

ツリーへ TOPへ

A02-1
replyerKanonbell [12月28日 03:57]

あー確かにそれが一般的というか基本ですね。

質問読んで、画面遷移なしで表示内容を変えたいって要件だと思い込んでました。


画面遷移なしだと私の書いた二つのやり方のうちどちらかになると思います。

この意見に回答する

ツリーへ TOPへ

A02-2
replyerskmoto [12月28日 22:59]

win_php様、ご返信ありがとうございます!

画面遷移については、特にこだわりはありません。
onclickとしたのは、「消耗品費」や「通信費」のカテゴリーごとにページを作らなくても
実現可能ではないだろうか?と考えてのことでした。

下記のような形で書いて、実現することができました。

  1. <?php
  2. $category = htmlspecialchars($_GET["category"])
  3.  
  4. if ($_GET["category"] == 'shomou') {
  5. $category = '消耗品費';
  6. }
  7. if ($_GET["category"] == 'tushin') {
  8. $category = '通信費';
  9. }
  10.  
  11. $sql = "SELECT * FROM `shiwake` WHERE karikata = '$category' or kashikata = '$category' order by date";
  12. ?>
  13.  
  14. <a href="?category=shomou">消耗品費</a> / 
  15. <a href="?category=tushin">通信費</a> /

実際はカテゴリーが9つあり、ifが沢山で美しくないかたち(?)なのかもしれませんが、、
それでも1歩進めて嬉しいです!

switchで判定するのが一般的なのですね。
こちらについても勉強します。

今回の件につきましては解決しましたので、クローズします。

とても参考になりました。有難うございました。

この意見に回答する

ツリーへ TOPへ

A02-2-1
replyershimix [12月30日 08:32]

#closedですが、気になったので(汗

>switchで判定するのが一般的なのですね。

5つくらいまでならswitchかなぁ・・。10以上だと対応を配列(渡される値をキーにする)で保持しますね。6~9だと将来的に増加するかどうかを含めて判断します。今回のケースだと増える可能性がありそうなんで配列にしておきたいです。

#もちろん、3~5くらいでも配列にしておくことはあります。

まぁ、それ以前にurlencodeしておいて『直接渡す』という手もありますよね。で、普通は仕訳データの科目は「科目コード」にしますよね。私自身は科目名称を保持するように設計したことがないので、ちょっと違和感があったんですが(私だけ?)。英数字のコードならurlencodeしなくてもそのまま渡せるんじゃないかと。

この意見に回答する

ツリーへ TOPへ

A02-2-2
replyerNurseAngel [12月31日 18:33] (最終編集:12月31日 18:38)

質問に直接関係する話ではないですが。

>switchで判定するのが一般的なのですね。
普通はデータベースを正規化します。

categoryテーブルを作成しid,nameカラムを作成。
'消耗品費'や'通信費'といった文字列はこちらに渡します。

shiwakeテーブルのkarikata,kashikataカラムを削除し、
karikata_id,kashikata_idを追加、category.idに対して参照制約をかけます。

shiwake.karikata_idには1とか2といった数値だけを入れることになり、
その実際の文字列はcategory.nameにしか存在しないようになります。


SQLは
  1. SELECT * FROM `shiwake` , `category` WHERE shiwake.karikata_id=category.id AND shiwake.karikata_id = 1
というように数値になり、引数を直接URLから$_GET等で渡せるようになります(エスケープは勿論必須)


http://ja.wikipedia.org/wiki/%E3%83%AA%E3%83%AC%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AE%E6%AD%A3%E8%A6%8F%E5%8C%96
第三正規化かな?





#どうでもいいんですが、

>$type = htmlspecialchars($_GET['type'], ENT_QUOTES);

何故にそこでhtmlspecialchars()?
stripslashes()ならまだわからないでもないんですが。

この意見に回答する

ツリーへ TOPへ

A02-2-2-1
replyerwin_php [12月31日 19:10] (最終編集:1月6日 01:12)

ご指摘どうも。

掲示板という性質上、多くのユーザが閲覧することを考えて
GETをそのまま変数に代入する表記は好ましくないと考えます。

あるユーザがこれを参考に

クエリをそのままprintするような場合、xssの虚弱性が発生します。
というか、必要ないからそうしないという、そういう書き方が嫌いです。
自分が書いたスクリプトを他の人間が拡張する場合もありますし。

そう考えると、一般的というのは言葉のあやですから、表現としては適切ではなかったですね。

一般的という表現で開発側の立場で考えた場合、
 NurseAngeさんのいうDBでカテゴリとして管理は正しい設計と私も同意見です。

しかしながら質問者がPHPをあまり詳しくない方と見受けられますので
そこまでのレベルを現時点で求めていないと考えました。

この意見に回答する

ツリーへ TOPへ

A02-2-2-1-1
replyerNurseAngel [1月6日 00:14] (最終編集:1月6日 00:17)

遅レス

Webアプリの設計としては、
・入力値は生の状態で保持しておき、出力時(『DBへの出力』等も含む)に対処を行う
というのが正道だと思うんですよね。


実際、skmotoさんが「解決した」と投稿したソースですと、
一見エスケープしたつもりのはずが実際にはhtmlspecialchars()しかしていない入力値が
SQL文に投げ込まれてしまっています。

  1. <?php
  2.  
  3. if ($_GET["category"] == 'shomou') {
  4.   $category = '消耗品費';
  5. }elseif ($_GET["category"] == 'tushin') {
  6.   $category = '通信費';
  7. }else{
  8.   $category = $_GET["category"];
  9. }
  10.  
  11. $sql = "SELECT * FROM `shiwake` "
  12.   ." WHERE karikata = '".mysql_real_escape_string($category)."'"
  13.   ." or kashikata = '".mysql_real_escape_string($category)."'"
  14.   ." order by date";
  15. ?>
  16.  
  17. <a href="?category=shomou">消耗品費</a> 
  18. <a href="?category=tushin">通信費</a>

というふうに、使用する時点でエスケープするのが本来だと思います。
ここらへんまで言及していなかったせいでわかりにくくなってたようですみません。


#まあ、そのつもりでいて結局エスケープを忘れるというのもお約束なわけですが
#それ以前に、入力値をただの変数に移動すること自体怖いのであんまりしないですが

この意見に回答する

ツリーへ TOPへ

<<質問一覧へ



Pick Up Q&A

Q
動的なURLを静的に見せる方法
 このエントリーをはてなブックマークに追加 
A
普通に考えて、mod_rewrite でしょうね。 http://www.nishishi.com/blog/2006/01/mod_rewrite_url.html...

>>続きを読む

GETのままでは検索エンジンのロボットが拾ってくれなかったためにSEO対策として有効だと言われていますね。

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