organ34
@organ34

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

いいね機能の実装が出来ない

いいね機能を実装したい

例)
PHP,jQueryで料理投稿サイトを作成しており、その中で
いいね機能の実装が1通り完了したのですが実際にボタンを押しても処理が完了しない状態です。
MVCモデルを利用しており、
Modelクラス:Good.php
Controllerクラス:UserController.php
Viewモデル:myrecipe.php
で行っています。
解決方法を教えて下さい。

発生している問題・エラー

エラーログを見たところ、エラーは発生していないです。

該当するソースコード

Good.php
<script src="../js/jquery-3.6.0.min.js" type="text/javascript"></script>
<script src="../js/good.js"></script>
<?php
require_once(ROOT_PATH .'/Models/Db.php');
class Good extends Db
{
    public function __construct($dbh = null)
    {
        parent::__construct($dbh);
    }
   /** すでにお気に入りしているか判定
   * @param int $company_id
   * @param int $post_id
   * @return bool $favorite
   */
    public function checkfavolite($user_id, $recipe_id)
    {
        $sql = "SELECT *
                FROM goods
                WHERE user_id = :user_id AND recipe_id = :recipe_id";
        $sth= $this -> dbh -> prepare($sql);
        $sth -> bindParam(':user_id', $user_id, \PDO::PARAM_INT);
        $sth -> bindParam(':recipe_id', $recipe_id, \PDO::PARAM_INT);
        $sth -> execute();
        $result = $sth -> fetch(PDO::FETCH_ASSOC);
        return $result;
    }
   /** お気に入り登録
   * @param int $user_id
   * @param int $recipe_id
   * @return bool $favorite
   */
    public function favoriteDone($user_id, $recipe_id)
    {
        $sql = 'INSERT INTO goods(user_id, recipe_id)
                VALUES (:user_id, :recipe_id)';

        try {
            $sth = $this -> dbh -> prepare($sql);
            $sth -> bindValue(':user_id', $user_id, \PDO::PARAM_INT);
            $sth -> bindValue(':recipe_id', $recipe_id, \PDO::PARAM_INT);
            $result = $sth -> execute();
            return $result;
        } catch (\Exception $e) {
            return $result = false;
        }
    }
    /** お気に入り解除
     * @param int $user_id
     * @param int $recipe_id
     * @return bool $favorite
     */
    public function favoriteCansel($user_id, $recipe_id)
    {
        $sql = 'DELETE 
                FROM goods
                WHERE user_id = :user_id AND recipe_id = :recipe_id';
        try {
            $sth = $this -> dbh -> prepare($sql);
            $sth -> bindValue(':user_id', $user_id, \PDO::PARAM_INT);
            $sth -> bindValue(':recipe_id', $recipe_id, \PDO::PARAM_INT);
            $result = $sth -> execute();
            return $result;
        } catch (\Exception $e) {
            return $result = false;
        }
    }
}
UserController.php
require_once(ROOT_PATH .'/Models/Good.php');
class UserController
{
    private $request; //リクエストパラメータ(GET,POST)
    private $Good; //Goodモデル

public function __construct()
    {
    //インスタンス化で最初に走る処理
    //get['id']とpostはrequestに入る
        $this -> request['get'] = $_GET;
        $this -> request['post'] = $_POST;

    //モデルオブジェクトの生成
        $this -> User = new User();
        $dbh = $this -> User -> getDbHandler();
        $this -> Recipe = new Recipe($dbh);
        $this -> Process = new Process($dbh);
        $this -> Image = new Image($dbh);
        $this -> Good = new Good($dbh);
    }

    //Goodsテーブル
    public function checkfavolite($user_id, $recipe_id)
    {
        $good = $this -> Good -> checkfavolite($user_id, $recipe_id);
        $params = $good;
        return $params;
    }
}
UserController.php
<?php
session_start();
require_once(ROOT_PATH .'/Controllers/UserController.php');

if (empty($_SESSION["login_user"])) {
    header('Location: login_form.php');
}
$recipe = new UserController();
$view = $recipe -> view();
$view_process = $recipe -> method();

$recipe_id = $view["recipe"]["id"]; //投稿ID
$favolote_check = $recipe -> checkfavolite($_SESSION["login_user"]["id"], $_GET["id"]);
?>

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <link rel="stylesheet" href="/css/index.css" type="text/css"/>
    <link rel="stylesheet" href="/css/form.css" type="text/css"/>
    <href="https://use.fontawesome.com/releases/v5.15.4/css/all.css">
    <script defer src="https://use.fontawesome.com/releases/v5.15.4/js/all.js"></script>
    <script src="../js/jquery-3.6.0.min.js" type="text/javascript"></script>
    <script src="../js/good.js" type="text/javascript"></script>
    <title>レシピ画面詳細</title>
</head>
<body style = "background-color :#FAEBD7;">
<?php include("header.php")?>
<div class = "box">
        <div id = "recipe_box" class = "my-5 d-flex align-items-center justify-content-center" >
            <div id = "recipe_left" style = "width:50%; height:100%;">
                <div id = "image_form">
                    <img src = "<?php echo "/". $view["recipe"]["file_path"]?>">
                </div>
                <div id = "button_form">
                <!---------------いいねボタン------------------->
                    <form class="favorite_count" action="#" method="POST">
                        <button type="button" name="favorite" class="favorite_btn" data-user_id = <?php echo $_SESSION["login_user"]["id"]?> data-recipe_id = <?php echo $view["recipe"]["id"]?>>
                        <?php if ($recipe -> checkfavolite($_SESSION["login_user"]["id"], $_GET["id"])) : ?>
                            いいね解除
                        <?php else :?>
                            いいね
                        <?php endif; ?>
                        </button>
                    </form>
                    <span></span>
                <!---------------いいねボタン------------------->
                </div>
            </div>
</div>
</body>
</html>
good.js
//いいね機能
$(document).on('click','.favorite_btn',function(e){
        e.stopPropagation();
        var $this = $(this),
        user_id = $(e.currentTarget).data('user_id');
        recipe_id = $(e.currentTarget).data('recipe_id');
        $.ajax({
                type: 'POST',
                url: 'new.php',
                dataType: 'json',
                data: { user_id: user_id,
                        recipe_id: recipe_id}
        }).done(function(data){
                location.reload();
        }).fail(function() {
              location.reload();
        });
});
new.php
<?php
require_once(ROOT_PATH .'/Models/Good.php');
session_start();

$favolite = new Good();

if (isset($_POST)) {
    $user_id = $_SESSION['login_user']['id'];
    $recipe_id = $_POST['recipe_id'];
  
    $check = $favolite -> checkfavolite($user_id, $recipe_id);
    if (isset($check)) {
        $result = $favolite -> favoriteCansel($user_id, $recipe_id);
    } else {
        $result = $favolite -> favoriteDone($user_id, $recipe_id);
    }
}

自分で試したこと

エラーが出ていなかったのでscriptダグの配置の関係だと考え、scriptタグの配置をファイル先頭に変更等を行いましたが、結果は変わりませんでした。

0

1Answer

<button 
  type="button" 
  name="favorite" 
  class="favorite_btn" 
-  data-user_id = <?php echo $_SESSION["login_user"]["id"]?> 
+  data-user_id ="<?php echo $_SESSION["login_user"]["id"]?>"  
-  data-recipe_id = <?php echo $view["recipe"]["id"]?>
+  data-recipe_id ="<?php echo $view["recipe"]["id"]?>"
>

データの内容によってはクオートしなくても良いかもしれませんが、精神安定状したほうが良いような...

Attributes are placed inside the start tag, and consist of a name and a value, separated by an "=" character. The attribute value can remain unquoted if it doesn't contain ASCII whitespace or any of " ' ` = < or >. Otherwise, it has to be quoted using either single or double quotes. The value, along with the "=" character, can be omitted altogether if the value is the empty string.

  1. ajax
  2. POST
  3. new.php
  4. データベースチェック
    • データが有ればそのデータを削除
    • なければ作成
  5. ajaxの処理が終わればページをリロード
new.php
$user_id = $_SESSION['login_user']['id'];

とするなら、なぜajaxにuser_idを渡しているのか?とか箇所箇所のスペルとか色々気になる点はありますが、

  1. HTMLを見てみて.favorite_btnが意図したdataを持っているのか?
  2. ajaxでちゃんとサーバーに意図したdataが渡されているか?
  3. ちゃんとデータベースが更新されているか?
  4. ちゃんとページがリロードされているか?

辺りを手順を追って確認してみたら分かると思います。

0Like

Your answer might help someone💌