質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.31%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

1回答

534閲覧

phpで掲示板の実装・jsでいいねボタンの実装

krnkn6

総合スコア8

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

1クリップ

投稿2024/05/22 12:40

編集2024/05/23 07:57

実現したいこと

phpで掲示板を実装し、投稿されたコメントにはjsで実装したいいねボタンを付けたいです。
(いいねボタンの回数制限はなし)

発生している問題・分からないこと

掲示板といいねボタンが押されると各コメントごとに回数が増えていくところまでは実装しました。

しかし、リロードをした際にクリック回数がリセットされてしまうので、ローカルストレージでクリック回数を保存して対応しようと思ったのですが、count[i]のような変動値を複数保存する記述が分かりませんでした。

該当のソースコード

index.php

1/* 2index.phpには「投稿内容一覧」と「投稿フォーム」を表示 3★テーブル情報 4 name : 投稿者名 5 created_at : 日付 6 message : 投稿内容 7 good : いいね回数 8*/ 9 10$_SESSION['csrf-good'] = bin2hex(random_bytes(32)); 11 12try { 13 $pdo = 'DB接続の記述'; 14 $sql = "SELECT * FROM net"; 15   16  //●追加start 17  if($_SESSION['csrf-good'] === $_POST['csrf-good']) { 18  $sql = " 19  UPDATE net 20  SET good = good + 1 21  WHERE id = :id" 22  ; 23 24   $stmt = $pdo->prepare($sql); 25   $stmt->bindValue(':id' , $_POST['id'] , PDO::PARAM_INT); 26   $stmt->execute(); 27  } 28  //追加end 29 30 31 $stmt = $pdo->prepare($sql); 32 $stmt->execute(); 33 }catch (PDOException $e) { 34 $msg = '接続失敗'; 35 } 36 37 38//「class="count-txt"」にいいね回数表示 39foreach($stmt as $row) { 40 echo '<p>ID:' . $row['id'] . '-' . $row['name'] . '-' . $row['created_at'] . '</p>'; 41 echo '<p>' . $row['message'] . '</p>'; 42 43 //●変更・追加start 44 echo '<form method="post">'; 45 echo '<input type="hidden" name="csrf-good" value="' . $_SESSION['csrf-good'] .'">'; 46 echo '<input type="hidden" name="id" value="' . $row['id'] . '">' . $row['good']; 47 echo '<input type="submit" name="good" value="いいね">'; 48 echo '</form>'; 49 //変更・追加end 50 51</button>'; 52} 53 54 55<form action="insert.php" method="post"> 56 お名前<input type="text" name="name"><br> 57 投稿内容<textarea name="message"></textarea> 58 <input type="submit" name="insert" value="投稿"> 59</form>

insert.php

1//投稿完了画面 2$pdo = 'DB接続の記述'; 3 4if(empty($_POST['name'] === null)) { 5 $_POST['name'] = '名無し'; 6} 7 8$sql = "INSERT INTO net(name , message) 9 VALUES(:name , :message)"; 10 11$stmt = $pdo->prepare($sql); 12 13$stmt->bindValue(':name' , $_POST['name'] , PDO::PARAM_STR); 14$stmt->bindValue(':message' , $_POST['message'] , PDO::PARAM_STR); 15 16$stmt->execute();

script.js

1let goodBtn = document.querySelectorAll('.js-good-btn'); 2let countTxt = document.querySelectorAll('.count-txt') 3 4let count = {}; 5 6for(let i = 0; i < goodBtn.length; i++) { 7 count[i] = 0; 8 btnAll[i].addEventListener('click' , (e) => { 9 count[i] ++; 10 countTxt[i].textContent = count[i]; 11 }); 12}

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

forのiに左右されてどうにもうまくいきませんでした。

補足

特になし

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

単にカウントだけ保存するのであれば、 net テーブルにいいね数のカラムを追加し、いいねボタンがおされたらリクエストを送信、カウントアップする形になるかと思います。
ユーザー自身がいいねを押したかどうかわかるようにし、いいねの取り消し操作も実装するのであればユーザーを判定できる要素も保存する必要が出てくるでしょう。

投稿2024/05/22 13:09

Eggpan

総合スコア3257

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

krnkn6

2024/05/23 12:13

回答ありがとうございます。 今回はいいねの取り消し等はないものとして一旦作ろうと考えています。 ご指摘いただいた通り、いいねのカラム(good)といいねボタン用のformを追加し、リクエスト送信でカウントアップする方法で実装しました。 しかし、新たな問題点が2つ出てきたので、もしよければご教示いただきたいです。 新たな問題点というのが、「リロード時の二重送信」と「いいねを押す度にページがリロードされてしまう」という点です。 リロード時の二重送信はいつもだと別ページに飛ばしているので、トークンを生成して対策できるのですが、同一ページだとどのように対策すればよいのか分かりません。 twitterなどのようにいいねを押してもカウントアップ処理だけが行われるようにするにはどうすればよいのでしょうか。 jsでイベントキャンセルを試してみましたが、送信自体キャンセルされてしまいます。
krnkn6

2024/05/23 12:14

新たに追加したコードをphpに追加したのでご確認いただけると幸いです。
Eggpan

2024/05/23 12:26

他の人が見た際、質問に対する回答が意味わからないものになるので、全く違う質問に変更するのは控えて欲しいです
krnkn6

2024/05/23 23:58

すみません。 以後気を付けます! ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.31%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問