
現在、ログイン式掲示板を作成中です。
その掲示板で、投稿に対してログイン中のみ、一人一回しかクリックできない「いいねボタン」のようなものを設置したいのですが、(mixiつぶやきのようなものです)どのようにすればよいのかわからずこまっております。
ネットにのっているものを参考にさせていただいて、クリック数をカウントする機能は、jQueryとjavascriptとphpでできたのですが、一回しかクリックできないようにするにはどうすればよいかわからないので、教えていただけませんか?
どうぞよろしくお願いいたします。
javascript
jQuery(document).ready(function(){
//初期時のカウンターファイル読み込み
//同じファイル名だと正常に読み込めないので、ランダムな数字を生成し、パラメータとして付けることで、ユニークな状態にしている。
var randnum1 = Math.floor( Math.random() * 10000 );
jQuery("#btn01 span").load("./count01.txt?r=" + randnum1);
//カウンター追加後の読み込み関数
function func01(data){
var randnum1 = Math.floor( Math.random() * 10000 );
jQuery("#btn01 span").load("./count01.txt?r=" + randnum1);
}
//カウンター+1追加処理
jQuery('#btn01 p').click(function(e){
//「param1」変数の値と書き込みファイル名の情報をもってpost.phpへ。その後、関数func01を実行
jQuery.post("post.php" , {"param1": 'count01.txt'} , func01);
jQuery("#btn01 span").load("./count01.txt");
});
});
index.php
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitio …
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>カウントサンプル</title>
<script type="text/javascript" src="js/jquery-1.4.2.min.js"></script>
<script type="text/javascript" src="js/count.js"></script>
</head>
<body>
<div id="btn01"><p><a href="javascript:void(0);">いいね!</a></p><span></span></div>
</body>
</html>
post.php
<?php
$file = $_REQUEST['param1'];
$c = file_get_contents($file);
$c++;
$fp = fopen($file, "r+");
@fputs($fp,$c);
fclose($fp);
No.2ベストアンサー
- 回答日時:
こんにちは。
どの程度PHPやmySQLを扱えるのかわからないのですが環境等はある前提でサンプルを提示します。
動きをわかりやすくする為に一度クリックした投稿については選択できないようにしています。
(これをクリック時にチェックするようにしてもOKです。)
エラー処理やレスポンス、セキュリティについては端折っていますのでそこはきちんと実装してください。
あくまでサンプルです。
動作について
既にクリックしたボタンは押せない。各投稿のボタンをクリックするとカウントがアップされる。
他のユーザでログインしなおして試すと、そのユーザがクリックしたボタンについては押せないことが確認できる。
JavaScript部分はこのサンプル用になっていますが、ユーザに対してクリック済みかどうかのチェックやカウントについてはこのcount.phpベースになると思います。
レスポンスについては、このサンプルですと投稿ごとにデータを取得しているため、画面に表示する件数分count.phpへリクエストします。
最初に表示分のクリック情報やカウントを全て取得してくる方法や、最初に回答したクリックした時にチェックする動作にする方法もあります。
=== index.php
<html>
<head>
<title>テスト</title>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7. …
<script type="text/javascript">
$().ready ( function() {
var obj = $('#bbs > input:button');
obj.each ( function(index) {
$(this).click(function() {
var bbsId = $(this).get(0).id.split('-')[1];
var userId = $('#userid').val();
$.post (
'count.php',
{ mode : 'click', bbsid : bbsId, userid : userId },
function ( data, b ) {
if ( !data.clicked ) {
$('#c-' + data.bbsid).html ( data.count );
$('#b-' + data.bbsid).attr ( 'disabled', 'disabled' );
}
}
);
});
});
});
function login() {
var userId = $('#userid').val();
if ( userId == '' ) {
alert ( 'ユーザIDを入れてね。' );
return;
}
var cntObj = $('#bbs > input:button').next();
cntObj.each ( function(index) {
var obj = $(this).get(0);
$.post (
'count.php',
{ mode : 'read', bbsid : obj.id.split('-')[1], userid : userId },
function ( data ) {
obj.innerHTML = data.count;
if ( data.clicked ) {
$('#b-' + data.bbsid).attr ( 'disabled', 'disabled' );
} else {
$('#b-' + data.bbsid).removeAttr ( 'disabled', 'disabled' );
}
}
);
});
}
</script>
</head>
<body>
ユーザID:<input type="text" id="userid"><input type="button" value="ログイン(擬似)" onclick="login();">
<hr>
<form id="bbs">
<?php for ( $i = 0; $i < 10; $i ++ ) { ?>
<input type="button" value="投稿ID[000<?= $i ?>]" disabled id="b-000<?= $i ?>">カウント[<span id="c-000<?= $i ?>">-</span>]<br>
<?php } ?>
</form>
</body>
</html>
=== count.php
<?php
require_once 'DB.php';
$db = DB :: connect ( "mysql://root:password@localhost/test" );
if ( PEAR :: isError($db) ) {
die ( $db -> getMessage() );
}
$result = $db -> query ( 'SET NAMES utf8' );
$mode = $_POST['mode'];
$bbsId = $_POST['bbsid'];
$userId = $_POST['userid'];
// ユーザのクリック状況(投稿IDとユーザIDで取得)
$sql = "select USERID from CLICKMANAGER where BBSID='$bbsId' and USERID='$userId'";
$result = $db->query ( $sql );
// レコードが取得できた場合はクリック済みとする
$isClicked = $result->numRows() == 1;
if ( $mode == 'click' && !$isClick ) {
// ボタンクリック時の処理
// まだクリックしていなかった場合はデータを追加
$sql = "insert into CLICKMANAGER (BBSID,USERID) values ( '$bbsId', '$userId' )";
$result = $db->query ( $sql );
}
// カウントを取得
$sql = "select count(*) as CNT from CLICKMANAGER where BBSID='$bbsId'";
$result = $db->query ( $sql );
$r=$result->fetchRow(DB_FETCHMODE_ASSOC);
$count = $r['CNT'];
// 返すJSONデータを生成
$array = array();
$array['clicked'] = $isClicked;// クリック済フラグ
$array['bbsid'] = $bbsId;// 投稿ID
$array['count'] = $count;// カウント数
header ( "Content-Type: application/json; charset=UTF-8" );
print json_encode ( $array );
?>
=== DB
create table CLICKMANAGER (
BBSIDVARCHAR(12),
USERIDVARCHAR(12),
REGDATETIMESTAMP,
PRIMARY KEY (BBSID,USERID)
);
この回答への補足
お返事ありがとうございます。
教えていただいたのを参考に、勉強しながら作っていこうと思います。
詳しく教えていただいて本当にありがとうございました。
No.1
- 回答日時:
こんにちは。
ログインしてユーザがわかっているのであれば、どの投稿についてクリックしたかを保持しておき、ボタンを表示する際に判断すれば良いと思います。
(またはクリックした時に「クリック済みだよ」というエラーを返す)
手っ取り早いのはユーザ毎にファイルを作って、そこにどの投稿についてクリックしたか書き込んでいく。
もしくは1ファイルにユーザID,投稿ID,投稿ID,・・・・という具合にCSVっぽく管理する。
もっと簡単なのはデータベースが何か使えればその投稿IDのレコードが取れるかどうかで判別できます。
ユーザの管理体系やどのようにログインを判断しているか等わからないので大まかな方法の回答となります。
あと、現在のコードはあまりよろしくないです。
param1=xxx.xxxと何か渡されたらそのファイルを読みに行って処理されてしまう可能性があります。
この回答への補足
はじめまして。
ご丁寧に教えていただきありがとうございます。
説明不足で申し訳ありませんでした。
Twitterアカウントでログインさせて、Mysqlをつかっております。
クリックしたユーザーに関して、データベースに投稿IDとユーザー情報をかきこんで、クリックする際にデータベースにその人の投稿があったか判別すればいいということでしょうか?
大変申し訳ないのですが、php初心者でまだよくわかっていないので、データベースにその人の投稿があったかどうかの判別が、どういうコードになるのか教えていただけませんか?
>あと、現在のコードはあまりよろしくないです。
>param1=xxx.xxxと何か渡されたらそのファイルを読みに行って処理されてしまう可能性があります。
ご指摘ありがとうございます。
ほんとですね><
セキュリティ面も初心者なので、このコードを使わずにカウント数も、データベースに書き込まれた投稿IDの数で表示しようと思ったのですが、それで大丈夫でしょうか?
どうぞよろしくお願いいたします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- JavaScript jqueryを使ったスムーススクロールのコードを書いたのですが、HTMLコード内にある、a butt 2 2022/04/14 10:59
- JavaScript jQueryでのドラッグアンドドロップについて 1 2022/07/07 21:04
- AJAX JavascriptからPHPへのAjax通信でnullが返ってくる 3 2022/08/03 22:00
- JavaScript 入力フォームの javascript で メールアドレスの正規チェックをを行い、ボタンをクリックして 2 2022/04/27 16:06
- JavaScript switch文のswitch(n)の部分を複数の値にするか、if文に変えてほしいです。 1 2022/07/27 17:18
- JavaScript セレクトボックスを2つ設けて選択して初めてメッセを表示 1 2022/07/27 12:15
- JavaScript jQueryでのドラッグアンドドロップについて 1 2022/07/30 09:10
- HTML・CSS ボタンをクリックした時に、入力フォームのすぐ下部に、「入力欄が空白です」というテキストメッセージが表 1 2022/04/27 16:25
- JavaScript ①入力フォーム→②確認表示画面→③送信完了画面のコードを書いているのです、 入力フォームから受け取っ 2 2022/05/10 16:45
- JavaScript html5に変えるとスライドショーが消えてしまった。 3 2022/03/26 19:53
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
inputタグでphpを呼び出す際、...
-
ボタンのクリック数を合計保存...
-
form actionで二つ送信先を指定...
-
データ送信をボタンを押さずに...
-
form actionタグ
-
phpでcookieをセットする方法
-
【WordPress】投稿がないカテゴ...
-
【初歩】ログアウトを【2回押さ...
-
DB_DATABASEとは何を指すのでし...
-
The requested method POST is ...
-
PEAR Image_QRCodeのエラー
-
PHPの引数渡しについて【ギブア...
-
FTPコマンドでディレクトリごと...
-
PHPのif文でその処理を途中で抜...
-
バッチを用いたフォルダの自動移動
-
PHPSpreadsheetによる書き出し...
-
Subversionのリポジトリの削除
-
phpの中でphpを書けないか
-
リンク先を隠す方法はないでし...
-
トランザクションが原因?DBに...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
データ送信をボタンを押さずに...
-
inputタグでphpを呼び出す際、...
-
FORMで送信ボタンと戻るボタン...
-
ボタンのクリック数を合計保存...
-
form actionで二つ送信先を指定...
-
テキストボックスにデータベー...
-
受け取ったパラメータを次のphp...
-
選択肢により様々なページに飛...
-
xamppでformによるデータの送信...
-
ページングでの値の引き継ぎ方
-
PHP table内、<a href使って su...
-
frame間の値の受け渡し方法
-
phpのプログラム
-
Wordpressでプラグイン内自作関...
-
値が渡されない
-
ワンクリックしかできないクリ...
-
【PHP】ページを更新すると勝手...
-
PEAR Image_QRCodeのエラー
-
PHP の自動で飛ぶ処理
-
別のファイルへ値を受け渡す方法
おすすめ情報