実現したいこと
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に左右されてどうにもうまくいきませんでした。
補足
特になし

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2024/05/23 12:13
2024/05/23 12:14
2024/05/23 12:26
2024/05/23 23:58