掲示板ポートフォリオをつくっているものです。like機能を実装したくSQLから取得した投稿とユーザをwhile文でその分取得して同時にLikeボタンも表示させてクリックしたらボタンの色の切り替えと、Likeの情報を非同期でPOSTしてます。
うまくいかない動作として、タイトルの通り1回目ボタンをクリックした時は問題なく色が変わりPOSTさせることができますが、while文で複数作った他のボタンをクリックすると2回そのボタンをクリックしないと反応しないです。一回でボタンが反応するようにしたいです。
ご助力の方どうかよろしくお願いします。
PHP
1コード 2 $outLikes = $db->prepare('SELECT * FROM favorites WHERE account=? AND favorite="favorite"'); 3 $outLikes->execute(array($member['user'])); 4 $outLike = $outLikes->fetchAll(); 5 if (isset($_POST['favorite'])) { 6 $postLikes = $db->prepare('INSERT INTO favorites (favorite_id ,account, favorite) VALUES (?, ?, ?) ON DUPLICATE KEY UPDATE favorite = ?'); 7 $postLikes->bindParam(1, $_POST['favorite_id'], PDO::PARAM_INT); 8 $postLikes->bindParam(2, $_POST['user'], PDO::PARAM_STR); 9 $postLikes->bindParam(3, $_POST['favorite'], PDO::PARAM_STR); 10 $postLikes->bindParam(4, $_POST['favorite'], PDO::PARAM_STR); 11 $postLikes->execute(); 12 } 13 14 $user = $db->query('SELECT me.user, p.* FROM members me, posts p WHERE me.id=p.member_id ORDER BY p.created DESC'); 15 $posts = $user;
HTMLPHP
1コード 2 <?php if ($post['user'] !== $member['user']) :?> 3 <?php for ($i = 0; $i < count($outLike); $i++) :?> 4 <?php if ($outLike[$i]['favorite_id'] === $post['id'] && $outLike[$i]['favorite'] === 'favorite') :?> 5 <?php $icon = 'fas fa-thumbs-up'?> 6 <?php $boolean = 'hoge'?> 7 <?php break?> 8 <?php endif ;?> 9 <?php endfor; ?> 10<?php while ($post = $posts->fetch()) : ?> 11 <form id="like_form" action="" method="post"> 12 <span class="hidden_id" style="display: none;"><?php echo htmlspecialchars($post['id'], ENT_QUOTES)?></span> 13 <input type="hidden" name="user" value="<?php echo htmlspecialchars($member['user'], ENT_QUOTES) ?>"> 14 <?php if (isset($boolean)) :?> 15 <span class="hidden_boolean" style="display: none;">true</span> 16 <?php else :?> 17 <span class="hidden_boolean" style="display: none;">false</span> 18 <?php endif ;?> 19 </form> 20 <?php if (isset($icon)) :?> 21 <button class="like__btn"> 22 <span class="icon"><i class="<?php echo $icon?>"></i></span> 23 Like 24 </button> 25 <?php else :?> 26 <button class="like__btn"> 27 <span class="icon"><i class="far fa-thumbs-up"></i></span> 28 Like 29 </button> 30 <?php endif ;?> 31 <?php endif; ?> 32 <?php unset($icon); unset($boolean)?>
javascript
1コード 2 const likeBtn = document.querySelectorAll('.like__btn'); 3 const hidden_id = document.querySelectorAll('.hidden_id'); 4 const hidden_boolean = document.querySelectorAll('.hidden_boolean'); 5 let likeIcon = document.querySelectorAll('.icon'); 6 let clicked = null; 7 8for (let i = 0; i < likeBtn.length; i++) { 9 likeBtn[i].addEventListener('click', () => { 10 const postForm = new FormData(document.forms.like_form); 11 //カラムfavoriteだった場合true 12 if (hidden_boolean[i].textContent === 'true') { 13 clicked = true; 14 } 15 //likeおされてない場合 16 if (clicked === false) { 17 clicked = true; 18 likeIcon[i].innerHTML = `<i class="fas fa-thumbs-up"></i>`; 19 postForm.set('favorite_id', hidden_id[i].textContent); 20 postForm.set('favorite', 'favorite'); 21 const form = { 22 method: 'post', 23 body: postForm 24 }; 25 26 fetch('index.php', form) 27 .then((res) => { 28 if (res.status !== 200) { 29 throw new Error("system error."); 30 } 31 return res.text(); 32 }).then((text) => { 33 // console.log(text); 34 }).catch((e) => { 35 console.log(e.message); 36 }).finally(() => { 37 console.log('done!') 38 39 }); 40 } else { 41 clicked = false; 42 likeIcon[i].innerHTML = `<i class="far fa-thumbs-up"></i>`; 43 hidden_boolean[i].innerHTML = 'false'; 44 postForm.set('favorite_id', hidden_id[i].textContent); 45 postForm.set('favorite', 'notFavorite'); 46 const form = { 47 method: 'post', 48 body: postForm 49 }; 50 51 fetch('index.php', form) 52 .then((res) => { 53 if (res.status !== 200) { 54 throw new Error("system error."); 55 } 56 return res.text(); 57 }).then((text) => { 58 // console.log(text); 59 }).catch((e) => { 60 console.log(e.message); 61 }).finally(() => { 62 console.log('done!') 63 }); 64 } 65 }); 66 }