重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

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

会員登録した後、ホームページの中の登録情報変更で、フォームに変更したいパスワードを入力して変更するようにしたいと思い、次のようなコードでやってみたところ、パスワードが変更されたみたいですが、変更したパスワードではログインできません。変更前のパスワードも使えなくなりました。
小生初心者で見よう見真似に書いたものですから、解決に苦慮しております。
どこに問題がありますでしょうか。どなたかお知恵をお貸しください。

<?php
require_once("../regist/db.php");
$dbh = db_connect();
$password_hash = password_hash($_post['password'], PASSWORD_DEFAULT);
try {
$dbh->beginTransaction();
$sql = "UPDATE member SET password=:password_hash WHERE code=$code";
$stmt = $dbh->prepare($sql);
$stmt->bindParam(':password_hash', $password_hash, PDO::PARAM_STR);
$stmt->execute();
$dbh->commit();
print "更新しました。次回ログインより有効!<br><a href='user.php'>登録情報一覧へ</a>";
} catch (PDOException $e) {
$dbh->rollBack();
print "エラー:". $e->getMessage();
}
?>

質問者からの補足コメント

  • <?php
    session_start();
    header("Content-type: text/html; charset=utf-8");
    if ($_POST['token'] != $_SESSION['token']){
    echo "不正アクセスの可能性あり";
    exit();
    }
    header('X-FRAME-OPTIONS: SAMEORIGIN');
    require_once("db.php");
    $dbh = db_connect();
    $errors = array();
    if(empty($_POST)) {
    header("Location: registration_mail_form.php");
    exit();
    }
    $mail = $_SESSION['mail'];
    $code = $_SESSION['code'];

      補足日時:2021/07/13 11:15
  • $company = $_SESSION['company'];
    $rep = $_SESSION['rep'];
    $phone = $_SESSION['phone'];
    $password_hash = password_hash($_SESSION['password'], PASSWORD_DEFAULT);
    try{
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $dbh->beginTransaction();

      補足日時:2021/07/13 11:18
  • $stmt = $dbh->prepare("INSERT INTO member (code,company,mail,rep,phone,password,status,created_at,updated_at) VALUES (:code,:company,:mail,:rep,:phone,:password_hash,1,now(),now())");
    $stmt->bindValue(':code', $code, PDO::PARAM_STR);
    $stmt->bindValue(':company', $company, PDO::PARAM_STR);
    $stmt->bindValue(':rep', $rep, PDO::PARAM_STR);

      補足日時:2021/07/13 11:19
  • $stmt->bindValue(':phone', $phone, PDO::PARAM_STR);
    $stmt->bindValue(':mail', $mail, PDO::PARAM_STR);
    $stmt->bindValue(':password_hash', $password_hash, PDO::PARAM_STR);
    $stmt->execute();
    $stmt = $dbh->prepare("UPDATE pre_member SET flag=1 WHERE mail=(:mail)");
    $stmt->bindValue(':mail', $mail, PDO::PARAM_STR);
    $stmt->execute();

      補足日時:2021/07/13 11:20

A 回答 (1件)

ご提示の内容だけでは判断できませんので、可能性だけを指摘します



テーブル項目 member.password の値を、ログイン時(select)も同様に扱っているか調査しましょう。違うアルゴリズムを使っていませんか?

変数 $code はどこから取得しているのでしょうか?
また、テーブル項目 master.code と直接比較していますが、事前に何かしら変換をする必要はないでしょうか?

余談ではありますが

SQL 内に $code を直接使うのは SQL インジェクションの脆弱性が生まれる原因になりえますので、bind_param の使用を強くお勧めします。
    • good
    • 0
この回答へのお礼

説明不足にも関わらず、ご丁寧に回答いただきありがとうございます。また、セキュリティ面についてもご心配いただきありがとうございます。
最初から、説明いたしますと、
まず、メールを使った仮会員登録をします。送られてきたメールについているURLより、本登録をします。本登録した会員は、会員専用のWEBアプリにログインします。その時、会員ナンバーと会員名をページ上に表示します。ナビボタンを使ってページを切り替えます。それぞれのページに会員ナンバーと会員名を表示するためにSESSIONを使って使っています。
ページは、ホーム(お知らせ等を表示)、請求ダウンロード(請求書をダウンロードできる)、会員情報の確認と変更(登録した内容の一部をここで変更できる。パスワードもここで変更できるようにしている)、ログアウトという構成になっています。
お尋ねしているパスワードの件ですが、
まず次のコートが、最初の会員登録です。そして、最初に書いたように変更するコードがあります。
会員登録は、form、check、insertと3つのファイルを作っています。
変更も、確認用のファイル、変更入力ができるcheck、変更するためのupdateというファイル構成になっています。
以上で、足りますでしょうか。何かしらで結構ですので、アドバイスなどいただけましたら幸いです。
文字アーバーなのでコードは別にします。

お礼日時:2021/07/13 11:11

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