###やりたいこと
現在いいね機能を実装中です。
アイコンをクリック後、アイコンの色を塗り潰し、データをMySQLに反映させて、いいねの数を表示することはできたのですが、ページをリロードするといいねの数の表示が0になってしまいます。
(データベースの数は反映された状態でアイコンの色は塗り潰されたままだが、数の表示が0になる)
リロードしてもいいねの数を保持したまま表示できるようにしたいです。(いいね機能自体ではなく、いいねの数を表示させるためのコードに問題があると予想しています。)
###エラー文と原因だと考えている点
######エラー文
PHP Notice: Undefined variable: value
######原因だと考えている部分
$p_id = $value['post_id'];
上記のコード部分に対してエラー文で$valueが定義されていないと出ているので、投稿文を表示させる部分で['post_id']がうまく取得できていないことが原因だと思うのですが、どのようにすれば['post_id']を取得できるかを知りたいです。
(HTML部分でforeach( $message_array as $value )を定義しており、読み込みの順番が先に来ていることが原因かなと予想しているのですが、どうすれば後に読み込ませられるのかが分かりませんでした)
本当の原因は予想と違うかもしれませんが、その際は、ご指摘いただけると助かります。
初心者のため、質問の文言等、曖昧な点があると思いますが、解決法を教えていただけると嬉しいです。
よろしくお願いします。
###テーブル構造とカラム
テーブル構造
テーブル Members
+-------------------+--------------+------+-----+-------------------+-----------------------------------------------+ | Field | Type | Null | Key | Default | Extra | +-------------------+--------------+------+-----+-------------------+-----------------------------------------------+ | member_id | int | NO | PRI | NULL | auto_increment | | name | varchar(255) | NO | | NULL | | | email | varchar(255) | NO | | NULL | | | password | varchar(100) | NO | | NULL | | | icon | varchar(100) | YES | | NULL | | | member_created_at | datetime | NO | | CURRENT_TIMESTAMP | DEFAULT_GENERATED | | member_update_at | datetime | NO | | CURRENT_TIMESTAMP | DEFAULT_GENERATED on update CURRENT_TIMESTAMP | +-------------------+--------------+------+-----+-------------------+-----------------------------------------------+
テーブル Post
+-----------+--------------+------+-----+-------------------+-------------------+ | Field | Type | Null | Key | Default | Extra | +-----------+--------------+------+-----+-------------------+-------------------+ | post_id | int | NO | PRI | NULL | auto_increment | | member_id | int | NO | | NULL | | | message | varchar(560) | NO | | NULL | | | post_date | datetime | NO | | CURRENT_TIMESTAMP | DEFAULT_GENERATED | +-----------+--------------+------+-----+-------------------+-------------------+
テーブル Likes
+-----------------+----------+------+-----+-------------------+-----------------------------------------------+ | Field | Type | Null | Key | Default | Extra | +-----------------+----------+------+-----+-------------------+-----------------------------------------------+ | likes_id | int | NO | PRI | NULL | auto_increment | | post_id | int | NO | MUL | NULL | | | member_id | int | NO | | NULL | | | like_created_at | datetime | NO | | CURRENT_TIMESTAMP | DEFAULT_GENERATED | | like_update_at | datetime | NO | | CURRENT_TIMESTAMP | DEFAULT_GENERATED on update CURRENT_TIMESTAMP | +-----------------+----------+------+-----+-------------------+-----------------------------------------------+
###function.php
//いいねを取得 function getGood($p_id){ var_dump(' いいねを取得します'); try { $dbh = dbConnect(); $sql = 'SELECT * FROM Likes WHERE post_id = :p_id'; $data = array(':p_id' => $p_id); // クエリ実行 $stmt = queryPost($dbh, $sql, $data); if($stmt){ return $stmt->fetchAll(); }else{ return false; } } catch (Exception $e) { error_log('エラー発生:'.$e->getMessage()); } } //いいねした情報の有無 function isGood($u_id, $p_id){ var_dump('いいねした情報があるか確認'); var_dump('ユーザーID'.$u_id); var_dump('投稿ID:'.$p_id); try { $dbh = dbConnect(); $sql = 'SELECT * FROM Likes WHERE post_id = :p_id AND member_id = :u_id'; $data = array(':u_id' => $u_id, ':p_id' => $p_id); // クエリ実行 $stmt = queryPost($dbh, $sql, $data); if($stmt->rowCount()){ var_dump('お気に入りです'); return true; }else{ var_dump('特に気に入ってません'); return false; } } catch (Exception $e) { error_log('エラー発生:' . $e->getMessage()); } }
index.php
<php? //共通変数・関数ファイルを読込み require_once 'function.php'; try { // データベースに接続 $db = dbConnect(); // セッションを変数に格納 $member_id = $_SESSION["member_id"]; // 全ての投稿を取得 $sql = "SELECT * FROM Post LEFT OUTER JOIN Members ON Post.member_id = Members.member_id ORDER BY post_date DESC"; $res = $db->query($sql); if( $res ) { $message_array = $res->fetchAll(PDO::FETCH_ASSOC); } // いいね数取得 $p_id = $value['post_id']; $dbPostGoodNum = count(getGood($p_id)); // ログイン者の情報を取得 $sql2 = "SELECT * FROM Members WHERE member_id = :member_id"; // bindする(プリペアドステートメント) $res2 = $db->prepare($sql2); $res2->bindValue(":member_id","$member_id",PDO::PARAM_STR); $res2->execute(); foreach ($res2 as $row){ $row['name']; // name } } catch (PDOException $e) { $error_message[] = 'データの読み込みに失敗しました。'; $error_message[] = $sql; $e->getMessage(); //でエラー内容を参照可能(デバッグ時のみ表示) echo $e->getMessage(); } ?> <!-- 投稿文部分のHTML --> <div class="all_post"> <section> <?php if( !empty($message_array) ){ ?> <?php foreach( $message_array as $value ){ ?> <article> <div class="info"> <h2><div class="username"><?php echo $value['name']; ?></div></h2> <h3><div class="member_id">id:<?php echo $value['member_id']; ?></div></h3> <time><?php echo date('Y年m月d日 H:i', strtotime($value['post_date'])); ?></time> </div> <p><?php echo $value['message']; ?></p> <section class="post" data-postid="<?php echo sanitize($value['post_id']); ?>"> <div class="btn-good <?php if(isGood($_SESSION['member_id'], $value['post_id'])) echo 'active'; ?>"> <!-- 自分がいいねした投稿にはハートのスタイルを常に保持する --> <i class="fa-heart fa-lg px-16 <?php if(isGood($_SESSION['member_id'],$value['post_id'])){ //いいね押したらハートが塗りつぶされ る echo ' active fas'; }else{ //いいねを取り消したらハートのスタイルが取り消される echo ' far'; }; ?>"></i><span><?php echo $dbPostGoodNum; ?></span> </div> </section> </article> <?php } ?> <?php } ?> </section> </div>
ajax.php
<?php session_start(); require_once 'function.php'; // postがある場合 if(isset($_POST['postId'])){ $p_id = $_POST['postId']; try{ //DB接続 $dbh = dbConnect(); // Likesテーブルから投稿IDとユーザーIDが一致したレコードを取得するSQL文 $sql = 'SELECT * FROM Likes WHERE post_id = :p_id AND member_id = :u_id'; $data = array(':p_id' => $p_id, 'u_id' => $_SESSION['member_id']); // クエリ実行 $stmt = queryPost($dbh, $sql, $data); $resultCount = $stmt->rowCount(); // レコードが1件でもある場合 if(!empty($resultCount)){ // レコードを削除する $sql = 'DELETE FROM Likes WHERE post_id = :p_id AND member_id = :u_id'; $data = array(':p_id' => $p_id, ':u_id' => $_SESSION['member_id']); // クエリ実行 $stmt = queryPost($dbh, $sql, $data); echo count(getGood($p_id)); }else{ // レコードを挿入する $sql = 'INSERT INTO Likes (post_id, member_id, like_created_at) VALUES (:p_id, :u_id, :date)'; $data = array(':p_id' => $p_id, ':u_id' => $_SESSION['member_id'], ':date' => date('Y-m-d H:i:s')); // クエリ実行 $stmt = queryPost($dbh, $sql, $data); echo count(getGood($p_id)); var_dump(count(getGood($p_id))); } }catch(Exception $e){ error_log('エラー発生:'.$e->getMessage()); } } ?>
likes_test.js
$(function(){ var $good = $('.btn-good'), //いいねボタンセレクタ goodPostId; //投稿ID $good.on('click',function(e){ e.stopPropagation(); var $this = $(this); //カスタム属性(postid)に格納された投稿ID取得 goodPostId = $this.parents('.post').data('postid'); $.ajax({ type: 'POST', url: 'Likes/ajax.php', //post送信を受けとるphpファイル data: { postId: goodPostId} //{キー:投稿ID} }).done(function(data){ console.log('Ajax Success'); // いいねの総数を表示 $this.children('span').html(data); // いいね取り消しのスタイル $this.children('i').toggleClass('far'); //空洞ハート // いいね押した時のスタイル $this.children('i').toggleClass('fas'); //塗りつぶしハート $this.children('i').toggleClass('active'); $this.toggleClass('active'); }).fail(function(msg) { console.log('Ajax Error'); }); }); });
回答1件
あなたの回答
tips
プレビュー