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

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

詳細はこちら
PHP

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

Q&A

解決済

1回答

1635閲覧

PHP ログインした人と登録したデーターでidが一致したものだけを表示させたい

Harumasalada

総合スコア1

PHP

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

0グッド

1クリップ

投稿2021/01/19 11:16

編集2021/01/19 11:22

前提・実現したいこと

PHP始めたての初心者で、PHPで人物を登録管理できるシステムを作っております。

登録したものの一覧を表示する画面で、ログインした人が登録したデータだけを表示させたいのですが、他の人が登録したデータも表示されてしまいます。

databaseを使わずに、JSONを使用しないといけないため、JSONを使ってデーターを保存しています。

ログインしているユーザIDと、JSONのユーザIDが一致するものだけを表示するようにすればいいということはわかるのですが、実装方法がわかりません。

どなたかご教授頂けると幸いです。(コードが汚いのは、ご了承ください)

該当のソースコード

PHP

1//実装方法がわからないページです 2<?php 3session_start(); 4?> 5 6 7<!DOCTYPE html> 8<html> 9<body> 10 11<?php if(isset($_SESSION['login_user'])) { ?> 12 こんにちは <?= $_SESSION['login_user'] ?>さん 13 <?php } else { ?> 14 ログインしてください 15<?php } ?></br> 16<a href="logout.php">ログアウトする</a> 17 18<h1>名前一覧</h1> 19<tr> 20 <td><a href="form.php">新規登録する</a></td> 21</tr></br> 22<tr> 23 <td><a href="index.php">詳細一覧へ</a></td> 24</tr> 25<table> 26 <tr> 27 <th>名前</th> 28 </tr> 29 30 <?php 31 foreach (glob('*.json') as $filename) { 32 if ( ($fp = fopen($filename, 'rb')) !== FALSE ) { 33 $json_str = fread($fp, filesize($filename)); 34 fclose($fp); 35 $json = json_decode($json_str, TRUE); 36 ?> 37  <tr> 38 <td><?= $json['name'] ?></td> 39 </tr> 40 <?php 41 } 42 } 43 ?> 44</table> 45 46</body> 47</html>

PHP

1//form登録の際にログインする人のユーザーIDを保存しております。 2<?php 3 session_start(); 4 5 $user = $_SESSION['login_user']; 6 $name = $_POST['name']; 7 $day = $_POST['day']; 8 $description = $_POST['description']; 9 10 $json = array("login_user"=> $user, 11 "name"=> $name, 12 "day" => $day, 13 "description" => $description); 14 $json_str = json_encode($json); 15 $filename = date('YmdHis') . ".json"; 16 if ( ($fp = fopen($filename, 'wb')) !== FALSE ) { 17 fwrite($fp, $json_str); 18 fclose($fp); 19 } 20?> 21<a href="home.php">名前一覧へ</a>

PHP

1//一応ログインできるか確認する画面です 2<?php 3 session_start(); 4 5 $login_id = $_POST['login_id']; 6 $password = $_POST['password']; 7 8 foreach (glob('*.json') as $filename) { 9 if ( ($fp = fopen($filename, 'rb')) !== FALSE ) { 10 $json_str = fread($fp, filesize($filename)); 11 fclose($fp); 12 13 $json = json_decode($json_str, TRUE); 14 if ($json['login_id'] == $login_id && password_verify($password, $json['password'])) { 15 $_SESSION['login_user'] = $login_id; 16 break; 17 } 18 } 19 } 20?> 21<?php if (isset($_SESSION['login_user'])) { ?> 22 ログインしました。<a href="home.php">ホームへ</a> 23<?php } else { ?> 24 ログインできませんでした。 25<?php } ?> 26

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

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

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

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

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

takasima20

2021/01/19 11:30

なんでファイル名を日時にしてんの?
退会済みユーザー

退会済みユーザー

2021/01/19 11:32 編集

素直にデータベースにデータ登録して、抽出もSQLで解決すればいいところを、jsonファイルでの管理にこだわり理由はなんですか? 気になる箇所の変数を var_dump($json_str); などとデバッグ出力させれば、想定通りデータが入ってきているか確認できるのですが、やっていますか?
Harumasalada

2021/01/19 12:16

ファイル名を日時にしている理由はありません。他のファイル名に変えた方がよいのでしょうか
Harumasalada

2021/01/19 12:20

課題での制作のため、データベースでデータを登録せずにjsonファイルでの管理するよう条件があるからです。すみません。変数もまだPHP始めたばかりでデバックの出力の仕方もわからずなので、やっておりません。
takasima20

2021/01/19 13:24

1 ユーザーにつき 1ファイル作るんだったら、ユーザー.json みたいな名前にしたら処理しやすいんじゃ? てか、配列にして 1ファイルで扱うのがよさそげでもあったり?
退会済みユーザー

退会済みユーザー

2021/01/19 15:07

課題として守らなければいけない要求、自分で肉付けした仕様、がわかるようにしてほしいかな。
m.ts10806

2021/01/20 00:12

「課題で」なら出題者、講師に聞かれたほうが良いかと思います。 課題には目的があり、要件があります。 全く事情の知らない第三者のアドバイスで果たして「課題の達成」と言えるんでしょうか。 「一般論」を求めることになるので「JSONでの動的データ管理は悪手」という前提で話が来るのも無理はありません。
退会済みユーザー

退会済みユーザー

2021/01/20 00:50

回答書いてみたけど、ファイルのデータ構造が示されていないから合ってるのか間違ってるのかも判断つかないわー。
Harumasalada

2021/01/20 00:57

自分で全て打ったものなので、わかりにくくなってしまい、すみません。 講師に何回も聞いたのですが、自分の理解が及ばず、このような形で聞かせてもらいました。ごもっともです。申し訳ありません。 他の実装部分は自分で課題達成に向けて頑張ります。
m.ts10806

2021/01/20 00:58

「分かるまで聞く」です。 聞き方を変えたら分かるような回答もあるかもしれませんよ。
Harumasalada

2021/01/20 01:21

確かに今回の自分の質問のように聞き方が、曖昧になってしまっているところがあったかもしれません。 もっと相手が理解しやすいように質問の仕方を変えてみるべきですね。 私自身も反省して次から頑張ってみようと思います。
m.ts10806

2021/01/20 01:26

既に結構悪いですね。 聞き方で答えの方向性は決まりますよ。 「可能ですか」と聞けばCan/Can notなので「可能です/不可能です」としか返ってきません。 というか大抵のことは「可能です」としか言いようがないです。 「そのように作れば可能」なので。「自分の力でできるか」を聞きたいならそう聞くべきで、 自身が理解していることなど、自身の技術力や理解を相手に伝えなければなりません。 考えた結果を述べたうえで「これでいいか」とYes/Noを聞くのならまだOKですが、 この手の質問サイトでは悪手でしょうね。 「質問するときのヒント」熟読してください。
Harumasalada

2021/01/20 02:22

可能か、不可能か聞かれたら、確かにどっちかしか解答しようがありませんね。 自身のことをもう少し伝えたうえで、求めている解答が得られるような質問を考えられるよう、今後気を付けます。 ご助言ありがとうございます。
guest

回答1

0

ベストアンサー

登録したものの一覧を表示する画面で、ログインした人が登録したデータだけを表示させたい

とのことですが、なんのどの情報を頼りに判断するかが不明瞭です。
jsonを収めるファイルにどういう仕様でデータを持たせようとしているのか、
パット見て何で判断したいかを例示もせずに他者に依頼したりすると、
間違ったものが納品されたりしますから注意しましょう。

jsonに仕立てている

php

1 $json = array("login_user"=> $user, 2 "name"=> $name, 3 "day" => $day, 4 "description" => $description);

というのの"login_user"と$_SESSION['login_user'];とが一致していればいいのであれば、
読み込んだjson文字列をphpの配列データに変換して、比較すればいいってことになりますが。

php

1if ($json['login_user'] === $_SESSION['login_user']) : 2?> 3  <tr> 4 <td><?= $json['name'] ?></td> 5 </tr> 6<?php 7endif;

で意図通りになりますかどうか。

なお、机上のみで動作させていませんので。

ところで、「実装方法がわからないページです」において、
ログインしていようがしていまいが、
リスト表示はしてしまうようですが、
それでいいの?

投稿2021/01/20 00:46

編集2021/01/20 00:52
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

Harumasalada

2021/01/20 01:12

今後は注意致します。ご教示ありがとうございます。 私が考えていた通りに動きました。わかりにくい質問でしたが、本当にありがとうございました! 恐らく大丈夫なのですが、リスト表示をしないようにすることは可能なのでしょうか?無知で申し訳ないです。
退会済みユーザー

退会済みユーザー

2021/01/20 01:15

ログインしていない場合に表示したくない箇所を <?php if(isset($_SESSION['login_user'])) { ?> (表示したくない箇所) <?php } ?> で括ればよいのではないか、という推測も立ちませんか、そうですか。
Harumasalada

2021/01/20 01:37

ご回答ありがとうございます。 何度もお手を煩わせてしまって申し訳ありません。 落ち着いて考えれば確かにそのような形で書けば実装できますね。 一度考えてから質問をすべきでした。
退会済みユーザー

退会済みユーザー

2021/01/20 01:45

コードの実行で大金が消えるとか人が死ぬとかいう話ではないので、 こうかもしれない→書いて実行してみる→検証してみる が、気軽にできるのが良いところなので、 まず書いて実行してみてダメならその原因を仮定して対策して、 それでもダメなら質問する、くらいのほうが望ましいです。 (他人の貴重な時間を使わずに済みますし。) もちろん、正常に動作した最後の状態(ファイルやデータ)をバックアップを取っといてから、です。
Harumasalada

2021/01/20 02:15

とてもためになります。 一回で正解のコードを書かないといけないという考えに囚われてしまって、頭の中でずっと考えてしまうことが多いので、 もっと実行して対策してみます。 色々指摘してくださり、とても勉強になりました。 重ね重ねありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問