おっしゃあ、投稿詳細表示ページ作るど~。
今回の説明も最下部にあるサンプルソース:konohana.zipをベースに説明。
前回の投稿ページ(mainlist.php)から呼び出される投稿詳細表示ページ(suggestlist.php)は以下のようになるわけですわ。
![$テン・シー・シー-2](https://stat.ameba.jp/user_images/20091101/23/xcc/5f/48/j/o0402035810293744418.jpg?caw=800)
まずは写真と問い合わせコメントね。
こいつは投稿ページ(mainlist.php)のPOSTで渡される
を$_POST["contribution_id"]で受け取り変数$idに入れて
で取り出せる。
その次に続く提案された名称のリストは提案テーブル(suggestion)
![$テン・シー・シー-2](https://stat.ameba.jp/user_images/20091107/09/xcc/3a/9e/j/o0368012210299021113.jpg?caw=800)
から
で提案ID、提案名、コメントを取り出して~...
まてまて、指示数の多いのを第一候補に、その後も指示数順に並べないと駄目なんだよな。
となれば、各提案ごとに投票テーブル(vote)
![$テン・シー・シー-3](https://stat.ameba.jp/user_images/20091107/09/xcc/ae/9e/j/o0377009510299022791.jpg?caw=800)
から提案IDと一致するsug_idを持つレコードを取り出して
こいつのレコード数を
で計算して、この数の多い提案から表示、となると提案名と指示数の配列作って...、と、バカか...
「バカかおめェ…」餓狼伝Vol.96で相手のフック攻撃にわざと顎を突き出すグレート巽の姿に、丹波文七が素の突っ込みをいれるがごとく...
と心の声が響き渡ったんすよ。
そうなのだ...
「iPhoneアプリ開発、その(77)」であんだけavg()関数やgroup byをやったのに、ぜんぜん使えてね~じゃね~の。
うぉおおおお、これか?これが宝の持ち腐れっていうやつか?
ほんとに腐ってる...
そうなのだよ。
suggestion, voteを元にgroup by使って提案IDごとにcount()関数で計算させることができるんだよ。
なんでこれで計算できるかは、その(77)を読みましょう。
でもって、そのカウント結果をorder by descで大きい順にソートさせるためのSQL文
を追加してやれば、やらなきゃいかん事がすべて完了した表が得られるんだよ。
ちなみにカウント値項目の指定ですが
でちゃんと値がとれました。すげえ。
あとは投票ボタン、詳細表示ボタン、新規提案ボタンの<FORM>の用意をすればOK。
まずは新規提案ボタンから
![$テン・シー・シー-4](https://stat.ameba.jp/user_images/20091108/00/xcc/40/ca/j/o0293029910299811474.jpg?caw=800)
こいつは、押されたら自分自身のページを
というPOSTで呼び出す。この対応が
という部分で一緒にPOSTされた"name"、"comment"を、それぞれ$name、$commentに取り出し
というSQL文でデータベースに登録している。
ただし、これだけだと、この提案IDをもつ投票(vote)テーブルのレコードがひとつも存在しないので、上のgroup byでひっかからなくなる。
ということは永遠に表示されない事になるんで、自分が提案した名前に1票、自作自演で投票もするようにしました。
これでばっちりリストされる。
投票ボタン
![$テン・シー・シー-5](https://stat.ameba.jp/user_images/20091108/00/xcc/53/de/j/o0293029910299811476.jpg?caw=800)
こいつも押されたら自分自身のページを
というPOSTで呼び出す。この対応が
という部分でPOSTされた"suggestion_id"を$sug_idに取り出し
でvoteテーブルに登録している。
このため、
で提案IDも送っている。
また、どちらのボタンも投稿IDは必須なので
も加えている。
最後は詳細ボタン
![$テン・シー・シー-6](https://stat.ameba.jp/user_images/20091108/00/xcc/bf/ee/j/o0294029910299811477.jpg?caw=800)
こいつは、自分自身のページじゃなく、以下のような提案詳細ページ(suggest.php)を呼び出すようにしている。
![$テン・シー・シー-3](https://stat.ameba.jp/user_images/20091101/23/xcc/63/06/j/o0393025210293749679.jpg?caw=800)
このページはsuggestlist.phpの応用。特に説明はしない。唯一、投票テーブル(vote)のコメントは投稿詳細表示ページで投票ボタンを押された場合は空になっている。そのため空コメントをはじくという意味でand vote.comment != ''を加えてます。
あと、前回のmainlist.phpも若干修正。今回のgroup byを使い投票数の多い提案名を表示するようにしますた。そのためのSQL文はこれ
今回のサンプルの使い方は以下のとおり
1、投稿
![テン・シー・シー-1](https://stat.ameba.jp/user_images/20091108/23/xcc/5d/de/j/o0351022410300885701.jpg?caw=800)
2、提案
![テン・シー・シー-2](https://stat.ameba.jp/user_images/20091108/23/xcc/c9/bb/j/o0361050210300885702.jpg?caw=800)
3、投票
![テン・シー・シー-3](https://stat.ameba.jp/user_images/20091108/23/xcc/4d/1b/j/o0361029010300885703.jpg?caw=800)
4、コメント付きで投票したい場合
![テン・シー・シー-4](https://stat.ameba.jp/user_images/20091108/23/xcc/81/eb/j/o0369057210300885705.jpg?caw=800)
みんなも、こいつで2、3件投稿して、提案、投票を繰り返した後、ターミナルからSELECT文を使って、どういう命令でどういう表を抽出できるか、いろいろ試してみてみて~!
http://localhost/mainlist.php
------------
サンプルソース:konohana.zip
3つのファイルともWebのルートフォルダ(Macintosh HD→ライブラリ→WebServer→Documents)に置いてください。わからん人は「iPhoneアプリ開発、その(136)」を参照。
MySQLとkonohana_testデータベース必須。
今回の説明も最下部にあるサンプルソース:konohana.zipをベースに説明。
前回の投稿ページ(mainlist.php)から呼び出される投稿詳細表示ページ(suggestlist.php)は以下のようになるわけですわ。
![$テン・シー・シー-2](https://stat.ameba.jp/user_images/20091101/23/xcc/5f/48/j/o0402035810293744418.jpg?caw=800)
まずは写真と問い合わせコメントね。
こいつは投稿ページ(mainlist.php)のPOSTで渡される
<input name="contribution_id" type=">hidden" value="{$id}" /> |
を$_POST["contribution_id"]で受け取り変数$idに入れて
"SELECT comment, url FROM contribution, image WHERE contribution.id=$id and image=image.id" |
で取り出せる。
その次に続く提案された名称のリストは提案テーブル(suggestion)
![$テン・シー・シー-2](https://stat.ameba.jp/user_images/20091107/09/xcc/3a/9e/j/o0368012210299021113.jpg?caw=800)
から
"SELECT id, name, comment FROM suggestion WHERE cont_id=$id" |
で提案ID、提案名、コメントを取り出して~...
まてまて、指示数の多いのを第一候補に、その後も指示数順に並べないと駄目なんだよな。
となれば、各提案ごとに投票テーブル(vote)
![$テン・シー・シー-3](https://stat.ameba.jp/user_images/20091107/09/xcc/ae/9e/j/o0377009510299022791.jpg?caw=800)
から提案IDと一致するsug_idを持つレコードを取り出して
"SELECT id FROM vote WHERE sug_id=$sug_id" |
こいつのレコード数を
mysql_num_rows |
で計算して、この数の多い提案から表示、となると提案名と指示数の配列作って...、と、バカか...
「バカかおめェ…」餓狼伝Vol.96で相手のフック攻撃にわざと顎を突き出すグレート巽の姿に、丹波文七が素の突っ込みをいれるがごとく...
と心の声が響き渡ったんすよ。
そうなのだ...
「iPhoneアプリ開発、その(77)」であんだけavg()関数やgroup byをやったのに、ぜんぜん使えてね~じゃね~の。
うぉおおおお、これか?これが宝の持ち腐れっていうやつか?
ほんとに腐ってる...
そうなのだよ。
suggestion, voteを元にgroup by使って提案IDごとにcount()関数で計算させることができるんだよ。
なんでこれで計算できるかは、その(77)を読みましょう。
"SELECT suggestion.id, name, suggestion.comment, count(vote.id) FROM suggestion, vote WHERE cont_id=$id and suggestion.id=sug_id group by suggestion.id" |
でもって、そのカウント結果をorder by descで大きい順にソートさせるためのSQL文
"order by count(vote.id) desc" |
を追加してやれば、やらなきゃいかん事がすべて完了した表が得られるんだよ。
ちなみにカウント値項目の指定ですが
$vote_count = $one_record["count(vote.id)"]; |
でちゃんと値がとれました。すげえ。
もちろん以下のように、最初にやったcomment, urlも合わせて取り出す事にして、SELECT文を一つにすることもできる。 "SELECT contribution.comment, url, suggestion.id, name, suggestion.comment, count(vote.id) FROM contribution, image, suggestion, vote WHERE cont_id=$id and suggestion.id=sug_id group by suggestion.id order by count(vote.id) desc" ただ、これはこうやって一回でSELECTをすますのと、2回に分けるのと、どっちがパフォーマンスがいいのかな~、謎。 |
あとは投票ボタン、詳細表示ボタン、新規提案ボタンの<FORM>の用意をすればOK。
まずは新規提案ボタンから
![$テン・シー・シー-4](https://stat.ameba.jp/user_images/20091108/00/xcc/40/ca/j/o0293029910299811474.jpg?caw=800)
こいつは、押されたら自分自身のページを
<input name="suggest" type="submit" value="提案する" /> |
というPOSTで呼び出す。この対応が
if ($_REQUEST["suggest"] != "") { |
という部分で一緒にPOSTされた"name"、"comment"を、それぞれ$name、$commentに取り出し
"INSERT INTO suggestion (cont_id, name, comment) VALUES('$id','$name','$comment')" |
というSQL文でデータベースに登録している。
ただし、これだけだと、この提案IDをもつ投票(vote)テーブルのレコードがひとつも存在しないので、上のgroup byでひっかからなくなる。
ということは永遠に表示されない事になるんで、自分が提案した名前に1票、自作自演で投票もするようにしました。
$sug_id = mysql_insert_id(); mysql_query("INSERT INTO vote (sug_id) VALUES('$sug_id')", $sqlserver); |
これでばっちりリストされる。
投票ボタン
![$テン・シー・シー-5](https://stat.ameba.jp/user_images/20091108/00/xcc/53/de/j/o0293029910299811476.jpg?caw=800)
こいつも押されたら自分自身のページを
<input name="vote" type="submit" value="支持する" /> |
というPOSTで呼び出す。この対応が
if ($_REQUEST["vote"] != "") { |
という部分でPOSTされた"suggestion_id"を$sug_idに取り出し
"INSERT INTO vote (sug_id) VALUES('$sug_id')" |
でvoteテーブルに登録している。
このため、
<input name = "suggestion_id" type="hidden" value={$sug_id} /> |
で提案IDも送っている。
また、どちらのボタンも投稿IDは必須なので
<input name = "contribution_id" type="hidden" value={$id} /> |
も加えている。
最後は詳細ボタン
![$テン・シー・シー-6](https://stat.ameba.jp/user_images/20091108/00/xcc/bf/ee/j/o0294029910299811477.jpg?caw=800)
こいつは、自分自身のページじゃなく、以下のような提案詳細ページ(suggest.php)を呼び出すようにしている。
![$テン・シー・シー-3](https://stat.ameba.jp/user_images/20091101/23/xcc/63/06/j/o0393025210293749679.jpg?caw=800)
このページはsuggestlist.phpの応用。特に説明はしない。唯一、投票テーブル(vote)のコメントは投稿詳細表示ページで投票ボタンを押された場合は空になっている。そのため空コメントをはじくという意味でand vote.comment != ''を加えてます。
"SELECT vote.comment FROM vote WHERE sug_id=$sug_id and vote.comment != ''" |
ちなみに、この時の結果は one_recored['vote.comment']; じゃなく one_recored['comment']; としないと取り出せませんでした。別にテーブルを指定する必要がない場合に限り、テーブル名を付けると取り出せないみたいです。 |
あと、前回のmainlist.phpも若干修正。今回のgroup byを使い投票数の多い提案名を表示するようにしますた。そのためのSQL文はこれ
"SELECT name FROM suggestion, vote WHERE cont_id=$id and suggestion.id=sug_id group by suggestion.id order by count(vote.id) desc" |
今回のサンプルの使い方は以下のとおり
1、投稿
![テン・シー・シー-1](https://stat.ameba.jp/user_images/20091108/23/xcc/5d/de/j/o0351022410300885701.jpg?caw=800)
2、提案
![テン・シー・シー-2](https://stat.ameba.jp/user_images/20091108/23/xcc/c9/bb/j/o0361050210300885702.jpg?caw=800)
3、投票
![テン・シー・シー-3](https://stat.ameba.jp/user_images/20091108/23/xcc/4d/1b/j/o0361029010300885703.jpg?caw=800)
4、コメント付きで投票したい場合
![テン・シー・シー-4](https://stat.ameba.jp/user_images/20091108/23/xcc/81/eb/j/o0369057210300885705.jpg?caw=800)
みんなも、こいつで2、3件投稿して、提案、投票を繰り返した後、ターミナルからSELECT文を使って、どういう命令でどういう表を抽出できるか、いろいろ試してみてみて~!
http://localhost/mainlist.php
------------
サンプルソース:konohana.zip
3つのファイルともWebのルートフォルダ(Macintosh HD→ライブラリ→WebServer→Documents)に置いてください。わからん人は「iPhoneアプリ開発、その(136)」を参照。
MySQLとkonohana_testデータベース必須。