実現したいこと
タイトルの通り、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テーブル)
テーブルの中身はこのようになっています。(テーブル内のデータ)
以上です。
わかる方がいらしたらご回答よろしくお願いします。
回答2件
あなたの回答
tips
プレビュー