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

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

ただいまの
回答率

90.47%

  • PHP

    20902questions

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

  • MySQL

    6034questions

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

  • phpMyAdmin

    669questions

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

PHPとMySQLについて

解決済

回答 2

投稿

  • 評価
  • クリップ 1
  • VIEW 1,142

hiziki

score -4

![イメージ説明](fadebad2fd9a28a1fd4d1ebd714c7f9b.png)

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

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

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

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

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

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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • hiziki

    2016/03/26 16: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 17:23 編集

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

    キャンセル

  • hiziki

    2016/03/26 17:38

    SQLと思われるものをエクスポートしてみました -- phpMyAdmin SQL Dump -- version 4.4.15.5 -- http://www.phpmyadmin.net -- -- Host: localhost -- Generation Time: 2016 年 3 月 26 日 17:37 -- サーバのバージョン: 5.5.44-MariaDB -- PHP Version: 5.6.19 SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO"; SET time_zone = "+00:00"; -- -- Database: `c157sqltest` -- CREATE DATABASE IF NOT EXISTS `c157sqltest` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci; USE `c157sqltest`; -- -------------------------------------------------------- -- -- テーブルの構造 `TODO_USER` -- DROP TABLE IF EXISTS `TODO_USER`; CREATE TABLE IF NOT EXISTS `TODO_USER` ( `id` int(5) NOT NULL COMMENT 'AUTO_INCREMENT', `name` varchar(20) NOT NULL, `partid` varchar(20) NOT NULL, `password` varchar(100) NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -- -- テーブルのデータのダンプ `TODO_USER` -- INSERT INTO `TODO_USER` (`id`, `name`, `partid`, `password`) VALUES (0, 'Admin', '設定なし', '$2y$10$Z2t9Sn2LulXxll/M7nw0HOVXsXYqMSs9h.jb7sZOOeM4RwPz6DjIy'), (0, 'FLtest', 'FL', '$2y$10$MKGU9ao2.sERohsO.eqh1eu8p6T59FePdvaw0udAvfTDV4/IgF/82'), (0, 'mjhsbrass', '設定なし', '$2y$10$//0AwxK4QTzy2fPHp.97LOnkxNdkpf2ehmWKAdsi1jWzx01V5nhR2'), (0, 'nun', 'TP', '$2y$10$EhjUZt.VCx1zZLmPIJbgWuYlvfdBGFN7eWfHfupvPvddp9G9ace7K'), (0, 'PercFREEZE', 'Perc', '$2y$10$XP8CDsgQLD8F12NkArR4OOlKOzbL.tje7FA72qTeRSMrN3JqdYiey'), (0, 'test812', 'TP', '$2y$10$7t70njx1mYLMiMz2O8D4Ru1jLAVdATawLZbDj3mZ9jeO/Nc5kFs7S'), (0, 'TPtest', 'TP', '$2y$10$a9EKHYWDGbRwgogEJhQpa./7NnZzqPz1VRhiwgT65AcBAs1Ln6Orm'); -- -- Indexes for dumped tables -- -- -- Indexes for table `TODO_USER` -- ALTER TABLE `TODO_USER` ADD UNIQUE KEY `name` (`name`); -- -- AUTO_INCREMENT for dumped tables -- -- -- AUTO_INCREMENT for table `TODO_USER` -- ALTER TABLE `TODO_USER`;

    キャンセル

回答 2

checkベストアンサー

+1

$_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
require 'password.php';
// セッション開始
session_start();

// エラーメッセージの初期化
$errorMessage = "";

// ログインボタンが押された場合
if (isset($_POST["login"])) {
  // 1.ユーザIDの入力チェック
  // [teratail]ここでユーザーIDをpartidとして渡されたものを$_POST["partid"]として受け取っている
  // ここでは、入力されたpartidが空かどうかをチェックしている。
  // 認証時の情報をチェックさせるのがuseridの場合は、$_POST["userid"]とすること
  if (empty($_POST["partid"])) {
    $errorMessage = "ユーザIDが未入力です。";
  } else if (empty($_POST["password"])) {
    $errorMessage = "パスワードが未入力です。";
  } 

  // 2.ユーザIDとパスワードが入力されていたら認証する
  // [teratail]ここでは、ログインに必要な partidとpasswordをPOSTで受け取っている。
  // formでSUBMITボタンを押下することで、遷移させた先で、$_POST["partid"]と$_POST["password"]と受け取れるが、その中身が入力されているか。をチェックしている。
  // 入力していればログイン認証を実行させるため。
  // 入力値のチェックをuseridで行いたい場合は、$_POST["userid"]とすること。
  if (!empty($_POST["partid"]) && !empty($_POST["password"])) {
    // mysqlへの接続
    $mysqli = new mysqli('ホスト名', 'ユーザー名', 'パスワード');
    if ($mysqli->connect_errno) {
      print('<p>データベースへの接続に失敗しました。</p>' . $mysqli->connect_error);
      exit();
    }

    // データベースの選択
    $mysqli->select_db('データベース名');

    // 入力値のサニタイズ
    $userid = $mysqli->real_escape_string($_POST["partid"]);

    // クエリの実行
    // [terail]1.SQLの修正
    // あらかじめ入力されたpartidが存在しているかをチェックしている。
    // 入力をuseridで行いたい場合は、$partidではなく$useridとすること。
    $query = "SELECT * FROM テーブル名 WHERE name = '" . $partid . "'";
    $result = $mysqli->query($query);
    if (!$result) {
      print('クエリーが失敗しました。' . $mysqli->error);
      $mysqli->close();
      exit();
    }

    while ($row = $result->fetch_assoc()) {
      // パスワード(暗号化済み)の取り出し
      $db_hashed_pwd = $row['password'];
    }

    // データベースの切断
    $mysqli->close();

    // 3.画面から入力されたパスワードとデータベースから取得したパスワードのハッシュを比較します。
    //if ($_POST["password"] == $pw) {
    if (password_verify($_POST["password"], $db_hashed_pwd)) {
      // 4.認証成功なら、セッションIDを新規に発行する
      session_regenerate_id(true);
      // [teratail]ここで入力されたpartidをセッション用の変数に代入している。
      // $_SESSION["PARTID"] = 値
      // 以降は、PHP間セッションが有効な間 $_SESSION["PARTID"]として受け取り表示や検証が行える。
      $_SESSION["PARTID"] = $_POST["partid"]; // <- [teratail]この記述が代入で、かつ必要な絶対条件です。
      // [teratail]この渡し方は、あらかじめFORMから入力されたname="partid"の属性をもつ、タグinputから受け取っている。

      header("Location: main.php");
      exit;
    } 
    else {
      // 認証失敗
      $errorMessage = "ユーザIDあるいはパスワードに誤りがあります。";
    } 
  } else {
    // 未入力なら何もしない
  } 
} 

?>
<!doctype html>
<html>
  <head>
  <meta charset="UTF-8">
  <title>サンプルアプリケーション</title>
  </head>
  <body>
  <h1>ログイン機能 サンプルアプリケーション</h1>
  <!-- $_SERVER['PHP_SELF']はXSSの危険性があるので、actionは空にしておく -->
  <!--<form id="loginForm" name="loginForm" action="<?php print($_SERVER['PHP_SELF']) ?>" method="POST">-->
  <!-- [teratail]ここからログインのフォームです。formタグ内で囲まれた範囲内で入力をさせるフォーム作成している-->
  <form id="loginForm" name="loginForm" action="" method="POST">
  <fieldset>
  <legend>ログインフォーム</legend>
  <div><?php echo $errorMessage ?></div>
  <!--[teratail] ここでpartidをユーザーIDとみなして入力させている
    もし、useridで入力させる場合は、$_SESSION["PARTID"]ではこの構造では受け取れないため
    SQLの具体的な必要です。「useridの認証の確認だけではなく、partidを受け取ること。」
   -->
  <label for="userid">ユーザID</label><input type="text" id="partid" name="partid" value="<?php echo htmlspecialchars($_POST["partid"], ENT_QUOTES); ?>">
  <br>
  <label for="password">パスワード</label><input type="password" id="password" name="password" value="">
  <br>
  <input type="submit" id="login" name="login" value="ログイン">
  </fieldset>
  </form>
  <a href="add.html">ユーザー情報登録ページへ</a>
  </body>
</html>

main.php

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

<?php
session_start();

// ログイン状態のチェック
if (!isset($_SESSION["PARTID"])) {
  header("Location: logout.php");
  exit;
}

?>

<!doctype html>
<html>
  <head>
    <meta charset="UTF-8">
    <title>サンプルアプリケーション</title>
  </head>
  <body>
  <h1>ログイン機能 サンプルアプリケーション</h1>
  <!-- ユーザIDにHTMLタグが含まれても良いようにエスケープする -->
  <!-- [teratail]ここでpartidをPHP間でlogin.phpから渡されたので、受け取ることができる-->
  <p>ようこそ<?=htmlspecialchars($_SESSION["PARTID"], ENT_QUOTES); ?>さん</p>
  <ul>
  <li><a href="logout.php">ログアウト</a></li>
  </ul>
  </body>
</html>

[追記]
logout.php

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

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

<?php
session_start();

// [teratail]$_SESSION["PARTID"]が存在しないときにログアウトしましたと表示される
if (isset($_SESSION["PARTID"])) {
  $errorMessage = "ログアウトしました。";
}
else {
  $errorMessage = "セッションがタイムアウトしました。";
}
// セッション変数のクリア
$_SESSION = array();
// クッキーの破棄は不要
//if (ini_get("session.use_cookies")) {
//    $params = session_get_cookie_params();
//    setcookie(session_name(), '', time() - 42000,
//        $params["path"], $params["domain"],
//        $params["secure"], $params["httponly"]
//    );
//}
// セッションクリア
@session_destroy();
?>

<!doctype html>
<html>
  <head>
    <meta charset="UTF-8">
    <title>サンプルアプリケーション</title>
  </head>
  <body>
  <h1>ログイン機能 サンプルアプリケーション</h1>
  <div><?php echo $errorMessage; ?></div>
  <ul>
  <li><a href="login.php">ログイン画面に戻る</a></li>
  </ul>
  </body>
</html>

[終わりに]


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

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/03/27 00:51

    ご丁寧に回答していただいて誠にありがとうございました。

    login.php でpartidを読み込んでない事に気付いたので、それを既存のファイルに入れてみたところ、無事partidが表示されるようになりました。

    注意された点を踏まえてこれからも頑張っていこうと思います。本当にありがとうございました。

    キャンセル

+1

$_SESSION["USERID"] = 〜〜

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

$_SESSION["PARTID"] = 〜〜

でいけませんか?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/03/26 13:40

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

    キャンセル

  • 2016/03/26 15:37

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

    キャンセル

  • 2016/03/26 16:37

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

    キャンセル

  • 2016/03/26 17:09

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

    キャンセル

  • 2016/03/26 17:17

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

    キャンセル

  • 2016/03/26 17:28

    <?=htmlspecialchars($_SESSION["PARTID"], ENT_QUOTES); ?>パートの方です。

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

    キャンセル

  • 2016/03/26 21:05

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

    キャンセル

関連した質問

同じタグがついた質問を見る

  • PHP

    20902questions

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

  • MySQL

    6034questions

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

  • phpMyAdmin

    669questions

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