実現したいこと
php・sqlで簡易的ないいねボタン付きの掲示板の作成についてです。
(セキュリティ関係は今回省略します)
簡易的ないいねボタン・掲示板の仕様・テーブル情報は以下となります。
●いいねボタンの仕様
・各投稿内容ごとにいいねボタンを押された回数を表示
・DBにいいね用のカラムを作成し回数を保存
・いいね用formを作成し、押されたときに同一ページ内へリクエスト
・いいねボタンのからのリクエストがあった場合、同一ページ内でカウントアップの処理を実行
・ユーザーを識別して、回数制限を設ける機能は今回なし
●掲示板の仕様
・入力項目は「名前」と「投稿内容」のみ
・掲示板用formでのPOST送信時、作成されたレコードに日付を自動で登録
・名前が無記入の場合「名無し」と表示
●テーブル情報
id : 番号
name : 投稿者名
message : 投稿内容
created_at : 日付
発生している問題・分からないこと
いいねボタン付きの掲示板は既に実装してありますが、下記2つの問題点が発生しています。
・同一ページ内へPOST送信をする場合の二重送信対策
・いいねボタンが押されると毎回ページがリロードされる
●二重送信について
POST送信は別ページへリクエストしていたので、入力ページでトークンを生成してSESSION・$_POSTに格納し、送信先ページで値が同じかif文で確認してから処理を実行していました。
(処理を実行後、SESSIONを削除し二重送信は発生しないようにしていました。)
しかし、同一ページ内でPOST送信をする場合、二重送信はどのように対策すればよいのでしょうか。
また、いいねボタンが押されるとPOST送信され、毎回ページが更新されてしまうのですが、twitterのいいねボタンのように、ページが更新されずいいね数だけが増えるようにするにはどうすればよいのでしょうか。
該当のソースコード
index.php
1try { 2 $pdo = 'DB接続の記述'; 3 4 //いいねカウントアップ用のSQL 5 if($_POST) { 6 $sql = " 7 UPDATE net 8 SET good = good + 1 9 WHERE id = :id" 10 ; 11 12 $stmt = $pdo->prepare($sql); 13 $stmt->bindValue(':id' , $_POST['id'] , PDO::PARAM_INT); 14 $stmt->execute(); 15 } 16 17 //投稿一覧表示用のSQL 18 $sql = "SELECT * FROM net"; 19 $stmt = $pdo->prepare($sql); 20 $stmt->execute(); 21 22}catch (PDOException $e) { 23 $msg = '接続失敗'; 24} 25 26//投稿内容一覧表示 27foreach($stmt as $row) { 28 echo '<p>ID:' . $row['id'] . '-' . $row['name'] . '-' . $row['created_at'] . '</p>'; 29 echo '<p>' . $row['message'] . '</p>'; 30 31 //いいね用form 32 echo '<form method="post" action="">'; 33 echo '<input type="hidden" name="id" value="' . $row['id'] . '">' . $row['good']; 34 echo '<input type="submit" name="good" value="いいね">'; 35 echo '</form>'; 36} 37 38//投稿用form 39<form action="insert.php" method="post"> 40 お名前<input type="text" name="name"><br> 41 投稿内容<textarea name="message"></textarea> 42 43 <input type="submit" name="insert" value="投稿"> 44</form>
insert.php
1//登録処理のみの記述(表示の記述は省略) 2 3$pdo = 'DB接続の記述'; 4 5if(empty($_POST['name'])) { 6 $_POST['name'] = '名無し'; 7} 8 9$sql = "INSERT INTO net(name , message) 10 VALUES(:name , :message)"; 11 12$stmt = $pdo->prepare($sql); 13 14$stmt->bindValue(':name' , $_POST['name'] , PDO::PARAM_STR); 15$stmt->bindValue(':message' , $_POST['message'] , PDO::PARAM_STR); 16 17$stmt->execute();
試したこと・調べたこと
- teratailやGoogle等で検索した
- ソースコードを自分なりに変更した
- 知人に聞いた
- その他
上記の詳細・結果
同一ページ内POST送信時の二重送信対策については、調べてみても別ページにPOST送信する場合の対策しか見つからず分かりませんでした。
いいねが押されたときに毎回ページが更新されてしまう問題点については、jsでイベントキャンセルをしてみましたが、POST送信自体?がキャンセルされてしまいうまく対応できませんでした。
補足
特になし
![guest](/img/icon/icnUserSample.jpg)
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2024/05/24 03:15
2024/05/24 03:25 編集