掲示板[ログイン認証/SQL]
- 評価
- クリップ 0
- VIEW 2,312
アカウント認証と、ログイン後の画面遷移でつまづいています。
ログインできず、理由がわかりません。
どこをどう直せばよいでしょうか。
お手数おかけしますが、宜しくお願い致します。
------------------------------
[必要なファイル]
●ログイン画面・・・login.php
●ログイン認証ページ・・・authorization.php
●ログイン後表示するページ・・・frameset.php(上/下段)
●bbs.datへ書き込むための裏で動くプログラムファイル guest_write.php
●BBS入力後、送信した情報を表示するページ・・・guest_read_ASC.php
●css・・・bbs.css
●関数・・・function.php
●BBSの入力情報を保存するファイル・・・bbs.dat
●画面分割・・・frameset.php
frameset.php
→上段 guest_input.php 投稿フォーム
→下段 guest_read_ASC.php 過去の書き込み一覧
[その他必要なもの]
●データベース newbbs
(テーブル)
▼ユーザー情報テーブル・・・account
→→id
→→mailaddress
→→name
→→pwd

[画面構成]
・ログイン画面 login.php
・ログイン後の表示画面 frameset.php
→上段(名前/本文入力フォーム/送信ボタン) guest_input.php
→→入力された情報をファイルに新しい順に保存する裏プログラム guest_write.php
→下段(過去の書き込み表示) guest_read_ASC.php

[現状]やりたいことと問題点
・ログインフォームにDBに登録されている(ログインできるはずの)値を入れても、画面遷移しない。
・登録されていない、メルアドとpwd入れてもdieにならない。
・authorization.phpの$auth->start();をコメントアウトするとdieが適用されているように思う。
------------------------------
[可能性]
・パスワードハッシュ化してないけど大丈夫?
DBはそのまま数字を入れてるけど、入力フォームのパスワードは送信するとどのようなかたちで送られるの?
・authorization.phpの
'dsn' => 'mysqli://newbbsuser:newbbspass@localhost/newbbs',
辺りが怪しい。
・authorization.phpの
else{ require_once 'frameset.php'; }が怪しい。
------------------------------
[参考]
http://mylearning.jugem.jp/?eid=8
------------------------------
[その他不明点]
・header(hogehoge)って、phpの<head>的なやつ??
・$param=array(
'dsn' => 'mysqli://newbbsuser:newbbspass@localhost/newbbs',
'table' => 'account',
'usernamecol' => 'id',
'passwordcol' => 'pwd');
の部分を配列にする意味がわかりません。そのままDB情報だけ配列にするのはだめなの??
------------------------------------------------------------
login.php
<?php require_once './Encode.php'; ?>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>ログイン(newbbs)</title>
</head>
<body>
<h2>ようこそ【NEW】BBSへ</h2>
<h3>ログインしてください</h3>
<hr>
<form method="POST" action="<?php print(e($_SERVER["PHP_SELF"])); ?>">
<div>
<label for="mail">メールアドレス:</label><br>
<input type="text" id="mail" size="30" maxlength="30" />
</div>
<div>
<label for="pass">パスワード:</label><br>
<input type="password" id="pass" size="20" maxlength="40" />
</div>
<input type="submit" name="submit" value="ログイン" />
</form>
</body>
</html>
.htaccess
# mysql内のnewbbsアプリにだけ認証機能を設定する
<IfModule mod_php5.c>
php_value auto_prepend_file "authorization.php"
</IfModule>
authorization.php
<!--ログイン認証するためのページ-->
<?php
require_once 'Auth/Auth.php';
// ↓ログインページを表示させる関数
function login(){
require_once 'login.php';
}
// ↓認証を実行する
$param=array(
'dsn' => 'mysqli://newbbsuser:newbbspass@localhost/newbbs',
'table' => 'account',
'usernamecol' => 'mailaddress',
'passwordcol' => 'pwd');
// ↓認証済みか判定し、していなければログインページに
// 決まった値 => DBに合わせる
$auth = new Auth('MDB2', $params, 'login');
// new Auth(ドライバー名, 認証に必要なパラメータ, ログイン関数);
$auth->start();
// ↓未認証の場合は処理を終了
if (!$auth->checkAuth()) { die(); }
else{ require_once 'frameset.php'; }
frameset.php
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<link rel="stylesheet" type="text/css" href="bbs.css">
</head>
<frameset rows="15%,*">
<frame src="guest_input.php" name="frame1">
<frame src="guest_read_ASC.php" name="frame2">
</frameset>
</html>
guest_input
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>NEW掲示板</title>
</head>
<body>
<h3>ようこそNEW掲示板へ</h3>
<form method="POST" action="guest_write.php" target="frame2">
<div id="container">
<label for="name">名前:<label>
<input type="text" id="name" name="name" size="20" maxlength="30" />
</div>
<div id="container">
<label for="body">本文:</label>
<input type="text" id="body" name="body" size="70" maxlength="255" />
</div>
<input type="submit" value="送信" />
</form>
</body>
</html>
guest_read_ASC.php
<?php require_once './Encode.php'; ?>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<!-- <meta http-equiv="refresh" content="3"> -->
</head>
<body>
<h3>過去の書き込み情報</h3>
<?php
$file = @fopen('bbs.dat', 'rb') or die('bbsファイルが開けませんでした');
flock($file, LOCK_SH);
print('<dl>');
/* ここから--ファイルを行単位に読み込み-- */
while ($row = fgetcsv($file, 1024, "\t")) {
print('<dt>'.e($row[1]));
print('('.e($row[0]).')</dt>');
print('<dd>本文:'.e($row[2]).'<hr /><dd>');
}
print('<dl>');
flock($file, LOCK_UN);
fclose($file);
?>
<body>
</html>
guest_write.php
<?php
// 一時ファイルに新しいデータを送り、そのファイルに既にあるデータを追記し、bbs.datにリネーム
$old_file = fopen('bbs.dat', 'rb');
$new_file = fopen('bbs.tmp', 'wb');
flock($old_file, LOCK_SH);
flock($new_file, LOCK_EX);
fputs($new_file, date('Y年 m月 d日 H:i:s')."\t");
fputs($new_file, $_POST['name']."\t");
fputs($new_file, $_POST['body']."\n");
$name = ( isset($_POST['name']) && is_string($_POST['name']) )? $_POST['name'] : '' ;
$body = ( isset($_POST['body']) && is_string($_POST['body']) )? $_POST['body'] : '' ;
// fputs→一時(NEW)ファイルの先頭に新しい情報を書き込み
// 日時<\t>名前<\t>本文<\n>が横並びになった行が一行ずつ改行され書き込まれていく
while ($row = fgets($old_file)) {
fputs($new_file, $row);
}
// while→bbs.dat(OLD)の内容をbbs.tmp()に書き込み 古い情報を新しいファイルに追記
// flock($new_file, LOCK_UN); セキュリティ対策のためコメントアウト
// flock($old_file, LOCK_UN);
fclose($new_file);
fclose($old_file);
unlink('bbs.dat');
rename('bbs.tmp', 'bbs.dat');
header('Location: http://'.$_SERVER['HTTP_HOST'].rtrim(dirname($_SERVER['PHP_SELF']), '/').'/guest_read_ASC.php');
Encode.php
<?php
function e($str, $sharset = 'UTF-8'){
return htmlspecialchars($str, ENT_QUOTES, $charset);
}
※Auth/Auth.phpはライブラリです。
以上です。
最後までお読みいただき有難うございます。
お手数おかけしますが宜しくお願い致します。
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
0
それぞれのname属性にusernamecolとpasswordcolで指定した値を入れてみてください。
<form method="POST" action="<?php print(e($_SERVER["PHP_SELF"])); ?>">
<div>
<label for="mail">メールアドレス:</label><br>
<!-- ↓nameが抜けている。name="mailaddress"を追加 -->
<input type="text" id="mail" size="30" maxlength="30" />
</div>
<div>
<label for="pass">パスワード:</label><br>
<!-- ↓nameが抜けている。name="pwd"を追加 -->
<input type="password" id="pass" size="20" maxlength="40" />
</div>
<input type="submit" name="submit" value="ログイン" />
</form>
あと一点気になったのが、e関数の引数が$sharset(誤字?)になっています。
htmlspecialcharsの第三引数には未定義の$charsetが渡されているので、NOTICEが発生するかと思います。
<?php
function e($str, $sharset = 'UTF-8'){// ←$sharsetになっている
return htmlspecialchars($str, ENT_QUOTES, $charset);
}
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
0
また、あとで回答します。
------------------------------------------------------------------
ちょっとPEARは分からないですが、auth.phpのソースを見ると、頻繁にログを書いているようですので、確認してみてはいかがでしょうか。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
0
そもそも authorization.php が呼ばれてるかどうかの確証がありますか?
authorization.php の先頭でなにか出力してみるとか、確かめてみる必要があるんじゃないでしょうか。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.11%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
質問への追記・修正、ベストアンサー選択の依頼
orange0190
2015/07/10 14:08
Auth.phpやEncode.phpは自作ですか?
orange0190
2015/07/10 14:22
すみません。pearのファイルであることを確認しました。
b1ackc0ffee
2015/07/10 14:24
Encode.phpはエスケープ処理のためのもので、ユーザー定義関数用に自作しました。
Auth.phpはインストールしたライブラリです★