前提・実現したいこと
PHP、MySQLを使い自作システムを作っています。
会員制にするためにログイン機能(Login.php)を付けたいのですが、ログイン画面だけがうまくいきません。
会員新規登録画面(signin.php)はDBにもちゃんと登録できています。
発生している問題・エラーメッセージ
実行画面自体にエラーメッセージはなし。
ソースの55行目、”ユーザーIDあるいはパスワードに誤りがあります。”が表示されます。
MAMPを使ってローカルで動作させた時は問題ありませんでしたが、レンサバを借りてサイトを立ち上げると今の状態に陥ってしまいました。
該当のソースコード
↓こちらのLogin.php 丸コピしました。(勿論、DB名など変えています)
参考にしたサイト
=================
<?php
require 'password.php'; // password_verfy()はphp 5.5.0以降の関数のため、バージョンが古くて使えない場合に使用
// セッション開始
session_start();
$db['host'] = "localhost"; // DBサーバのURL
$db['user'] = "hogeUser"; // ユーザー名
$db['pass'] = "hogehoge"; // ユーザー名のパスワード
$db['dbname'] = "loginManagement"; // データベース名
// エラーメッセージの初期化
$errorMessage = "";
// ログインボタンが押された場合
if (isset($_POST["login"])) {
// 1. ユーザIDの入力チェック
if (empty($_POST["userid"])) { // emptyは値が空のとき
$errorMessage = 'ユーザーIDが未入力です。';
} else if (empty($_POST["password"])) {
$errorMessage = 'パスワードが未入力です。';
}
if (!empty($_POST["userid"]) && !empty($_POST["password"])) {
// 入力したユーザIDを格納
$userid = $_POST["userid"];
// 2. ユーザIDとパスワードが入力されていたら認証する
$dsn = sprintf('mysql: host=%s; dbname=%s; charset=utf8', $db['host'], $db['dbname']);
// 3. エラー処理
try {
$pdo = new PDO($dsn, $db['user'], $db['pass'], array(PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION));
$stmt = $pdo->prepare('SELECT * FROM userData WHERE name = ?');
$stmt->execute(array($userid));
$password = $_POST["password"];
if ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
if (password_verify($password, $row['password'])) {
session_regenerate_id(true);
// 入力したIDのユーザー名を取得
$id = $row['id'];
$sql = "SELECT * FROM userData WHERE id = $id"; //入力したIDからユーザー名を取得
$stmt = $pdo->query($sql);
foreach ($stmt as $row) {
$row['name']; // ユーザー名
}
$_SESSION["NAME"] = $row['name'];
header("Location: Main.php"); // メイン画面へ遷移
exit(); // 処理終了
} else {
// 認証失敗
$errorMessage = 'ユーザーIDあるいはパスワードに誤りがあります。';
}
} else {
// 4. 認証成功なら、セッションIDを新規に発行する
// 該当データなし
$errorMessage = 'ユーザーIDあるいはパスワードに誤りがあります。';
}
} catch (PDOException $e) {
$errorMessage = 'データベースエラー';
//$errorMessage = $sql;
// $e->getMessage() でエラー内容を参照可能(デバッグ時のみ表示)
// echo $e->getMessage();
}
}
}
?>
=================
何が間違っているのか全く見当もつきません。
質問に対し情報足らずであれば申し訳ございません。
回答お待ちしております。
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
+1
回答に自信はないですけど、やや当てずっぽうで。
実行環境のphpのバージョンが5.5以降や7以降であれば、
require 'password.php';
の行はコメントアウトした方がよいかも。
それと、password_verify()を駆使する前に、念の為
PHP: パスワードのハッシュ - Manual
あたりをチェックして、
DBに保存しておくパスワードをpassword_hash()でそのサーバー上で生成したものを使うとよいかも。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.09%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
質問への追記・修正、ベストアンサー選択の依頼
Orlofsky
2019/10/10 19:46
URLは https://teratail.com/help/question-tips#questionTips3-7 の [リンク] で
[リンク先の説明](http...) に修正してください。
scoco
2019/10/10 19:58 編集
ご指摘ありがとうございました!
m6u
2019/10/10 20:00 編集
55行目の他60行目でも同じメッセージを詰めているようですが、それでも55行目と特定できた理由は何でしょうか。
scoco
2019/10/10 20:02
はい、60行目のメッセージを変えて実行してみたので特定できたと思いました!
m6u
2019/10/10 20:09
丸コピーじゃなくなってるし、ソースコードを読みに行くのが面倒だから、質問文中にphpコードを掲載したほうが良いよ。
それと、レンタルサーバー上のDBはどうやって構築したのだろう。CREATE TABLEとかINSERT INTOとかやった上で動かしているよね?
m.ts10806
2019/10/10 20:09
自身のコードとして質問に提示してください。
Orlofsky
2019/10/10 20:14
コードは https://teratail.com/help/question-tips#questionTips3-7 の [コード] に修正してください。
他のMarkdownの機能も読んでおいてください。