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

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

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

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

PHP

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

Q&A

解決済

1回答

1411閲覧

別々のテーブルに一回でアクセスしたい

Keichi_Negishi

総合スコア25

MySQL

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

PHP

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

0グッド

1クリップ

投稿2021/05/18 09:05

実現したい事

xamppを使用してログイン機能を作っている所です。
テーブル:company_dataと、テーブル:home_dataに、同一のカラム名のidとpwがそれぞれあります。

①ログイン画面から$_POSTで送られてきたidとpwが、
②テーブルAとテーブルBのどちらかのテーブルのIDとPWと合致する場合のみ、
③$resultをtrueにしてlogin()関数の呼び出し元へ返す、という処理を実装したいです。

困っている事

テーブル:company_dataと、テーブル:home_dataへの効率的なアクセス方法が分かりません。
$pdo->prepare()からfetchAllまで一緒なので使い回しをしてなるべく少ない記述で終わらせたいです。

PHP

1 2<?php 3require_once('../common/config.php'); 4//ログイン処理 5function login($id, $pw){ 6 $pdo = new pdo(DSN,DB_USER,DB_PASS); 7 $stt = $pdo->prepare("SELECT id,pw FROM company_data WHERE id = :id AND pw = :pw"); 8 $stt->bindParam(':id', $id); 9 $stt->bindParam(':pw', $pw); 10 $stt->execute(); 11 $result = $stt->fetchAll(PDO::FETCH_ASSOC); 12 //どちらかのテーブルの中にidとpwがあれば$result=trueになる。 13 if($result){ 14 foreach($result as $r){ 15 $result['id'] = $r['id']; 16 $result['pw'] = $r['pw']; 17 } 18 }else{ 19 $stt = $pdo->prepare("SELECT id,pw FROM home_data WHERE id = :id AND pw = :pw"); 20 $stt->bindParam(':id', $id); 21 $stt->bindParam(':pw', $pw); 22 $stt->execute(); 23 $result = $stt->fetchAll(PDO::FETCH_ASSOC); 24 foreach($result as $r){ 25 $result['id'] = $r['id']; 26 $result['pw'] = $r['pw']; 27 } 28 } 29 if(isset($result)){ 30 return $result; 31 } 32} 33 34 35?> 36

試した事

INNER JOINを使用してテーブルの結合を試みましたが、コードの書き方がおかしく上手くいきませんでした。

PHP

1 $stt = $pdo->prepare("SELECT c.id,c.pw,h.id,h.pw FROM company_data AS c INNER JOIN home_data AS h ON c.id = :c.id AND c.pw = :c.pw OR h.id = :h.id AND h.pw = :h.pw");

ご回答頂けますと幸いです。
よろしくお願いいたします。

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

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

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

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

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

sazi

2021/05/18 09:32

どちらかという状況は、どちらか一方に存在するのでしょうか、それとも、両方に存在する事もある、のでしょうか?
takasima20

2021/05/18 11:21

自分も union に一票かな。関係ないけど、なんで id と pw 返してんの?
hoshi-takanori

2021/05/18 16:10

もしかしてパスワードを平文で保存してるってことですか?
Keichi_Negishi

2021/05/19 00:01

お返事が遅くなりました。 >どちらかという状況は、どちらか一方に存在するのでしょうか、それとも、両方に存在する事もある、のでしょうか? →両方に存在しています。適合したものが返されます。 自分も union に一票かな。関係ないけど、なんで id と pw 返してんの? →セッションで持たせるためです。 もしかしてパスワードを平文で保存してるってことですか? →平文で保存していますので、暗号化したものに変更したいと思っています。
hoshi-takanori

2021/05/19 00:11

> →セッションで持たせるためです。 パスワードを (たとえハッシュ化したものでも) セッションに持たせるのは良くないと思います。 > →平文で保存していますので、暗号化したものに変更したいと思っています。 暗号化ではなく password_hash を使ってハッシュ化することになると思いますが、乱数のソルトが加わるので、同じパスワードでも結果は毎回異なる値になります。このため、SELECT 文で pw = :pw という条件は使えず、取得した pw を password_verify することになると思います。
Keichi_Negishi

2021/05/19 00:22

根本的にこのコードの書き方ではマズイのですね。 https://tadworks.jp/archives/1147 コードはここのサイトのものを参考にして書きました。 ログイン機能に関して参考になるページがあれば よろしければ教えていただけますでしょうか。
guest

回答1

0

ベストアンサー

leftjoinしてnullを確認しても良いかも知れませんがunionのほうが自然かもしれません。

投稿2021/05/18 09:15

m.ts10806

総合スコア80875

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

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

Keichi_Negishi

2021/05/19 00:03

お返事が遅くなりました。 ご回答ありがとうございます。 一度やってみます。
Keichi_Negishi

2021/05/20 01:49

unionを使用して上手くいきました。 ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問