電子書籍の厳選無料作品が豊富!

PHPにてログインフォームを作成しています。

PHPは初心者のため、ご教授いただけたらと思います。

下記の記述方法はPHP逆引きレシピという参考書を元に作成しています。

<?php
//DB設定
$DB_HOST = 'localhost';
$DB_USER = 'root';
$DB_PASS = '0000;
$DB_NAME = 'members';

if (count($_POST) == 0) {
echo <<< EOL
<form method="post" action="./main.php">
ユーザーID: <input name="id" />
PASSWORD: <input name="password" type="password" />
<input type="submit" value="ログイン" />
</form>
EOL;
} else {
$link = mysqli_connect($DB_HOST, $DB_USER, $DB_PASS, $DB_NAME);
if (mysqli_connect_errno()) {
die('データベースエラー');
}
// クエリを準備
$sql = 'SELECT * FROM members WHERE id=? AND password=?';

$msg = '認証NG';
if ($stmt = mysqli_prepare($link, $sql)) {
mysqli_stmt_bind_param($stmt, 'ss', $_POST['id'], $_POST['password']);
mysqli_stmt_execute($stmt);
mysqli_stmt_store_result($stmt);
$count = mysqli_stmt_num_rows($stmt);
mysqli_stmt_close($stmt);
if ($count == 1) {
$msg = '認証OK' ;
}
}
echo $msg;
}
?>

という記述ですが、IDとPASSWORDがあっていれば「認証OK」と表示されます。
文字の表示ではなく次のページ(main.php)が表示されません。

どこを編集、記述したらmain.phpが表示されるのでしょうか?

また、間違っていたら「認証NG」と表示されるのですが、
この文言のみの表示でフォームが表示されません。
間違っていたらフォームの上に表示させたいのですが、どのように編集、記述したらよろしいでしょうか?

例↓

*ここに間違っていたら認証NGと表示させる
<form method="post" action="./main.php">
ユーザーID: <input name="id" />
PASSWORD: <input name="password" type="password" />
<input type="submit" value="ログイン" />
</form>

質問ばかりで申し訳ありません。
本やネットなどで色々としらべたのですが、自分の求めているサイトや記述方法が見つかりませんでした。

大変申し訳ないのですが、参考記述または参考サイトなどがありましたらご教授ください。
宜しくお願いいたします。

A 回答 (5件)

***さんこんにちはを出す処理です。


まず、ログイン出来た時にidをセッションに保存します。
login.phpの最後のほうで、

session_start();
$_SESSION["login_flg"] = 1;
$_SESSION["login_id"] = $_POST['id']; //この行を追加
header ("location: ./main.php");

で、main.phpで、そのidを使ってmembersデータを呼び出し、
名前を表示すればOKです。


以下、main.php のサンプル
<?php
session_start();
if ($_SESSION["login_flg"] != 1){
header("location: login.php");
}


//DB設定
$DB_HOST = 'localhost';
$DB_USER = 'root';
$DB_PASS = '0000';
$DB_NAME = 'members';

$ok_flg = 0;
$msg = "";

$link = mysqli_connect($DB_HOST, $DB_USER, $DB_PASS, $DB_NAME);
if (mysqli_connect_errno()) {
die('データベースエラー');
}

$sql = 'SELECT namae FROM members WHERE id=?';
if ($stmt = mysqli_prepare($link, $sql)) {
mysqli_stmt_bind_param($stmt, 's', $_SESSION['login_id']);
mysqli_stmt_execute($stmt);
mysqli_stmt_store_result($stmt);
mysqli_stmt_bind_result($stmt,$namae);
while (mysqli_stmt_fetch($stmt)) {
$members_name = $namae;
}
mysqli_stmt_close($stmt);


?>
<html>
<head>
<title></title>
</head>
<body>
<?php echo $members_name?>さんこんにちは
</body>
</html>

こんな感じでしょうか。
名前がどんなフィールド名か分からないので、仮に namae としておきました。

で、
Call to undefined function mysqli_connect()
に関してですが、私自身普段 mysqli_hogehoge のような関数を使わないので、
良くわかりません。また、sakuraのサーバもどうなっているか分からないので、
これはこれでまた質問してみてはどうでしょうか。

この回答への補足

度重なるご質問に関わらずご回答いただきまして、誠に有難う御座います。
ローカルでは御座いますが、できました。

mysqliなどは自分でできる限り調べてみようと思います。

本当に有難う御座いました。

また、何か御座いましたら、ご教授いただければと思います。

補足日時:2010/03/09 22:36
    • good
    • 1

すみません。

}をつけてもらった場所はあってます。

あと、違っていたのが
<form method="post" action="./main.php">
の部分。
<form method="post" action="./login.php">
にして、自分自身に戻ってくるようにしてください。

ただ、main.phpに直接アクセスした場合もlogin.phpには飛ばず、main.php が表示されて
しまうのはおかしいですね。
何らかで$_SESSION["login_flg"] に 1 がセットされてしまったのかもしれません。
(つまりログイン済み)
ブラウザを閉じるとセッションが切れますので、ブラウザを閉じてみてください。

この回答への補足

有難う御座います。
できました。

最終的には下記のような内容になりました。

<?php
//DB設定
$DB_HOST = 'localhost';
$DB_USER = 'root';
$DB_PASS = '0000';
$DB_NAME = 'members';

$ok_flg = 0;
$msg = "";

$link = mysqli_connect($DB_HOST, $DB_USER, $DB_PASS, $DB_NAME);
if (mysqli_connect_errno()) {
die('データベースエラー');
}

if (count($_POST) != 0) {
$sql = 'SELECT * FROM members WHERE id=? AND password=? ';
if ($stmt = mysqli_prepare($link, $sql)) {
mysqli_stmt_bind_param($stmt, 'ss', $_POST['id'], $_POST['password']);
mysqli_stmt_execute($stmt);
mysqli_stmt_store_result($stmt);
$count = mysqli_stmt_num_rows($stmt);
mysqli_stmt_close($stmt);
}
if ($count == 1) {
$ok_flg = 1;
} else {
$msg = 'ユーザーIDまたはPASSWORDが違います。';
}
}
if ($ok_flg == 0) {

echo <<< EOL
$msg
<form method="post" action="./login.php">
ユーザーID: <input name="id" />
PASSWORD: <input name="password" type="password" />
<input type="submit" value="ログイン" />
</form>
EOL;
} else {
session_start();
$_SESSION["login_flg"] = 1;
header ("location: ./main.php");
}
?>

大丈夫でしょうか?
ただこの記述ですとローカルで作成した場合は表示されるのですが、
サーバーにあげると表示されなくなってしまいます。

エラー表示が
Call to undefined function mysqli_connect() in /***/***/***/login.php on line 47
とあります。
line 47はちょうど
$link = mysqli_connect($DB_HOST, $DB_USER, $DB_PASS, $DB_NAME);
が表示されているところになります。

まったくわけがわかりません。
サーバーはsakuraを使用しています。

$DB_HOST = 'localhost';
$DB_USER = 'root';
$DB_PASS = '0000';
$DB_NAME = 'members';

の部分はsakura用のphpMyAdminの$DB_HOST・$DB_USER・$DB_PASS・$DB_NAMEに変えています。

また、ログインをして、main.phpに飛んだときに***さんこんにちはと表示させたいのですが、されるにはどのような記述になるのでしょうか?

度重なるご質問で大変申し訳ないのですが、宜しくお願いいたします。

補足日時:2010/03/07 12:00
    • good
    • 0

一歩一歩行きましょうか。



まず、提示されたソースをちょっといじってみました。
仮に login.php とします。

<?php
//DB設定
$DB_HOST = 'localhost';
$DB_USER = 'root';
$DB_PASS = '0000';
$DB_NAME = 'members';

$ok_flg = 0;
$msg = "";

$link = mysqli_connect($DB_HOST, $DB_USER, $DB_PASS, $DB_NAME);
if (mysqli_connect_errno()) {
die('データベースエラー');
}

if (count($_POST) != 0) {


// クエリを準備
$sql = 'SELECT * FROM members WHERE id=? AND password=?';

if ($stmt = mysqli_prepare($link, $sql)) {
mysqli_stmt_bind_param($stmt, 'ss', $_POST['id'], $_POST['password']);
mysqli_stmt_execute($stmt);
mysqli_stmt_store_result($stmt);
$count = mysqli_stmt_num_rows($stmt);
mysqli_stmt_close($stmt);
if ($count == 1) {
$msg = '認証OK' ; //実際にはこれを表示する機会は無い。
$ok_flg = 1;
}else{
$msg = '認証NG';
}
}

if ($ok_flg == 0) {
echo <<< EOL
<form method="post" action="./main.php">
ユーザーID: <input name="id" />
PASSWORD: <input name="password" type="password" />
<input type="submit" value="ログイン" />
</form>
$msg
EOL;
} else {
session_start();
$_SESSION["login_flg"] = 1;
header("location: main.php");

}


?>
ここまで。

================================================================
次に main.php です。
<?php
session_start();
if ($_SESSION["login_flg"] != 1){
header("location: login.php");
}
?>
<html>
<head>
<title></title>
</head>
<body>
メインページです
</body>
</html>

ここまで。

認証の処理を前にもってきてます。postデータが無い場合は認証の処理は通りません。
認証の処理を通って、認証NGのときは、$msgに「認証NG」がセットされます。
認証OKのときは、セッションに「認証済みのしるし」をつけてmain.phpに飛んでいます。
main.phpでは「認証済みのしるし」が無い場合にはlogin.phpに飛んでいます。

sessionとかは調べてみてくださいね。

この回答への補足

ご回答有難う御座います。
早速ためさせていただきました。

ご教授いただきました、コードをコピペしたところログインフォームが表示されませんでした。

確認したところ
if (count($_POST) != 0) {
// クエリを準備



の部分の}が抜けていましたので、
}else{
$msg = '認証NG';
}
}
の一番最後につけくわえさせていただきました。
例↓
}else{
$msg = '認証NG';
}
}
}
これで大丈夫でしょうか?
また、付け加えたところログインフォームは表示されたのですが、IDとPASSWORDが全然違う文字でもmain.phpが表示されてしまいます。

また、main.phpに直接アクセスした場合もlogin.phpには飛ばず、main.phpが表示されてしまいます。

これはsessionの問題なのでしょうか?
またはMySQLの問題でしょうか?
MySQLのmembersテーブルの中にlogin_flgの項目を作成しないとだめなのでしょうか?

ご質問ばかりで大変申し訳ないのですが、宜しくお願いいたします。

補足日時:2010/03/05 23:05
    • good
    • 0

「PHP逆引きレシピ」とは、単機能それぞれをどう作るかって書籍です。


初心者(というよりも入門者)の為の書籍ではありません。
サイトの構成について、ほとんどすべての設計はできるPHPプログラマが、さてあの機能はどうやって実現すれば、というときに辞書的に引く書籍と言えるかも知れません。
おそらく一連の流れでサイトの動作、設計、プログラミングを解説している書籍の方が、有効だと思います。
大型書店で立ち読みしながら、一連の流れを解説している書籍という事を念頭に置きながら、好みで探してみてください。
私のお奨めは、「PHP+MySQLであなたもウェブアプリが作れる」ですね。

参考URL:http://www.amazon.co.jp/PHP-MySQL%E3%81%A7%E3%81 …

この回答への補足

ご回答有難うございます。

本を何冊か買ったのですが、データベース関連がのっているものは大半がPEARやSmatyが載っているものでした。

お奨めいただいた「PHP+MySQLであなたもウェブアプリが作れる」
上記のようなものは掲載はないでしょうか?

掲載がなくちゃんと一からできるものであればうれしいのですが・・・

一応本屋でも探してみます。

有難うございました。

補足日時:2010/03/05 14:21
    • good
    • 0

正直な話、どこを直してもあなたの理想にはなりません。



なぜならば、あなたの書いているロジックはログイン機能などではなく。
SQLにクエリ飛ばして、入力したデータがデータベースと同じかどうか。
だけを見ています。

つまり、IDとパスワードが一致しているかどうかだけのロジックであり、「ログイン」という機能を満たしていません。

「ログイン」とは何を意味しているのか、どうなればよいのか。を決めてください。
一般的な考えだと、IDとパスワードを入力して、一致したら「ログイン」する。です。
ログインしていないと表示が出来ないmain.phpってことですよね。
であれば、main.phpに対して「この人はログインしている人ですから表示を許可しまーす」的なロジックを書く必要があります。

「この人がログインし続けるための仕組み」をどう作るかです。
ここらへんは、セキュリティ的にかなりシビアにならなければならない部分ですので、ここでは解説仕切れません。

この回答への補足

ご回答有難うございます。

記述内容だとは知りませんでした。
まだ、全然勉強しないとだめですね・・・

お手数ですが、初心者でもできる参考書または参考サイトはご存じでしょうか?

もしおわかりであるならばご教授いただければと思います。

補足日時:2010/03/05 14:19
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!