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

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

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

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

Q&A

解決済

3回答

681閲覧

PHP, MySQLの複数テーブルの検索

DaisukeKusakari

総合スコア16

PHP

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

0グッド

0クリップ

投稿2018/07/08 01:51

編集2018/07/08 03:53

PHPで学習塾のホームページを作成しております。

  1. ログインIDで生徒か先生か判別した上でそれぞれトップページに導くログイン機能を実装したいと考えています。しかし、MySQLを用いてteacher, studentのいずれのテーブルにも存在するカラムであるID, passwordの一致を調べる関数がうまく動作しません。複数テーブルから検索はどのような記述になるでしょうか。初歩的な質問で申し訳ございません。

php

1function select_teacher_member($dbh, $id, $password) { 2 $sql = 'SELECT * FROM teacher WHERE id = :id LIMIT 1'; 3  //ここのFROMの中を変更する? 4 $stmt = $dbh->prepare($sql); 5 $stmt->bindValue(':id', $id, PDO::PARAM_STR); 6 $stmt->execute(); 7 if($stmt->rowCount() > 0 ){ 8 $data = $stmt->fetch(PDO::FETCH_ASSOC); 9 if($password == $data['password']){ 10 return $data; 11 }else{ 12 return FALSE; 13 } 14 }else{ 15 return FALSE; 16 } 17}
  1. 生徒のログイン後、先生を絞り込み検索したいと考えております。そもそも、生徒と先生のテーブルを分けた方がいいでしょうか。分けた場合、IDが重複する可能性があります。分けなかった場合、先生と生徒を判別するカラムを追加する必要があります。先生の絞り込み検索やログイン後のトップページを分けることも見越した場合、いずれの方がより簡便にコード設計できるでしょうか。

よろしくお願いいたします。

sql

1CREATE TABLE `teacher` ( 2 `id` varchar(20) NOT NULL, 3 `password` varchar(255) NOT NULL, 4 `name1` varchar(20) NOT NULL, 5 `name2` varchar(20) NOT NULL, 6 `gender` tinyint(1) NOT NULL, 7 `birthday` date NOT NULL, 8 `entry` date NOT NULL, 9 `subject` int(3) NOT NULL, 10 `email` varchar(100) NOT NULL, 11 `message` varchar(200) DEFAULT NULL, 12 `photo` mediumblob 13) ENGINE=InnoDB DEFAULT CHARSET=utf8; 14 15INSERT INTO `teacher` (`id`, `password`, `name1`, `name2`, `gender`, `birthday`, `entry`, `subject`, `email`, `message`, `photo`) VALUES 16('honda', 'honda', '本田圭佑', 'ほんだけいすけ', 1, '1986-06-13', '2018-09-01', 120, 'honda@gmail.com', NULL, NULL), 17('ichihara', 'ichihara', '市原悦子', 'いちはらえつこ', 2, '1936-01-24', '1960-01-01', 127, 'ichihara@gmail.com', NULL, NULL); 18 19CREATE TABLE `student` ( 20 `id` varchar(20) NOT NULL, 21 `password` varchar(255) NOT NULL, 22 `name1` varchar(20) NOT NULL, 23 `name2` varchar(20) NOT NULL, 24 `gender` tinyint(4) NOT NULL, 25 `birthday` date NOT NULL, 26 `email` varchar(100) NOT NULL 27) ENGINE=InnoDB DEFAULT CHARSET=utf8; 28 29INSERT INTO `student` (`id`, `password`, `name1`, `name2`, `gender`, `birthday`, `email`) VALUES 30('ashida', 'ashida', '芦田愛菜', 'あしだまな', 2, '2004-06-23', 'ahida@gmail.com'), 31('suzuki', 'suzuki', '鈴木福', 'すずきふく', 1, '2004-06-14', 'suzuki@gamail.com'); 32

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

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

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

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

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

Orlofsky

2018/07/08 03:43

質問にteacher, studentのCREATE TABLEとINSERTを何件か提示してください。MySQL, SQL タグを追加してください。
DaisukeKusakari

2018/07/08 04:00

修正しました。ご確認お願い致します。
guest

回答3

0

ベストアンサー

以下のように、ユーザー、ロール(役割)テーブルを作成してログイン機能は共通にするのが定石では?

sql

1-- User 2CREATE TABLE `user` ( 3 `userId` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'プライマリーキー', 4 `roleId` int(11) unsigned NOT NULL COMMENT 'ロールID', 5 `displayName` varchar(64) NOT NULL COMMENT '氏名', 6 `email` varchar(128) NOT NULL COMMENT 'メールアドレス', 7 `password` varchar(255) NOT NULL DEFAULT '' COMMENT 'パスワード', 8 `loginFailureCount` tinyint(1) NOT NULL DEFAULT '0' COMMENT 'ログイン失敗回数', 9 `loginFailureDatetime` datetime DEFAULT NULL COMMENT 'ログイン失敗日時', 10 `deleteFlag` tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT '削除フラグ', 11 `createDatetime` datetime NOT NULL COMMENT 'データ作成日時', 12 `updateDatetime` datetime NOT NULL COMMENT 'データ更新日時', 13 `deleteDatetime` datetime DEFAULT NULL COMMENT 'データ削除日時', 14 `createUserId` int(11) unsigned NOT NULL DEFAULT '0' COMMENT 'データ作成ユーザーID', 15 `updateUserId` int(11) unsigned NOT NULL DEFAULT '0' COMMENT 'データ更新ユーザーID', 16 `deleteUserId` int(11) unsigned DEFAULT NULL COMMENT 'データ削除ユーザーID', 17 PRIMARY KEY (`userId`) COMMENT 'プライマリーキー', 18 UNIQUE KEY `email` (`email`), 19 KEY `createUserId` (`roleId`), 20 KEY `createUserId` (`createUserId`), 21 KEY `updateUserId` (`updateUserId`), 22 KEY `deleteUserId` (`deleteUserId`), 23 KEY `deleteFlag` (`deleteFlag`) 24) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='ユーザー';

sql

1CREATE TABLE `Role` ( 2 `roleId` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'プライマリーキー', 3 `roleName` varchar(64) NOT NULL DEFAULT '' COMMENT 'ロール名', 4 `deleteFlag` tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT '削除フラグ', 5 `createDatetime` datetime NOT NULL COMMENT 'データ作成日時', 6 `updateDatetime` datetime NOT NULL COMMENT 'データ更新日時', 7 `deleteDatetime` datetime DEFAULT NULL COMMENT 'データ削除日時', 8 `createUserId` int(11) unsigned NOT NULL DEFAULT '0' COMMENT 'データ作成ユーザーID', 9 `updateUserId` int(11) unsigned NOT NULL DEFAULT '0' COMMENT 'データ更新ユーザーID', 10 `deleteUserId` int(11) unsigned DEFAULT '0' COMMENT 'データ削除ユーザーID', 11 PRIMARY KEY (`roleId`), 12 KEY `createUserId` (`createUserId`), 13 KEY `updateUserId` (`updateUserId`), 14 KEY `deleteUserId` (`deleteUserId`) 15) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='ロール';

投稿2018/07/08 05:49

編集2018/07/08 05:52
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

そもそものアプリケーション仕様が確定していないから、変なところで悩むことになります。
アプリケーションの仕様が確定していれば、テーブルを1つにするか分けるかは、自明になるかと。

2つに分けているのであれば、その設計根拠があるはずなので、まずそこを整理することからはじめてみると良いです。

以下妄想
テーブルを分けていることから、先生用のアプリケーションと、生徒用のアプリケーションはほぼ独立したアプリケーションになっているのだと思います。
ので、ややこしいことはしないで、入り口を2つに分けてあげるとシンプルな設計で実現できます。

投稿2018/07/08 04:00

編集2018/07/08 10:20
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

DaisukeKusakari

2018/07/08 04:25

ご回答ありがとうございます。質問が不明瞭で、申し訳ございません。 アプリケーションの仕様としては、下記を想定しています。 共通:ログイン機能、スケジュール(カレンダー)管理、チャット機能 先生側: 予定(個別指導の日程)のアップロード 生徒側: 先生の絞り込み検索(年齢、教えられる教科など)-->個別指導予約 ログイン画面に生徒・先生のチェックボックスを作って入口を分ける手もありですが、ユーザーにひと手間を加えたくないなとも思いました。
退会済みユーザー

退会済みユーザー

2018/07/08 10:19

> アプリケーションの仕様としては、下記を想定しています アプリケーションの仕様と呼べる段階ではないです。 要求機能の段階で思考停止しているので、きちんと要件定義まで落とし込んでください。 例えば、要求機能の一部に ・先生のスケジュール集計を一日一度実施しなければならない ・生徒の名簿入れ替えが、春夏冬休み毎に発生する 等があって、アプリケーションの仕様を ・集計時間帯のログインを停止する ・名簿入れ替え時間帯のログインを停止する ・先生/生徒のそれぞれのメンテナンス時間帯に他方はログイン可能 とすると、ログイン画面が同じより、別であったほうがメンテナンス告知が楽であることに気が付きます。(まぁ、この場合、「ログイン画面を分ける」までがアプリケーションの使用になるので、例としては不適切ですが^^;) また、先生と生徒では名簿の保つ意味も違ってくるはずです。 例えば、名簿から削除される場合 ・先生→退職(復職を考慮せず。物理削除) ・生徒→受講終了(再登録の可能性あり。論理削除) とかの処理になるのであれば、テーブルは分けておいたほうがメンテナンスしやすいです。 ちゃんと設計しましょう。
DaisukeKusakari

2018/07/08 11:39

当方、まったくの初心者ですので非常に具体的に例示していただけると参考になります。ありがとうございます。 ・先生のスケジュール集計を一日一度実施しなければならない 特に集計する予定はありませんが、スケジュール入力依頼を2週間に1度、定期的に実施しなければなりません。それに対して、先生が適宜自らの予定を更新していきます。 ・生徒の名簿入れ替えが、春夏冬休み毎に発生する 名簿は随時変更されていきます。 ・先生→退職(復職を考慮せず。物理削除) これは、非常に重要な機能だと感じました。先生にアクティブ・非アクティブ(求職中か否か)の論理設計を加えようと思います。
guest

0

テーブルはひとつでも良いと思いますが
権限の違いを生徒と先生で作ることが出来れば大丈夫だと思います。
intで1~100の間なら生徒、それ以上であれば先生のような分岐でやりたいことができるかと

投稿2018/07/08 02:34

編集2018/07/08 03:32
ousetsuaki

総合スコア16

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

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

退会済みユーザー

退会済みユーザー

2018/07/08 03:22

プレースホルダをシングルクオートで囲んじゃ、ダメ。
DaisukeKusakari

2018/07/08 03:45

ousetsuakiさんご回答ありがとうございます。 luckerさんはテーブルの分離の是非についていかが思われますか。どちらでもいいといえばそうなのかもしれませんが…ちなみに、生徒テーブルに必要なカラムはすべて先生テーブルのカラムに含まれテーブルいます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問