🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Chart.js

Chart.jsは、多様なグラフを組み込めるJavaScriptのライブラリ。折れ線グラフや棒グラフ、円グラフ、レーダーチャートなどのグラフの種類が用意されています。HTML5のCanvasを用いて描画され、マークアップも分かりやすく、簡単に編集することが可能です。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

Q&A

解決済

2回答

3921閲覧

現在ログインしているユーザーのみのデータを表示する

kotouharuto

総合スコア38

Chart.js

Chart.jsは、多様なグラフを組み込めるJavaScriptのライブラリ。折れ線グラフや棒グラフ、円グラフ、レーダーチャートなどのグラフの種類が用意されています。HTML5のCanvasを用いて描画され、マークアップも分かりやすく、簡単に編集することが可能です。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

0グッド

0クリップ

投稿2020/12/27 05:21

編集2020/12/27 08:50

実現したいこと

タイトルの通り、php, mysqlを使ってデータベースのデータをそのユーザーごとに分けて表示したいです。(マイページのようなもの)

現状

現在僕はアプリケーション制作の中の一つの機能として体重管理機能を作成しています。
そこでユーザーがログインした状態で体重を入力し、そのデータにuser_idを持たせてデータベースに登録し、そのデータを表示させる時に$user_idを基に現在ログインしているユーザーのデータのみを表示させるというものを作っています。
ですが、どうにも上手くそのユーザーのデータのみを表示させられず、全ユーザーが入力したデータが同時に表示させられてしまいます。
この状況を解決したいです

該当のソースコード

php

1// weight_chart.php(入力フォーム) 2<form method="post" action="weight_chart.php"> 3 <p>今日の日付</p><input type="date" name="date"> 4 <p>体重</p><input type="number" step="0.01" name="weight"><br><br> 5 <input type="submit" value="送信"> 6 </form>

php

1// weight_chart.php(機能面) 2// DB接続 3$pdo = db_connect(); 4$pdo->beginTransaction(); 5 6 7// 入力されたデータの受け取り 8$date = $_POST['date']; 9$weight = $_POST['weight']; 10 11$datenull = empty($date); 12$weightnull = empty($weight); 13 14// 入力されたかチェック 15if($date and $weight) { 16 if($datenull or $weightnull) { 17 header("Location: weight_chart.php"); // どちらか入力されていなければリダイレクト 18 exit(); 19 } else if($datenull and $weightnull) { 20 header("Location: weight_chart.php"); // どちらも入力されていなければリダイレクト 21 exit(); 22 } else { // しっかりと入力されていればリダイレクト 23 try { 24 $sql = "INSERT INTO chart(user_id, date, weight) VALUES (:user_id, :date, :weight)"; 25 $stmt = $pdo->prepare($sql); 26 $stmt->bindValue(':user_id', $_SESSION['user_id'], PDO::PARAM_STR); 27 $stmt->bindValue(':date', $date, PDO::PARAM_STR); 28 $stmt->bindValue(':weight', $weight, PDO::PARAM_STR); 29 $stmt->execute(); 30 $pdo->commit(); 31 header("Location: weight_chart.php"); 32 exit(); 33 } catch(PDOException $Exception) { 34 $pdo->rollback(); 35 $Exception->getMessage(); 36 echo $Exception; 37 header("Location: weight_chart.php"); 38 exit(); 39 } 40 } 41} 42 43// 空の変数$date, $weightを用意(DBのデータを表示するために) 44$date = ''; 45$weight = ''; 46 47//データ登録SQL作成 48$stmt2 = $pdo->prepare("SELECT * FROM chart WHERE user_id = :user_id"); 49$stmt2->bindValue(':user_id', $user_id, PDO::PARAM_INT); 50$status2 = $stmt2->execute(); 51$stmt2->fetchAll(); 52 53while($r = $stmt2->fetch(PDO::FETCH_ASSOC)) { 54 $user_id = $user_id . '"'. $r['user_id'].'",'; 55 $date = $date . '"'. $r['date'].'",'; 56 $weight = $weight . '"'. $r['weight'].'",'; 57} 58 59$user_id = trim($user_id, ","); 60$date = trim($date, ","); 61$weight = trim($weight, ","); 62?> 63 64<body> 65// ここからchart.jsのグラフ表示です。(体重表示グラフ) 66 <canvas id="myChart" width="400" height="400"></canvas> 67 <script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.9.3/Chart.bundle.min.js"></script> 68 <script> 69 var ctx = document.getElementById('myChart').getContext('2d'); 70 var myChart = new Chart(ctx, { 71 type: 'bar', 72 data: { 73 labels: [<?php echo $date ?>],//各棒の名前(name) 74 // labels: ['Red', 'Blue', 'Yellow', 'Green', 'Purple', 'ほげ'],//各棒の名前(name) 75 datasets: [{ 76 label: '# of Votes', 77 data: [<?php echo $weight ?>],//各縦棒の高さ(体重) 78 // data: [12, 19, 3, 5, 2, 20],//各縦棒の高さ(体重) 79 backgroundColor: [ 80 'rgba(255, 99, 132, 0.2)', 81 'rgba(54, 162, 235, 0.2)', 82 'rgba(255, 206, 86, 0.2)', 83 'rgba(75, 192, 192, 0.2)', 84 'rgba(153, 102, 255, 0.2)', 85 'rgba(255, 159, 64, 0.2)' 86 ], 87 borderColor: [ 88 'rgba(255, 99, 132, 1)', 89 'rgba(54, 162, 235, 1)', 90 'rgba(255, 206, 86, 1)', 91 'rgba(75, 192, 192, 1)', 92 'rgba(153, 102, 255, 1)', 93 'rgba(255, 159, 64, 1)' 94 ], 95 borderWidth: 1 96 }] 97 }, 98 options: { 99 scales: { 100 yAxes: [{ 101 ticks: { 102 beginAtZero: true 103 } 104 }] 105 } 106 } 107 }); 108 </script> 109   </body>

php

1<?php 2// login_exec.php(ログイン機能) 3require_once "../libs/init.php"; 4 5function Login() { 6 // エラーがあったら表示 7 if (isset($_GET['error'])) { 8 echo $_GET['error']; 9 } 10 11 // ログインしていない場合 12 $email = $_POST['email']; 13 $_SESSION['email'] = $_POST['email']; 14 $password = $_POST['password']; 15 16 17 // //DB内でPOSTされたメールアドレスを検索 18 try { 19 $pdo = db_connect(); 20 $row = Search_Email($pdo, $email); 21 } catch(\Exception $e) { 22 echo $e->getMessage(); 23 } 24 25 //emailがDB内に存在しているか確認 26 if(!isset($row['email'])) { 27 header('Location: login.php?error=メールアドレス又はパスワードが間違っています。'); 28 return false; 29 } 30 31 //パスワード確認後にsessionにメールアドレスを渡す 32 if(password_verify($password, $row['password'])) { 33 session_regenerate_id(true); //session_idを新しく生成し、置き換える 34 $_SESSION['user_id'] = $row['user_id']; 35 $_SESSION['USERNAME'] = $row['username']; 36 $user_id = $_SESSION['user_id']; 37 // ログインに成功したらcalendarphpリダイレクト 38 header("Location: calendar.php"); 39 } else { 40 // ログインに失敗したらlogin.phpにリダイレクト 41 header("Location: login.php?error=メールアドレス又はパスワードが間違っています。"); 42 return false; 43 } 44} 45 46Login(); 47 48

試したこと

  • データをデータベースに挿入する時点でuser_idを持たせる
  • データベースからデータを検索する時に、条件として、WHERE user_id = :user_idを指定する

補足情報

chartテーブルです。

-- phpMyAdmin SQL Dump -- version 4.9.3 -- https://www.phpmyadmin.net/ -- -- ホスト: localhost:8889 -- 生成日時: 2020 年 12 月 27 日 06:25 -- サーバのバージョン: 5.7.26 -- PHP のバージョン: 7.4.2 SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO"; SET time_zone = "+00:00"; -- -- データベース: `tr_ng` -- -- -------------------------------------------------------- -- -- テーブルの構造 `chart` -- CREATE TABLE `chart` ( `user_id` int(11) NOT NULL, `id` int(11) NOT NULL, `date` varchar(100) NOT NULL, `weight` varchar(100) NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -- -- テーブルのデータのダンプ `chart` -- INSERT INTO `chart` (`user_id`, `id`, `date`, `weight`) VALUES (1, 43, '2020-12-27', '64'), (1, 44, '2020-12-27', '63'); -- -- ダンプしたテーブルのインデックス -- -- -- テーブルのインデックス `chart` -- ALTER TABLE `chart` ADD PRIMARY KEY (`id`); -- -- ダンプしたテーブルのAUTO_INCREMENT -- -- -- テーブルのAUTO_INCREMENT `chart` -- ALTER TABLE `chart` MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=45;

また、ユーザー管理のdbは以下の画像のようになっています。(usersテーブル)
イメージ説明

テーブルの中身はこのようになっています。(テーブル内のデータ)
イメージ説明


以上です。
わかる方がいらしたらご回答よろしくお願いします。

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

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

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

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

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

moromon

2020/12/27 05:32

DBに登録されたchartテーブルの中身の貼り付けをお願いします。
kotouharuto

2020/12/27 06:24

ありがとうございます。 了解しました。
moromon

2020/12/27 06:48

貼り付けありがとうございます。テーブルの中身なので、テーブルの定義ではなく、登録されたデータをお願いします。
kotouharuto

2020/12/27 08:48

返信遅くねってしまって申し訳ないです。 そういうことですね、了解しました。
moromon

2020/12/27 08:53

DBの中身が確認できました。予想していた同じuser_idのユーザの重複が原因だと思います。回答にも記載しましたのでご確認ください。
guest

回答2

0

ベストアンサー

失礼しました。こちらにデータのダンプが書いてありましたね。

mysql

1INSERT INTO `chart` (`user_id`, `id`, `date`, `weight`) VALUES 2(1, 43, '2020-12-27', '64'), 3(1, 44, '2020-12-27', '63');

出力されているのは以上二つのデータでよろしいでしょうか?

だとすると、全ユーザのデータが表示されているではなく、
重複したuser_idを登録して、その2件が表示されているんだと思います。
つまり、mysqlのデータの取得はできているし、間違っていないけど、データ登録のところでまちがっているのかもしれません。

同じユーザーデータがある場合はInsert文ではなく、update文を使って、データを一つにしたら解決しそうです。

いただいた情報をもとに原因を考えてみました。
ご参考いただければと思います。

投稿2020/12/27 06:58

moromon

総合スコア86

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

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

kotouharuto

2020/12/27 08:55

ご回答ありがとうございます。 自分でも言われて気づきましたが、確かにそうですね笑 そういうことなんですね! ご教示頂いたことを参考にしながら試行錯誤してみます。 ご丁寧にありがとうございます。
moromon

2020/12/27 08:58

ヒントになれることがあったならよかったです^^ ちなみにDBの内容がちゃんと取得できるかどうかは、 いろんなデータを入れてテストをきちんとした方がよりバグの少ないプログラムが書けます。(今回の場合だとuser_id=2のデータを入れてみて、user_id=1のユーザで取得できないことを確認するとか) ご参考まで。 がんばってください!
kotouharuto

2020/12/28 08:19

返信が遅れて申し訳ないです。 確かにテストは入念にした方が良さそうですね、新しいユーザーを作成して試してみます。 はい、ありがとうございます!!
guest

0

セッション管理回りと、変数$user_idへの代入をしているコードがないのではっきりとは分からないな。
そもそもユーザーidが取れてないんじゃない?
selectする時とinsertする時の両方でuser_idがちゃんと取れていない=空ならば全件が引っかかってもおかしくない。
DBの中身はどうなってる?

投稿2020/12/27 05:58

fukken

総合スコア73

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

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

kotouharuto

2020/12/27 06:35

ご回答ありがとうございます。 情報を補足しましたのでご確認よろしくお願いします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問