質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.44%
phpMyAdmin

phpMyAdminはオープンソースで、PHPで書かれたウェブベースのMySQL管理ツールのことです。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

Q&A

解決済

1回答

3389閲覧

ajaxにおける相対パスを繋げる方法

I_d

総合スコア28

phpMyAdmin

phpMyAdminはオープンソースで、PHPで書かれたウェブベースのMySQL管理ツールのことです。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

0グッド

0クリップ

投稿2022/07/06 10:52

ajaxにおける相対パスのが繋がらず非同期処理が出来ない状況です。
下記画像の❤️のいいねボタンを設置しようとしているのですが、
require_once(/Applications/MAMP/Views/Users/Good.php): failed to open stream: No such file or directory in /Applications/MAMP/public/index.php on line 8
とのエラーが出てしまいます。
イメージ説明
イメージ説明
good.jsのajax相対パスのurlをGood.php'→../Good.php'に変更して試しましたが、
require_once(/Applications/MAMP/Views/Good.php): failed to open stream: No such file or directory in /Applications/MAMP/public/index.php on line 8とエラーがでしまい../../Good.phpに変更してエラー内容は変わらないです。このエラーの解決方法をご教示頂きたいです。
よろしくお願い致します。

index.php

1<?php 2define('ROOT_PATH', str_replace('public', '', $_SERVER["DOCUMENT_ROOT"])); 3$parse = parse_url($_SERVER["REQUEST_URI"]); 4//ファイル名が省略されたいた場合、index.phpを補填する 5if (mb_substr($parse['path'], -1) === '/') { 6 $parse['path'] .= $_SERVER["SCRIPT_NAME"]; 7} 8require_once(ROOT_PATH.'Views'.$parse['path']);

good.js

1$(function() { 2 //いいね機能 3 var $good = $('.btn-good'),//いいねボタンセレクタ 4 goodPostId;//レシピID 5 //カスタム属性(postid)に格納された投稿ID取得 6 $good.on('click',function(e) { 7 e.stopPropagation(); 8 var $this = $(this); 9 //カスタム属性(postid)に格納された投稿ID取得 10 goodPostId = $this.parents('.post').data('postid'); //レシピID取得 11 $.ajax({ 12 url:'../Good.php',//post送信を受けとるphpファイル 13 type:'POST', 14 data:{post_id: goodPostId}//{キー:レシピID} 15 }).done(function(data){ 16 // いいねの総数を表示 17 $this.children('span').html(data); 18 // いいね取り消しのスタイル 19 $this.children('i').toggleClass('far'); //空洞ハート 20 // いいね押した時のスタイル 21 $this.children('i').toggleClass('fas'); //塗りつぶしハート 22 $this.children('i').toggleClass('active'); 23 $this.toggleClass('active'); 24 }).fail(function(msg) { 25 //console.log('Ajax Error'); 26 }); 27 }); 28});

good.php

1<?php 2require_once(ROOT_PATH .'/Models/Db.php'); 3class Good extends Db 4{ 5 public function __construct($dbh = null) 6 { 7 parent::__construct($dbh); 8 } 9 public function good($user_id, $recipe_id) 10 { 11 try { 12 $sql = 'SELECT *FROM goodsWHERE recipe_id = :recipe_id AND user_id = :user_id'; 13   $stmt = $this->dbh->prepare($sql); 14 $params = array( 15 ':user_id' => $user_id, 16 ':recipe_id' => $recipe_id 17 ); 18 $stmt -> execute($params); 19 $resultCount = $stmt -> rowCount(); 20 // レコードが1件でもある場合 21 if (!empty($resultCount)) { 22 // レコードを削除する 23 $sql = 'DELETE FROM goods WHERE recipe_id = :recipe_id AND user_id = :user_id'; 24 $stmt = $this -> dbh -> prepare($sql); 25 $params = array( 26 ':user_id' => $user_id, 27 ':recipe_id' => $recipe_id 28 ); 29 $stmt -> execute($params); 30 echo count($this -> getGood($recipe_id)); 31 } else { 32 // 1件もなかったらレコードを挿入する 33 $sql = 'INSERT INTO goods (recipe_id, user_id)VALUES (:recipe_id, :user_id)'; 34 $stmt = $this -> dbh -> prepare($sql); 35 $params = array( 36 ':recipe_id' => $recipe_id, 37 ':user_id' => $user_id 38 ); 39 40 $stmt -> execute($params); 41 echo count($this -> getGood($recipe_id)); 42 } 43 } catch (PDOException $e) { 44 exit($e); 45 } 46 } 47 //いいねした情報があるか確認 48 public function isGood($user_id, $recipe_id) 49 { 50 try { 51 $sql = 'SELECT * FROM goods WHERE recipe_id = :recipe_id AND user_id = :user_id'; 52 $sth = $this -> dbh -> prepare($sql); 53 $sth -> bindParam(':user_id', $user_id, \PDO::PARAM_INT); 54 $sth -> bindParam(':recipe_id', $recipe_id, \PDO::PARAM_INT); 55 $sth -> execute(); 56 return $sth; 57 } catch (Exception $e) { 58 error_log('エラー発生:' . $e->getMessage()); 59 } 60 } 61 //goodsテーブルからレシピID一致したいいね取得をするSQL文 62 public function getGood($recipe_id) 63 { 64 $sql = 'SELECT * FROM goods WHERE recipe_id = :recipe_id'; 65 $sth = $this -> dbh -> prepare($sql); 66 $sth -> bindParam(':recipe_id', $recipe_id, \PDO::PARAM_INT); 67 $sth -> execute(); 68 $result = $sth -> fetch(PDO::FETCH_ASSOC); 69 return $result; 70 } 71}

myrecipe.php

1<?php 2session_start(); 3require_once(ROOT_PATH .'/Controllers/UserController.php'); 4if (empty($_SESSION["login_user"])) { 5 header('Location: login_form.php'); 6} 7$recipe = new UserController(); 8$view = $recipe -> view(); 9$view_process = $recipe -> method(); 10$count_good = $recipe -> getGood($_GET['id']); 11$recipe_id = $view["recipe"]["id"]; //投稿ID 12$dbPostGoodNum = ''; //いいねの数 13if (!empty($_GET['id'])) { 14 // 投稿IDのGETパラメータを取得 15 $recipe_id = $_GET['id']; 16 // DBからいいねの数を取得 17 $dbPostGoodNum = $count_good; 18} 19?> 20<!DOCTYPE html> 21<html lang="en"> 22<head> 23 <meta charset="UTF-8"> 24 <link rel="stylesheet" href="/css/bootstrap.css" type="text/css"/> 25 <link rel="stylesheet" href="/css/form.css" type="text/css"/> 26 <href="https://use.fontawesome.com/releases/v5.15.4/css/all.css"> 27 <script src="../js/jquery-3.6.0.min.js" type="text/javascript"></script> 28 <script src="../js/good.js" type="text/javascript"></script> 29 <script defer src="https://use.fontawesome.com/releases/v5.15.4/js/all.js"></script> 30 <title>レシピ画面詳細</title> 31</head> 32<body style = "background-color :#FAEBD7;"> 33<?php include("header.php")?> 34<div class = "box"> 35 <div id = "recipe_box" class = "my-5 d-flex align-items-center justify-content-center" > 36 <div id = "recipe_left" style = "width:35%; height:250px;"> 37 <div id = "image_form"> 38 <img src = "<?php echo "/". $view["recipe"]["file_path"]?>" style = "width:80%;" class = "mx-4"> 39 </div> 40 <section style = "width:70%; height:20%;" class = "post mx-5" data-postid = <?php echo $recipe_id ?>> 41 <div style = "width:100%; height:70%;" class="btn-good <?php if ($recipe-> isGood($view["recipe"]["user_id"], $_GET['id'])) { 42 echo "active"; 43 }?>"> 44 <!-- 自分がいいねした投稿にはハートのスタイルを常に保持する --> 45 <i style = "width:100%; height:100%;" class="fa-heart fa-lg px-16 46 <?php 47 if ($recipe -> isGood($view["recipe"]["user_id"], $view["recipe"]["id"])) {//いいね押したらハートが塗りつぶされる 48 echo 'active fas'; 49 } else { //いいねを取り消したらハートのスタイルが取り消される 50 echo 'far'; 51 }; ?>"></i><span><?php echo $dbPostGoodNum; ?></span> 52 </div> 53 </section> 54 </div> 55 <div id = "recipe_right" style = "width:50%;" class = "mx-2"> 56 <div id = "recipe_form"> 57 <label for="name">タイトル</label><br> 58 <p><?php echo $view["recipe"]["name"];?></p> 59 </div> 60 <div id = "recipe_form"> 61 <label for="intro">ひとこと紹介</label><br> 62 <p><?php echo $view["recipe"]["introduce"];?></p> 63 </div> 64 <div class = "d-flex" style = "width:100%;"> 65 <div id = "recipe_form_figure"> 66 <label for="time">調理時間</label><br> 67 <p><?php echo $view["recipe"]["time"];?>分</p> 68 </div> 69 70 <div id = "recipe_form_figure" class = "mx-5"> 71 <label for="cost">費用</label><br> 72 <p><?php echo $view["recipe"]["cost"];?>円</p> 73 </div> 74 <div id = "recipe_form_figure"> 75 <label for="cost">目安</label><br> 76 <p><?php echo $view["recipe"]["serving"];?>人前</p> 77 </div> 78 </div> 79 </div> 80 </div> 81</div> 82<?php include("footer.html")?> 83</body> 84</html>

UserController.php

1<?php 2require_once(ROOT_PATH .'/Models/Good.php'); 3class UserController 4{ 5 private $request; //リクエストパラメータ(GET,POST) 6 private $User; //Userモデル 7 private $Recipe; //Recipeモデル 8 private $Process; //Processモデル 9 private $Image; //Imagesモデル 10 private $Good; //Goodモデル 11 public function __construct() 12 { 13 //インスタンス化で最初に走る処理 14 //get['id']とpostはrequestに入る 15 $this -> request['get'] = $_GET; 16 $this -> request['post'] = $_POST; 17 //モデルオブジェクトの生成 18 $this -> User = new User(); 19 $dbh = $this -> User -> getDbHandler(); 20 $this -> Recipe = new Recipe($dbh); 21 $this -> Process = new Process($dbh); 22 $this -> Image = new Image($dbh); 23 $this -> Good = new Good($dbh); 24 } 25 //Goodsテーブル 26 public function good($user_id, $recipe_id) 27 { 28 $good = $this -> Good -> good($user_id, $recipe_id); 29 } 30 public function getGood($recipe_id) 31 { 32 $get_good = $this -> Good -> getGood($recipe_id); 33 $params = $get_good; 34 return $params; 35 } 36 public function isGood($user_id, $recipe_id) 37 { 38 $is_good = $this -> Good -> isGood($user_id, $recipe_id); 39 $params = $is_good; 40 return $params; 41 }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

フレームワークが何か知りませんが(Laravelかなぁ?)、MVCならそもそもまずはGood用のViewクラス(Controllerクラスも?)作らないと。
仮にajaxでModelディレクトリにあるGood.phpにアクセスできたとしてもGoodクラス定義してるだけだから何も出力しませんよ。

投稿2022/07/06 13:03

RiaFeed

総合スコア2701

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

I_d

2022/07/07 13:09

ありがとうございます。 確かに定義しているだけでした。新しくファイルを作成し直したところ、実行することが出来ました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.44%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問