質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.34%
CMS

CMS(Content Management System)は複数のユーザーでコンテンツを編集することが可能なWebサイトの管理/構築用のプラットフォームを指します。また、会社単位で運用管理するものはECMと呼びます。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

1回答

93閲覧

自作のパスワード再設定フォームでfatal error、noticeが起こる

youmu284

総合スコア0

CMS

CMS(Content Management System)は複数のユーザーでコンテンツを編集することが可能なWebサイトの管理/構築用のプラットフォームを指します。また、会社単位で運用管理するものはECMと呼びます。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2025/01/25 09:39

実現したいこと

パスワード再設定機能

発生している問題・分からないこと

パスワード再設定機能を実装する時にエラーが発生しました。解決できずに困っています。
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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

エラーが発生しました。解決できずに困っています。

プログラマには、エラーを読む努力が必要不可欠です。
エラーメッセージには重要なヒントが書かれているからです。

emailという変数ははデータベースからメールアドレスを取得するのに使っています。

それはこの部分ですね。

PHP

1$email = $db->prepare("SELECT email FROM `login`");

PDO::prepare()は何を返すのか(=何が $email にセットされるのか)はご存知でしょうか?
PHP公式マニュアル(PDO::prepare())
そして、エラーの発生個所だと指摘されている部分

PHP

1$stmt->bindParam(':email', $email, PDO::PARAM_STR);

で使っている PDOStatement::bindParam() はどんな引数が必要であるかを確認されましたか?
PHP公式マニュアル(PDOStatement::bindParam())
__「email」というプレースホルダに割り当てる「メールアドレスが格納されている」変数ですよね?

実際には$emailにはPDOStatementが格納されていているだけで、データベースにプリペアドステートメントを投げる準備が出来ただけで実行もフェッチもやっていません。
つまり、$email はメールアドレスを直接取得する事が出来ないモノで、質問者さんの想定とは異なるモノになっています。


PHP

1</body> 2</html> 3<?php 4 ini_set('display_errors', "On"); 5 session_start(); 6(略) 7 echo ' 8<div class="alert alert-info" role="alert"> 9 リセットリンクが記載されたメールを送信しました。 10</div> 11';

セッションを開始する前に HTMLデータを書き出してしまっていますから、開始する事が出来ないと思います。
更に htmlの閉じタグの後に divタグが出力されるのは構図的にNGでは?

投稿2025/01/25 16:58

tezcello

総合スコア409

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.34%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問