- ベストアンサー
データベースから,そのレコードをどれぐらい利用されたかカウントしたい
初心者ですがよろしくお願いします。 MySQL と PHP でリンクを集約したデータベースを構築しました。 検索までは可能となりましたが,その検索結果からユーザーが利用したクリック数をフィールドにカウントしたいと思っていますが,SQL文の書き方をどうすればいいかまったく分かりません。 とりあえず検索までの部分は以下のとおりです。 //接続と設定 $con = mysql_connect($DBSERVER, $DBUSER, $DBPASSWORD); mysql_query("set names sjis"); $selectdb = mysql_select_db($DBNAME, $con); if (!isset($page)) { //総件数計算 $sql = "SELECT Count(*) AS cnt FROM ○○○" . $where; $rst = mysql_query($sql, $con); $col = mysql_fetch_array($rst); $tcnt = $col[cnt]; mysql_free_result($rst); //該当件数確認 if ($tcnt == 0) { $body = "該当なし"; //現在ページ初期設定 $page = 1; } //総ページ数計算 $totalpage = ceil($tcnt / $PAGESIZE); //ページ上部表示 $body = "$tcnt 件みつかりました。 "; //抽出SQL文 $sql = "SELECT ○○○.* FROM ○○○" . $where . $orderby . " LIMIT " . $PAGESIZE * ($page - 1) . ", $PAGESIZE"; //結果セット取得 $rst = mysql_query($sql, $con); //ページ本文組み立て $body .= "<BR><BR>"; //一覧表示の場合 $body .= "<TABLE class='kyozailist'> <TR> <TH>No</TH> <TH>年</TH> <TH>月</TH> <TH>日</TH> <TH>もの</TH> <TH>リンク</TH> </TR>"; //データをループ読み込み while($col = mysql_fetch_array($rst)) { //各レコード内容を表示する表組み立て $body .= "<TR>" . "<TD width='8%' align='center'>$col[No]</TD>" . "<TD width='8%' align='center'>$col[nen]</TD>" . "<TD width='8%' align='center'>$col[tsuki]</TD>" . "<TD width='6%' align='center'>$col[hi]</TD>" . "<TD width='10%' align='center'>$col[mono]</TD>" . "<TD width='60%'><a href=$col[link] target=_blank>$col[link]</a></TD>" . "</TR>"; } $body .= "</TABLE>"; とりあえずのプログラムはこんな感じです。もちろん多少省略しましたが…。すると検索結果が10件ずつ表示されます。例えば以下のようになるとします。 No | nen | tsuki | hi | mono | link 1 | 20 | 10 | 10 | aaaa | http:// 2 | 19 | 12 | 24 | bbbb | http:// 3 | 19 | 9 | 13 | cccc | http:// このときに,link部分をクリックすると他のページに移動になるわけですが,そのクリック数をデータベースのフィールド(例えばcountフィールドがあると仮定して)に「1」を加える命令を教えていただければと思います。後ほど,フィールドcountでソートをして,ダウンロードランキングとの表示をしたいと思っています。 どなたか詳しい人からご教授いただければと思い,投稿しました。よろしくお願いします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
#1です。 外部に飛ばすページとの事ですので、以下のような流れはどうでしょうか? 1.リンク集を表示するページから以下のようなリクエストを発行させる。 <a href="http://<あなたのサイト>/location.php?id=1">http://www.google.co.jp</a> <a href="http://<あなたのサイト>/location.php?id=2">http://www.yahoo.co.jp</a> 2.location.php内の処理 2-1.$_GET['id']で受け取った値を元にリンク先を取得 ex)select link from <テーブル名> where no = $_GET['id']; 2-2.カウントアップを行う ex)update <テーブル名> count = count + 1 where no = $_GET['id']; 2-3.header関数を使用してlocationで飛ばす。 ex) # $linkには、2-1で取得したURLが入っているものとします。 header("location: ".$link); exit; header("location: "の : の右に必ず半角英数で空白を入れて下さい。 下記はWebアプリの概念で必ず覚えておいた方が良い事項です。 javascriptはクライアントサイド(ページを見る側)で動作するプログラム phpはサーバサイド(ページを見ている人からの要求に対して)で動作するプログラム mysqlは基本的に直接触る事は少ないです。 操作を行う時はサーバーサイドプログラムを介してしか出来ない物であると思っていた方が良いです。 自分も覚えるまでにすごく苦労した覚えがあるので、参考になれば幸いです。
その他の回答 (3)
- ts3m-ickw
- ベストアンサー率43% (1248/2897)
No.2です。補足します。 onClickでSQL実行させようとする、その発想に新鮮な驚きを感じました(けっしてばかにしてる訳ではないです)。 実行できたらどんなに便利だろうな‥‥。 No.1さんの言うのは、クリックして開く先のHTMLの中にこんなコードを埋め込んでおくってことです。 <?php extract($_POST); $con = mysql_connect($DBSERVER, $DBUSER, $DBPASSWORD); $selectdb = mysql_select_db($DBNAME, $con); $sql = "update ○○○ set count = count + 1 where no =$col"; $rst = mysql_query($sql, $con); ?> これで$colを前のページから受け取れればいいですよね。$col[forlink]とtargetの間に ?col=$col[No] を追加しておけばいい訳です。 普段使ってるPostgreSQLとちょっと違うので不足部分は適当に修正してください。
補足
またまた回答ありがとうございます!!何度もすいません…!! javaとphpとMySQLの合算なんて無理ですよね…。 今回教えていただいた,上記のphpコードは十分理解しました!!真にありがとうございます。是非利用させていただきたいと思っております…。 ですが…,実は今回制作しているのは「リンクデータベース」いうことで,開く先は全て外部のページなんです…。なので,開く先のページには埋め込むことができず,自分のページのみで処理できないものかと悩んでおります…(A hrefタグの中に target=_blank を入れてあるのもその為なんです…)。 実際次のページが無い場合はできないということでしょうね…。何か別の方法を考えています!!…が,諦めかけてます…(笑) 何度も,何度もご指導ありがとうございます。本当に感謝しております。もちろん,このphpコードも利用させていただきます!!
- ts3m-ickw
- ベストアンサー率43% (1248/2897)
No.1さんの回答が一番簡単ですね。 見た目がいまいちですが、リンクのURLに次のようなCGIの変数を付けておきます。 http://........./index.php?no=3 index.phpを表示したときに$noに3が入りますのでそれを利用します。 複数の変数があるときは http://........./index.php?no=3&nen=2008&tsuki=9 のように & でつなぎます。 <form>を利用していいなら <input type="hidden" name="no" value="3">のように変数を渡せるのですけどね。 ただ、PHPのバージョンによってはindex.phpの頭の方に extract($_POST); が必要だったり、セキュリティの関係で使用できなかったりしますのでご自身で確認してください。
補足
またまた素早い回答ありがとうございます。 <form>での利用ではないので,POSTやGETは利用できないだろうなと思いましたが,もう少し挑戦してみます。 もちろん,No.1さんの回答は分かりやすかったのですが,以下のように変更してもcountフィールドにカウントしてくれないので,いろいろと試してみたいと思います。 "<TD width='60%'><a href=$col[forlink] target=_blank onClick= 'update ○○○ set count = count + 1 where no = $col[No]'>$col[link]</a></TD>" . 忙しい中,ご指導いただきましてありがとうございます。
- t_netbug
- ベストアンサー率34% (15/44)
クリックされた時に update <テーブルの名前> set count = count + 1 where no = <クリックされたID> というSQL文を発行してみるのはどうでしょうか?
補足
早速の,最速の回答ありがとうございます。 //update <テーブルの名前> set count = count + 1 where no = <クリックされたID> についてですが,<テーブルの名前>は分かりましたが,<クリックされたID>を判断するにはどの様にすればよろしいでしょうか?表形式で表示されていますが,リンク部分をクリックすると,そのIDがどういうつながりでどの変数に入るかが勉強不足で分かりません…。重ね重ねの質問で申し訳ありませんが,ご指導いただければと思います。
お礼
お世話になりました。カウントがなんとかうまくいきました。しかし,header("location: ".$link);がうまくいきませんでした。どうやら,うまく変数にSQL文が入らないみたいです。 なんとか自分で考えてみます。が,もし困ったらまた投稿するかもしれません。その際もご指導いただければ幸いです。ありがとうございました。
補足
回答ありがとうございます。返答が遅くなってしまいましたが,今まで取り組んでいたので遅くなりました…。 2-3のheader("location: ".$link); を試す前に次のようなプログラムを組んでみました。#3と#4のご意見を合算して作った物です。 プログラムの前後は省略しますが,まず,serchファイルは, "<TD width='8%' align='center'>$col[No]</TD>" . "<TD width='50%'><a href='link_count.php?id=$col[No]' target=_blank>$col[siryoumei]</a></TD>" . "<TD width='10%' align='center'>$col[linkcount]</TD>" . としてみました。 ついで,カウントするphpファイルを次のようにしました。 link_count.php ← ファイル名 <?php $DBSERVER = "省略"; $DBUSER = "省略"; $DBPASSWORD = "省略"; $DBNAME = "○○"; $con = mysql_connect($DBSERVER, $DBUSER, $DBPASSWORD); $selectdb = mysql_select_db($DBNAME, $con); $link = 'select forlink from ○○ where No = $_GET[id]'; $sql = 'update ○○ set linkcount = linkcount + 1 where No = $_GET[id]'; $rst = mysql_query($sql, $con); echo $link; echo $_GET ?> するとこんな結果になりました。 表示結果 select forlink from kyouiku where No = $_GET[id]Array 受け渡しした際のURL末尾に,...link_count.php?id=1010001 と表示してあるので,変数内容の受け渡しはできていると思いますが,上手くSQL文が動かない状況です。(phpmyadominで同様のSQLを試したところカウントしてくれましたが…)。今までいろいろ試してみましたが,あともう少しだと思いますので,お知恵をいただければと思います。