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

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

ただいまの
回答率

90.50%

  • PHP

    24080questions

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

  • HTML5

    5136questions

    HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

  • SQL

    3016questions

    SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

  • PostgreSQL

    1358questions

    PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

PHP、ログイン機能についてデバッグをお願いしたいです。

受付中

回答 1

投稿

  • 評価
  • クリップ 2
  • VIEW 260

taktok_26

score 2

前提・実現したいこと

大前提としてphp初心者です。
大学に入りphpを初めて学んでいます。

phpにて、ログイン機能を保持したwebサイトを開発しています。
ログイン機能がうまく動かず困っています。
psql環境で作成しています。

ログイン画面までは結果が移るのですが、ログインボタンを押しても画面遷移しません。
様々な方法を試しました。

発生している問題・エラーメッセージ

Notice: Undefined index: password in /home/logintest.php on line 49

該当のソースコード

<?php
$user = "****";
$pass = "****";

$errorMessage = "";

$c = pg_connect("user={$user} password={$pass}");

$sql = "select userid, password from login";
$sqlpass = "select password from login";

$rs = pg_query($c,$sql);

if (isset($_POST["login"])){

if(empty($_POST["userid"])){
$errorMessage = "ユーザーidが未入力";
}else if (empty($_POST["password"])){
$errorMessage = "パスワードが未入力です";
}
if (!empty($_POST["userid"]) && !empty($_POST["password"])) {
$c = pg_connect("user={$user} password={$pass}");
$sql = "select userid, password from login";
$rs = pg_query($c,$sql);

}else{
echo('<p>データベースへの接続に失敗</p>');
exit();
}

}

$rs = pg_query($c,$sql);

if (!$rs) {
print('クエリーが失敗しました。');
pg_close($c);
exit();
}

while ($row = pg_fetch_assoc($rs)) {
// パスワード(暗号化済み)の取り出し
$db_hashed_pwd = $row['password'];
}
$pw = pg_query($c,$sql);
//画面から入力されたパスワードとデータベースから取得したパスワードのハッシュを比較。
if ($_POST["password"] == $pw) {
if (password_hash($_POST["password"], $db_hashed_pwd)) {
//認証成功なら、セッションIDを新規に発行
session_regenerate_id(true);
$_SESSION["USERID"] = $_POST["userid"];
header("Location: main.php");
exit;

else {
// 認証失敗
$errorMessage = "ユーザIDあるいはパスワードに誤りがあります。";
}
pg_close($c);}

?>
<!doctype html>
<html>
<head>
<meta charset="UTF-8">
<title>ログイン</title>
<link rel="stylesheet" type="text/css" href="Studentshonan2.css" />
</head>
<body>
<h1 align="center" fontsize="18px">ログインしてください</h1>
<form id="loginForm" name="loginForm" action="logintest.php" method="POST">

<div align="center">
<fieldset align="center" width="100px" height="300px">
<legend>ログインフォーム</legend>
<div><?php echo $errorMessage ?></div>
<label for="userid">ユーザID</label><input type="text" id="userid" name="userid" value="" >
<br>
<label for="password">パスワード</label><input type="password" id="password" name="password" value="">
<br>
<input type="submit" id="login" name="login" value="ログイン">
</fieldset>
</div>
</form>
</body>
</html>

試したこと

パスワードを照合させるために、$pwを定義してみたりなどしました。

すみませんがかなりの初心者のため、かなり上から見下す方はスルーしてかまいません。
よろしくお願いいたします。

補足情報(FW/ツールのバージョンなど)

環境
・windows8/10
・teraterm
・DB(MYSQLではない)
・terapad
・googlechrome
・Internetexplorer

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • mts10806

    2018/12/13 16:42

    デバッグ依頼は非推奨です。
    https://teratail.com/help/avoid-asking
    > コードをください・デバッグしてください等の丸投げの質問

    キャンセル

  • mts10806

    2018/12/13 16:43

    書き方を気をつけていただければ良いかと。(特にタイトル)
    また「初心者アイコン」ご利用ください。
    コードもコード部分を選択し<code>ボタンを押してコードブロック化してください。
    質問は編集できますので調整願います。

    キャンセル

  • 退会済みユーザー

    2018/12/13 20:40

    複数のユーザーから「やってほしいことだけを記載した丸投げの質問」という意見がありました
    「質問を編集する」ボタンから編集を行い、調査したこと・試したことを記入していただくと、回答が得られやすくなります。

回答 1

+2

1.
$c = pg_connect("user={$user} password={$pass}"); を2度も実行している?
一連の処理の中でデータベースへの接続は使い回すようにして、
冒頭で一度接続して、最後にpg_close()で切断をきっちりやる。
それをやらないと、データベースへの接続数が膨大に膨れ上がって
無用な負担をかけるだけじゃなくサーバーが無応答になったりもするので注意。

2.
$c = pg_connect("user={$user} password={$pass}"); って
もっと接続に必要な条件があるはずなんだが。
詳しくは
PHP: pg_connect - Manual
を見てもらうとして、
host port dbname user password options='--client_encoding=UTF8'
の指定は必要なはず。

3.
$sql = "select userid, password from login";
ユーザーが何人登録されているかわかりかねますが、
userid と password の組のデータが複数件結果が返ってくるものだろうと察します。
で、

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


複数件結果が返ってきたものを順に$db_hashed_pwdに上書きしていますが、
何をしたいの? 間違いに気づいてる?

$post_userid = filter_input(INPUT_POST, 'userid');
if (preg_match('/^[A-Za-z0-9]+$/',$post_userid)) {
    $sql = "select userid, password from login where userid=$1";
    $rs = pg_query_params($c,$sql,$post_userid); 
    ~~
}


などとwhere句を組合せて、指定のuseridに対するパスワードを取得するものにしましょう。
$1については、POST送信されたuseridを動的に組み合わせるために
パラメータ化したものです。
useridは英数字のみ、という仮定をして、
preg_match()を使って評価しています。←勝手に付け加えた仕様ですけども。
それを満たす場合のみクエリーを実行するような流れにしています。
想定していない文字列がuseridに与えられたら、
SQLインジェクション攻撃の格好の標的になってしまいますから。
(SQL文を特殊な記述で改変して任意のクエリーを外部から実行させてしまう恐ろしい手法。)

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

  • PHP

    24080questions

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

  • HTML5

    5136questions

    HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

  • SQL

    3016questions

    SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

  • PostgreSQL

    1358questions

    PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。