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

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

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

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

phpMyAdmin

phpMyAdminはオープンソースで、PHPで書かれたウェブベースのMySQL管理ツールのことです。

PHP

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

Q&A

解決済

2回答

3877閲覧

PHPとMySQLについて

hiziki

総合スコア54

MySQL

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

phpMyAdmin

phpMyAdminはオープンソースで、PHPで書かれたウェブベースのMySQL管理ツールのことです。

PHP

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

0グッド

1クリップ

投稿2016/03/26 04:06

イメージ説明

今、PHPとMySQLを使った認証システムを作成しているのですが、ここで質問があります。

自分が新たに「partid」というものを付けてみました。

しかし、PHPにpartidを表示することができません。

今は、以下のコードを使用しています。

ようこそ<?=htmlspecialchars($_SESSION["USERID"], ENT_QUOTES); ?>さん<BR><BR>
あなたは<?=htmlspecialchars($_SESSION["PARTID"], ENT_QUOTES); ?>パートの方です。

このコードだと、Useridは表示されるのですが、partidは表示されません。

partidをPHPに表示する方法を教えてください。

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

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

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

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

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

lib

2016/03/26 04:43 編集

情報が不足しすぎています。データベースの元あるテーブルに新規にカラムを追加(編集も同様です)した場合、データベースから情報を取得する処理にも同じように取得のカラムを指定する必要があります。SQLを利用されているのであればそのコードを、フレームワークを利用されているのであればフレームワークの名前とバージョンを明記していただかないと、推測でも回答がしにくいです。そのへんのご確認いただけますと幸いです。
hiziki

2016/03/26 04:43

ご感想、ありがとうございます。 SQLはMySQL(PHPMyAdmin)というのを使用していると思われます。 すみませんが、SQLのコードはどこをみればいいのでしょうか? 初心者なものでわからないのです。
lib

2016/03/26 04:52 編集

あなたの書かれたコード、「<?=htmlspecialchars($_SESSION["PARTID"], ENT_QUOTES); 」を書いておられる以前(以降も含む)に[mysqli][query][PDO][PDO::query][SELECT](小文字表記も含む)などのいずれかが書かれているコードがphpにあるはずです。PHPのバージョンがない。エラーの詳細もないのは質問としておかしいですよ。表示がされないというのはエラーであればエラー情報も追記してください。PHPの学習者(初心者)であれば、まずPHPでセッション間の値受け渡しの基本と、データベースの基本くらいは学習してくれないと、サポートサイトではないので使い方が間違っており姿勢としてよろしくないですよ。
hiziki

2016/03/26 07:40

$_SESSIONの前に書いてあるのは、 <?php error_reporting(E_ALL & ~E_NOTICE); session_start(); // ログイン状態のチェック if (!isset($_SESSION["USERID"])) { header("Location: ../login.php"); exit; } ?>です。 そのあとに、 ようこそ<?=htmlspecialchars($_SESSION["USERID"], ENT_QUOTES); ?>さん<BR><BR> あなたは<?=htmlspecialchars($_SESSION["PARTID"], ENT_QUOTES); ?>パートの方です。 を付けています
lib

2016/03/26 08:29 編集

関係・無関係なく全ソースコードを提示していただけますか。データベースとの関係性も疑わしくなりました。まさかとはおもいますがphpMyAdmin(データベース管理用のソフトウェア)の改造でもされてるんでしょうか?またコードの提示ですが、専用のタグボタンがあるので是非ご利用を。 こちら→< / >
hiziki

2021/04/12 16:32 編集

SQLと思われるものをエクスポートしてみました (※ ログインユーザー・パスワードが含まれてたため、削除しました)
guest

回答2

0

ベストアンサー

$_SESSION['userid']を$_SESSION['partid'] と変えることについてですが、
そもそも前画面(login.php)で値を受け取る構造になっていないので、その構造になるように修正が必要です。

そのためには、いくつかのポイントがあるので、それぞれごとの説明を実際にソースを提示しながら
していきます。
またこの設計の前提条件ですが**、userid を partidとして扱いたいという要件**を推測で決め打ちしている点をご了解いただければ。

[追記] ここから
この解説の参考サイト:
1.SQL
2.PHPのセッション
3.htmlとフォーム
[追記] ここまで


以下解説
1.SQLの修正
認証にuseridではなくpartidにする必要があります。
partidは、php内部でHTML出力をしている点がありますので、そちらの修正時に提示します。

2.phpの修正
(1) 入力された情報は、$_POST["userid"]という形で受け取れるので、これを$_POST["partid"]
とすることになります。こうすることで、入力された値は、partidとして受け取れます。

(2) 入力値の検証(入力されているか)

(3) 認証処理(データベースに値が存在しているか)

(4) (2)(3)の検証が成功の場合は、$_SESSION["userid"] = $_POST["userid"]という形で
PHP間で利用するセッション用の変数に代入させています。
これは、$_SESSION["partid"]として画面で使いたいため、
$_SESSION["partid"] = $_POST["userid"]とするようにします。

3.php内部のhtmlの修正
入力フォーム<form>タグの中身を以下のイメージで修正します。

入力させる内容をpartid( $_POST["partid"] ) として受け取るため、
<input type="text" id="userid" name="userid" value="<?php echo htmlspecialchars($_POST["userid"], ENT_QUOTES); ?>">
とされているところを、すべてpartidに修正することとします。

<input type="text" id="partid" name="partid" value="<?php echo htmlspecialchars($_POST["partid"], ENT_QUOTES); ?>">

以下各ソースごとの解説。 コメントで適宜入れています。

main.phpでは、useridの表示ではなくあらかじめlogin.phpで入力されたpartidを
表示している。以下大まかな処理のイメージを順番に
(1) login.phpで入力フォームを作成。

(2) login.phpで入力からpartid, passwordを受け取る。

(3) 事前チェックで入力値が空でないことを確認して、認証させる。

(4) 認証は、partidがデータベースに存在しているか。

(5) データが存在すると、main.phpを表示するようにしている。

login.php
主にユーザーからの入力と検証、またログインチェック(データが存在するか)を行う。
ログインに成功(データの存在確認)すると、main.phpを表示させる。

php

1<?php 2require 'password.php'; 3// セッション開始 4session_start(); 5 6// エラーメッセージの初期化 7$errorMessage = ""; 8 9// ログインボタンが押された場合 10if (isset($_POST["login"])) { 11 // 1.ユーザIDの入力チェック 12 // [teratail]ここでユーザーIDをpartidとして渡されたものを$_POST["partid"]として受け取っている 13 // ここでは、入力されたpartidが空かどうかをチェックしている。 14 // 認証時の情報をチェックさせるのがuseridの場合は、$_POST["userid"]とすること 15 if (empty($_POST["partid"])) { 16 $errorMessage = "ユーザIDが未入力です。"; 17 } else if (empty($_POST["password"])) { 18 $errorMessage = "パスワードが未入力です。"; 19 } 20 21 // 2.ユーザIDとパスワードが入力されていたら認証する 22 // [teratail]ここでは、ログインに必要な partidとpasswordをPOSTで受け取っている。 23 // formでSUBMITボタンを押下することで、遷移させた先で、$_POST["partid"]と$_POST["password"]と受け取れるが、その中身が入力されているか。をチェックしている。 24 // 入力していればログイン認証を実行させるため。 25 // 入力値のチェックをuseridで行いたい場合は、$_POST["userid"]とすること。 26 if (!empty($_POST["partid"]) && !empty($_POST["password"])) { 27 // mysqlへの接続 28 $mysqli = new mysqli('ホスト名', 'ユーザー名', 'パスワード'); 29 if ($mysqli->connect_errno) { 30 print('<p>データベースへの接続に失敗しました。</p>' . $mysqli->connect_error); 31 exit(); 32 } 33 34 // データベースの選択 35 $mysqli->select_db('データベース名'); 36 37 // 入力値のサニタイズ 38 $userid = $mysqli->real_escape_string($_POST["partid"]); 39 40 // クエリの実行 41 // [terail]1.SQLの修正 42 // あらかじめ入力されたpartidが存在しているかをチェックしている。 43 // 入力をuseridで行いたい場合は、$partidではなく$useridとすること。 44 $query = "SELECT * FROM テーブル名 WHERE name = '" . $partid . "'"; 45 $result = $mysqli->query($query); 46 if (!$result) { 47 print('クエリーが失敗しました。' . $mysqli->error); 48 $mysqli->close(); 49 exit(); 50 } 51 52 while ($row = $result->fetch_assoc()) { 53 // パスワード(暗号化済み)の取り出し 54 $db_hashed_pwd = $row['password']; 55 } 56 57 // データベースの切断 58 $mysqli->close(); 59 60 // 3.画面から入力されたパスワードとデータベースから取得したパスワードのハッシュを比較します。 61 //if ($_POST["password"] == $pw) { 62 if (password_verify($_POST["password"], $db_hashed_pwd)) { 63 // 4.認証成功なら、セッションIDを新規に発行する 64 session_regenerate_id(true); 65 // [teratail]ここで入力されたpartidをセッション用の変数に代入している。 66 // $_SESSION["PARTID"] = 値 67 // 以降は、PHP間セッションが有効な間 $_SESSION["PARTID"]として受け取り表示や検証が行える。 68 $_SESSION["PARTID"] = $_POST["partid"]; // <- [teratail]この記述が代入で、かつ必要な絶対条件です。 69 // [teratail]この渡し方は、あらかじめFORMから入力されたname="partid"の属性をもつ、タグinputから受け取っている。 70 71 header("Location: main.php"); 72 exit; 73 } 74 else { 75 // 認証失敗 76 $errorMessage = "ユーザIDあるいはパスワードに誤りがあります。"; 77 } 78 } else { 79 // 未入力なら何もしない 80 } 81} 82 83?> 84<!doctype html> 85<html> 86 <head> 87 <meta charset="UTF-8"> 88 <title>サンプルアプリケーション</title> 89 </head> 90 <body> 91 <h1>ログイン機能 サンプルアプリケーション</h1> 92 <!-- $_SERVER['PHP_SELF']はXSSの危険性があるので、actionは空にしておく --> 93 <!--<form id="loginForm" name="loginForm" action="<?php print($_SERVER['PHP_SELF']) ?>" method="POST">--> 94 <!-- [teratail]ここからログインのフォームです。formタグ内で囲まれた範囲内で入力をさせるフォーム作成している--> 95 <form id="loginForm" name="loginForm" action="" method="POST"> 96 <fieldset> 97 <legend>ログインフォーム</legend> 98 <div><?php echo $errorMessage ?></div> 99 <!--[teratail] ここでpartidをユーザーIDとみなして入力させている 100 もし、useridで入力させる場合は、$_SESSION["PARTID"]ではこの構造では受け取れないため 101 SQLの具体的な必要です。「useridの認証の確認だけではなく、partidを受け取ること。」 102 --> 103 <label for="userid">ユーザID</label><input type="text" id="partid" name="partid" value="<?php echo htmlspecialchars($_POST["partid"], ENT_QUOTES); ?>"> 104 <br> 105 <label for="password">パスワード</label><input type="password" id="password" name="password" value=""> 106 <br> 107 <input type="submit" id="login" name="login" value="ログイン"> 108 </fieldset> 109 </form> 110 <a href="add.html">ユーザー情報登録ページへ</a> 111 </body> 112</html>

main.php

ログインに成功すると表示される画面、また画面ではセッションに$_SESSION["PARTID"]が存在するかをチェックし存在しなければ、直ちにlogout.phpを表示させる。
ログインに成功してれば、$_SESSION["PARTID"]は存在しているので、画面に表示される。

php

1<?php 2session_start(); 3 4// ログイン状態のチェック 5if (!isset($_SESSION["PARTID"])) { 6 header("Location: logout.php"); 7 exit; 8} 9 10?> 11 12<!doctype html> 13<html> 14 <head> 15 <meta charset="UTF-8"> 16 <title>サンプルアプリケーション</title> 17 </head> 18 <body> 19 <h1>ログイン機能 サンプルアプリケーション</h1> 20 <!-- ユーザIDにHTMLタグが含まれても良いようにエスケープする --> 21 <!-- [teratail]ここでpartidをPHP間でlogin.phpから渡されたので、受け取ることができる--> 22 <p>ようこそ<?=htmlspecialchars($_SESSION["PARTID"], ENT_QUOTES); ?>さん</p> 23 <ul> 24 <li><a href="logout.php">ログアウト</a></li> 25 </ul> 26 </body> 27</html>

[追記]
logout.php

閲覧の必要がなくなった時にログアウトして表示される画面
また、セッションタイムアウトした時には、セッションタイムアウトがわかるメッセージが表示される
主に$_SESSION["USERID"]が存在有無にかかわらずメッセージが表示される

ここでは、設計前提に従い、
PARTIDとして扱いたいため $_SESSION["USERID"]をPARTIDとして変更させる必要がある。

php

1<?php 2session_start(); 3 4// [teratail]$_SESSION["PARTID"]が存在しないときにログアウトしましたと表示される 5if (isset($_SESSION["PARTID"])) { 6 $errorMessage = "ログアウトしました。"; 7} 8else { 9 $errorMessage = "セッションがタイムアウトしました。"; 10} 11// セッション変数のクリア 12$_SESSION = array(); 13// クッキーの破棄は不要 14//if (ini_get("session.use_cookies")) { 15// $params = session_get_cookie_params(); 16// setcookie(session_name(), '', time() - 42000, 17// $params["path"], $params["domain"], 18// $params["secure"], $params["httponly"] 19// ); 20//} 21// セッションクリア 22@session_destroy(); 23?> 24 25<!doctype html> 26<html> 27 <head> 28 <meta charset="UTF-8"> 29 <title>サンプルアプリケーション</title> 30 </head> 31 <body> 32 <h1>ログイン機能 サンプルアプリケーション</h1> 33 <div><?php echo $errorMessage; ?></div> 34 <ul> 35 <li><a href="login.php">ログイン画面に戻る</a></li> 36 </ul> 37 </body> 38</html>

[終わりに]


以上で解説を終えますが、

当初の質問から懸念していた内容は、どこかのサイトを参照したという記述がなかったため
どの回答をすべきかという点がわからず推測で対応することになりました。
以降質問する際は、 まず なにを したか  そして なにを 調べて どう 判断(感じた)か。
それを 5H1H形式であらかじめ質問の整理を行うようにしてください。自分が困った内容を、アヒルに説明してみる。
というのがありますが。僕は幼稚園に説明するとしたら。をお勧めします。
そうすることで、回答を持ってる方が即時で回答ができたり、また、別の質問者がこの回答や質問を
ご覧になった時に参考になることがあります。

投稿2016/03/26 11:46

編集2016/03/26 12:05
lib

総合スコア446

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

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

hiziki

2016/03/26 15:51

ご丁寧に回答していただいて誠にありがとうございました。 login.php でpartidを読み込んでない事に気付いたので、それを既存のファイルに入れてみたところ、無事partidが表示されるようになりました。 注意された点を踏まえてこれからも頑張っていこうと思います。本当にありがとうございました。
guest

0

$_SESSION["USERID"] = 〜〜

みたいな箇所を見つけて同じように

$_SESSION["PARTID"] = 〜〜

でいけませんか?

投稿2016/03/26 04:27

test0001

総合スコア224

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

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

hiziki

2016/03/26 04:40

なぜかそうやっても表示されないんです。
yodel

2016/03/26 06:37

$_SESSION["PARTID"]が正しく渡せてないんのでは?
hiziki

2016/03/26 07:37

正しく渡せていない理由はどのようなことが考えられますか?
test0001

2016/03/26 08:09

$_SESSION["PARTID"] = ここを教えてください!
lib

2016/03/26 08:17

正しく渡せていないんでしょうか。それともまったく0ベースで修正か作成でもされているんでしょうか・・・気になるところです。
hiziki

2016/03/26 08:28

<?=htmlspecialchars($_SESSION["PARTID"], ENT_QUOTES); ?>パートの方です。 というふうに書いています。ログイン機能の作成参考にさせていただいたサイト( http://516.jp/2827 )の ようこそ<?=htmlspecialchars($_SESSION["USERID"], ENT_QUOTES); ?>さん の["USERID"]を["PARTID"]に変更させていただいただけです。
test0001

2016/03/26 12:05

ファイルの全ての「userid」を「partid」に「USERID」を「PARTID」に
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問