実現したいこと
Q&A掲示板の質問にいいね機能を実装したいです。
発生している問題・分からないこと
参考サイトを見ながらコードを書き換えたのですが、表示部分がPHPで書かれており、カウントをカラムに集計して一定期間でカウントしているのではないかと思い、表示部分を Javascript に変更すべきか悩んでおります。
ログイン制ではないためPOSTデータでは、質問ID と UUID(IPアドレス)を送信するように考えたのですが、セキュリティを考えると危険でしょうか?
該当のソースコード
PHP
1<!-- いいねのクリックイベント --> 2<script> 3 let nongood = document.getElementById("nongood"); 4 let kazu = code.length; 5 //let kazu = count(code); 6 7 kazu.forEach(code.length => { 8 // +[]は0 9 let good = +code[i]; 10 let iine = +code[i]; 11 good = document.getElementById("good" + code[i]); 12 iine = document.getElementById("iine" + code[i]); 13 //いいねボタンをクリックした時にイベントが発生 14 good.addEventListener("click", () => { 15 //good.classList.toggle('クラス名'); 16 //指定された文字列がリスト内にあるかどうかを示す 17 if (good.classList.contains('on')) { 18 //要素を削除 19 good.classList.remove('on'); 20 //要素を追加 21 good.classList.add('off'); 22 //取り消しでいいね数を-1して出力 23 iine.textContent = g_iine[i] - 1; 24 g_iine[i] = g_iine[i] - 1; 25 } else { 26 good.classList.remove('off'); 27 good.classList.add('on'); 28 //いいねで総数+1 29 iine.textContent = g_iine[i] + 1; 30 g_iine[i] = g_iine[i] + 1; 31 } 32 33 //FormData オブジェクトをインスタンス化したら append() メソッドを呼び出すことでフィールドに追加することができる 34 formData.append("action", "like_dislike_button"); 35 //フォームの入力値を送信 36 const require = { 37 method: "post", 38 body: formData, 39 data: { 40 "post_id": code[i], 41 "unique_id": unique 42 } 43 } 44 45 fetch("<?php echo home_url('wp-admin/admin-ajax.php'); ?>", require) 46 .then(res => { 47 // return data.json(); 48 }) 49 .then(date => { 50 //ここにいいね機能の表示コードを書かないとリアルタイムで反映させることが出来ないのでは…? 51 }) 52 53 .catch(error => { 54 console.log(error); 55 }); 56 57 58 }); 59 }); 60</script> 61 62<!-- いいねをデータベースに登録 --> 63<?php 64//もしいいねテーブルにて質問IDといいねを押した UUID(IPアドレス)と照合させる 65if (!empty($_POST["post_id"]) === true or !empty($_POST["unique_id"]) === true) { 66 67 $post_id = $_POST["post_id"]; 68 $unique_id = $_POST["unique_id"]; 69 70 // $wpdbでSQLを実行 71 global $wpdb; 72 73 // goodテーブルから k_code(質問を一意に識別する番号)と g_unique(いいねを押した UUID(IPアドレス))が一致したレコードを取得するSQL文 74 $sql = "SELECT * FROM good WHERE k_code=? AND g_unique=?"; 75 76 $query = $wpdb->query($wpdb->prepare($sql)); 77 78 $data[] = $post_id; 79 $data[] = $unique_id; 80 81 $query = $wpdb->query($wpdb->prepare($data)); 82 $data = array(); 83 84 //Wordpress で SELECT クエリからすべてのデータを連想行の配列として取得する 85 $rec = $wpdb->get_results('SELECT * FROM good', ARRAY_A); 86 87 //もしいいねテーブルにて質問IDといいねを押した UUID(IPアドレス)が存在しなければ 88 if (!empty($rec) === true) { 89 $sql = "DELETE FROM good WHERE k_code=? AND g_unique=?"; 90 91 $query = $wpdb->query($wpdb->prepare($sql)); 92 93 $data[] = $post_id; 94 $data[] = $unique_id; 95 96 $query = $wpdb->query($wpdb->prepare($data)); 97 $data = array(); 98 99 } else { 100 $sql = "INSERT INTO good(k_code, g_unique, good) VALUES(?,?,1)"; 101 102 $query = $wpdb->query($wpdb->prepare($sql)); 103 104 $data[] = $post_id; 105 $data[] = $unique_id; 106 107 $query = $wpdb->query($wpdb->prepare($sql)); 108 109 110 } 111} 112?> 113 114<!-- いいねの表示について --> 115<?php 116//データベース接続 117global $wpdb; 118 119//lile_countテーブルから m_w(ユーザーの回答)のレコードを取得するSQL文 120$sql = "SELECT * FROM lile_count WHERE m_w = ? ORDER BY time DESC"; 121 122$query = $wpdb->query($wpdb->prepare($sql)); 123$data[] = $day; 124 125$query = $wpdb->query($wpdb->prepare($data)); 126$data = array(); 127 128 129 130while (true) { 131 //Wordpress で SELECT クエリからすべてのデータを連想行の配列として取得する 132 $rec = $wpdb->get_results('SELECT * FROM lile_count', ARRAY_A); 133 134 //もしデータがなければ終了する 135 if (empty($rec) === true) { 136 break; 137 } 138 print '<div class="card">'; 139 print '<div class="card-in">'; 140 print '<div class="ico">'; 141 142 //userテーブルから name(名前)のレコードを取得するSQL文 143 $sql = "SELECT img FROM user WHERE name=?"; 144 145 $wpdb2 = $wpdb->query($wpdb->prepare($sql)); 146 147 $data[] = $rec["name"]; 148 149 $wpdb2 = $wpdb->query($wpdb->prepare($data)); 150 $data = array(); 151 152 //Wordpress で SELECT クエリからすべてのデータを連想行の配列として取得する 153 $rec2 = $wpdb2->get_results('SELECT * FROM user', ARRAY_A); 154 155 //もしユーザーアイコン画像がなければ 156 if (empty($rec2["img"]) === true) { 157 $nanasi = "nanasi.png"; 158 $disp_gazou = "<img src='./img/" . $nanasi . "'>"; 159 //画像を出力する 160 print $disp_gazou; 161 } else { 162 $disp_gazou = "<img src='./img/" . $rec2['img'] . "'>"; 163 print $disp_gazou; 164 } 165 print "</div>"; 166 print '<div class="bun">'; 167 print '<div class="time">'; 168 print date('Y年n月j日 g:i', strtotime($rec["time"])); 169 print '</div>'; 170 print '<div class="name">'; 171 print $rec["name"]; 172 print '</div>'; 173 print '</div>'; 174 print '</div>'; 175 print '<div class="kaitou">'; 176 print $rec["comment"]; 177 print "</div>"; 178 $code = $rec["code"]; 179 print "<div class='goodiine'>"; 180 181 182 if (!empty($name) === true) { 183 //goodテーブルから k_code(質問を一意に識別する番号)と g_unique(いいねを押した UUID(IPアドレス))のレコードを取得するSQL文 184 $sql = "SELECT * FROM good WHERE k_code=? AND g_unique=?"; 185 186 $wpdb3 = $wpdb->query($wpdb->prepare($sql)); 187 $data[] = $rec["code"]; 188 $data[] = $name; 189 190 $wpdb3 = $wpdb->query($wpdb->prepare($data)); 191 $data = array(); 192 //Wordpress で SELECT クエリからすべてのデータを連想行の配列として取得する 193 $rec2 = $wpdb3->get_results('SELECT * FROM user', ARRAY_A); 194 195 //もし名前がテーブルに存在しなければ 196 if ($rec["name"] === $name) { 197 print "<div class='clear'>"; 198 print "<form action='sakujyo.php' method='post'>"; 199 print "<input type='hidden' name='re' value='" . $code . "'>"; 200 print "<input type='submit' value='回答を削除'>"; 201 print "</form>"; 202 print "</div>"; 203 print "<div id='good$code'><img src='./img/ハートのマーク3.png'></div>"; 204 205 //存在していれば 206 } else if (!empty($rec3) === true) { 207 208 print "<div id='good$code' class='on'><img src='./img/ハートのマーク3.png'></div>"; 209 } else { 210 print "<div id='good$code'><img src='./img/ハートのマーク3.png'></div>"; 211 } 212 } else { 213 print "<div id='good$code'><img src='./img/ハートのマーク3.png'></div>"; 214 } 215 216 //goodテーブルから k_code(質問を一意に識別する番号)のレコードを取得するSQL文 217 $sql = "SELECT * FROM good WHERE k_code=?"; 218 219 $wpdb4 = $wpdb->query($wpdb->prepare($sql)); 220 //回答を一意に識別する番号 221 $data[] = $code; 222 223 $wpdb4 = $wpdb->query($wpdb->prepare($data)); 224 $data = array(); 225 $iine = 0; 226 227 while (true) { 228 //Wordpress で SELECT クエリからすべてのデータを連想行の配列として取得する 229 $rec4 = $wpdb4->get_results('SELECT * FROM user', ARRAY_A); 230 //もしいいねがなければ 231 if (!empty($rec4["good"]) === true) { 232 //いいねを登録する 233 $g_i[] = $rec4["good"]; 234 } else { 235 break; 236 } 237 //いいね数をカウントする 238 $iine = count($g_i); 239 } 240 $g_i = array(); 241 print "<div id='iine$code'>$iine</div>"; 242 print "</div>"; 243 print "</div>"; 244 245 if (!empty($name) === true) { 246 247 if ($rec["name"] === $name) { 248 $code = "non"; 249 } 250 } 251 $k_code[] = $code; 252 $g_iine[] = $iine; 253} 254//もしいいね数がカウントされてなければ 255if (!empty($g_iine) === true) { 256 $g_iine = json_encode($g_iine); 257} 258//もし質問を一意に識別する番号がなければ 259if (!empty($k_code) === true) { 260 $k_code = json_encode($k_code); 261} 262 263if (!empty($name) === true) { 264 $name = json_encode($name); 265} 266print "<div id='goodnon'></div>"; 267 268$dbh = null; 269?> 270 271 272<div id="scrolltop" class="st">top</div> 273<div id="scrollmenu" class="sm">menu</div> 274 275<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.0/jquery.min.js"></script> 276<script src="main.js"></script> 277<script src="anime.min.js"></script> 278<script src="footerFixed.js"></script> 279<script type="text/javascript"> 280 //let name = 281 let code = <?php echo $k_code; ?>; 282 let name = <?php echo $name; ?>; 283 let g_iine = <?php echo $g_iine; ?>; 284</script> 285<script src="sub.js"></script>
試したこと・調べたこと
- teratailやGoogle等で検索した
- ソースコードを自分なりに変更した
- 知人に聞いた
- その他
上記の詳細・結果
参考サイト②を見てみるとカウントには2パターンあり表示部分をAjaxで書かないとリアルタイムでの反映は不可能なようです。
補足
回答1件
あなたの回答
tips
プレビュー