2021/12/15 よりサイトリニューアルしました

PHP,MySQLで大喜利サイトを作ってみる⑥いいね機能の実装

いいね

前回、ユーザーログインと回答の投稿、メインページへの反映までをまとめました。

今回は個人的に最もハマった場所、「いいね」機能の実装についてまとめようかと思います。

実装するいいね機能の概要としては、

①各解答に♡のアイコンをつけ、隣に押された累計を表示させる

②自身の回答にはいいね出来ない

③他社の回答には複数いいねが可能だが、1回答につき1いいねしか出来ない

④いいね時はアイコンを赤表示に変え、取り消し時はアイコンを黒くさせる

⑤累計数は非同期でクリック時に上下させる

こんな感じで、いわばTwitterと同じ感じです。

これを再現させるのに、PHP、MYSQL、jsを絡めましたが、結構苦労しました。。

コードがぐちゃぐちゃ(所詮趣味なので動けばいい精神でいつもそうですが(-_-;))かもしれませんが、今回の内容が少しでも役に立てたなら幸いです。

 

 

いいねの表示について

トップページ

前回まとめた通り、ユーザーの回答はトップ画面にカード形式で反映されます。

いいねボタンについては、回答のcode番号でIDを割り振っています。これはjsでクリックイベントを発生させるためです。

ログインしたユーザーごとに、すでにいいねを押している回答には色を付けておきたいので、if文で分岐させています。

いいねの総数表示は、下記テーブルから引っ張て来ています。

codek_codek_nameg_namegood

k_codeには回答を一意に識別する番号、k_nameには回答者の名前、g_nameにはいいねを押したユーザーの名前、goodには1が入ります。

つまり、このテーブルで誰がどの回答にいいねをしたかの情報が入ります。回答に対するいいねの総数も、このテーブルから割り出すことが出来ます。

続いて、jsでクリックイベントを発生させるために、いいねIDの情報を配列として変数に格納しています。ここで、自身の回答はクリックさせたくないので、その場合はID名を変更させています。(後述するjsで理由が分かります。)

最後に、回答ID(ハートマークID)の配列、いいね総数の配列、ログインしていればユーザーネームをjsへパースさせています。

続いてjs。

 

 

いいねのクリックイベント

jsで非同期通信

phpからパースされた回答の総数文forを回し、phpからパースされたIDの配列から順にIDのオブジェクトを作成しています。先ほどの”自身の回答はクリックさせない”対応として、パースしたIDの配列の中に”non”を入れています。つまり、自身の回答のクリックイベントは”goodnon”IDとなるので、トップページの回答カードには存在しない事になるのです。ただし、ID自体が存在しないとjsでエラーを吐くので、適当な箇所にdivでIDだけを作成しています。

クリックイベントでは、ハートのクラスを変更させて色の変化をつけてます。かつ、いいねで総数+1、取り消しで-1となるようにしています。

jqueryの部分では、非同期でindex.phpにいいねのIDと、名前をPOSTしています。

なお、ユーザーがログインしていなければnameの変数が存在しないので、エラーとなり、このjsが機能しません。つまり、ログインしない限りクリックイベントが発生しないようになっています。(スマートじゃないけど。。よしとします。)

つづいて、トップページのindex.phpに戻ります。

 

 

いいねをデータベースに登録

POSTデータの受信

ページ先頭でPOSTデータを受信し、いいねテーブルにて回答IDといいねを押した名前と照合させています。

名前がテーブルに存在しなければ名前、ID、いいね1を登録し、存在していればテーブルを削除するようにしています。

恐らくもっとスマートにまとめる方法はあるのでしょうが、自分ではこれが限界でした。。(-_-;)

 

次回は回答の削除やユーザーアイコンの更新等の修正ページについてまとめようかと思います。

 

 

 

 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です