実現したいこと
パスワード再設定機能
発生している問題・分からないこと
パスワード再設定機能を実装する時にエラーが発生しました。解決できずに困っています。
emailという変数ははデータベースからメールアドレスを取得するのに使っています。
エラーメッセージ
error
1Catchable fatal error: Object of class PDOStatement could not be converted to string in サーバーアカウント/public_html/lost_password.php on line 77
該当のソースコード
PHP
1<!DOCTYPE html> 2<html lang="ja"> 3<head> 4<meta charset="utf-8"> 5<meta name="viewport" content="width=device-width, initial-scale=1.0"> 6<title>パスワード再設定 - MakeBlog</title> 7<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-9ndCyUaIbzAi2FUVXJi0CjmCapSmO7SnpJef0486qhLnuZ2cdeRhO02iuK6FUUVM" crossorigin="anonymous"> 8<link rel="stylesheet" href="mb-adm/style.css"> 9<!--nobanner--> 10</head> 11<body> 12<div class="modal" tabindex="-1" style="display: block!important;"> 13 <div class="modal-dialog"> 14 <div class="modal-content"> 15 <div class="modal-header"> 16 <h5 class="modal-title">パスワード再設定</h5> 17 </div> 18 <div class="modal-body"> 19メールアドレスを入力し、送信ボタンをクリックしてください。 20<form method="post" action="?action=resetmail"> 21<input type="email" class="form-control" name="email"> 22<input type="submit" class="btn btn-primary" value="送信"> 23</form> 24<script type="text/javascript" src="https://cache1.value-domain.com/xa.j?site=devreicha.s370.xrea.com"></script> 25 </div> 26 </div> 27 </div> 28</div> 29<script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.11.8/dist/umd/popper.min.js" integrity="sha384-I7E8VVD/ismYTF4hNIPjVp/Zjvgyol6VFvRkX/vR+Vc4jQkC+hVqc2pM8ODewa9r" crossorigin="anonymous"></script> 30<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.min.js" integrity="sha384-fbbOQedDUMZZ5KreZpsbe1LCZPVmfTnH7ois6mU1QK+m14rQ1l2bGBq41eYeM/fS" crossorigin="anonymous"></script> 31</body> 32</html> 33<?php 34ini_set('display_errors', "On"); 35session_start(); 36if (isset($_GET['action']) && $_GET['action'] == 'resetmail') { 37$_SESSION['reset_token'] = bin2hex(random_bytes(32)); 38$reset_url = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on' ? "https://" : "http://") . $_SERVER['HTTP_HOST'] . '/lost_password.php?token=' . $_SESSION['reset_token']; 39echo $reset_url; 40$email = $_POST['email']; 41$to = $email; 42$subject = 'MakeBlog - パスワード再設定'; 43$message = ' 44誰かがパスワード再設定を要求しました。 45下記のリンクをクリックし、パスワードを再設定してください。 46' . $reset_url . ' 47これがご自身によるものでない場合は、このメールを無視して削除してください。 48ありがとうございます。 49'; 50mb_language("Japanese"); 51mb_internal_encoding("UTF-8"); 52$headers = "From: makeblog@" . $_SERVER['HTTP_HOST']; 53mb_send_mail($to, $subject, $message, $headers); 54echo ' 55<div class="alert alert-info" role="alert"> 56 リセットリンクが記載されたメールを送信しました。 57</div> 58'; 59} 60if (!empty($_SESSION['reset_token']) && isset($_GET['token'])) { 61 $token = $_SESSION['reset_token']; 62 // XMLファイルの読み込み 63 $xml = simplexml_load_file('mb-database-config.xml'); 64 // 要素の値を取得 65 $name = $xml->name; 66 $hostname = $xml->hostname; 67 $user = $xml->user; 68 $dbpass = $xml->pass; 69 $db = new PDO('mysql:dbname='.$name.';host='.$hostname.';charset=utf8', $user, $dbpass); 70 $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 71 $email = $db->prepare("SELECT email FROM `login`"); 72 $email->execute(); 73 $token = $_SESSION['reset_token']; 74 if (!empty($token)) { 75 $email->fetch(PDO::FETCH_ASSOC); 76 $stmt = $db->prepare('SELECT * FROM users WHERE email = :email'); 77 $stmt->bindParam(':email', $email, PDO::PARAM_STR); 78 $stmt->execute(); 79 } 80}
試したこと・調べたこと
- teratailやGoogle等で検索した
- ソースコードを自分なりに変更した
- 知人に聞いた
- その他
上記の詳細・結果
Geminiに聞いてみましたが、解決できませんでした。
補足
PHP8.3
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。