いいね機能の実装が出来ない
いいね機能を実装したい
例)
PHP,jQueryで料理投稿サイトを作成しており、その中で
いいね機能の実装が1通り完了したのですが実際にボタンを押しても処理が完了しない状態です。
MVCモデルを利用しており、
Modelクラス:Good.php
Controllerクラス:UserController.php
Viewモデル:myrecipe.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;
}
}
}
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;
}
}
<?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>
//いいね機能
$(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();
});
});
<?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タグの配置をファイル先頭に変更等を行いましたが、結果は変わりませんでした。