簡體   English   中英

學習 PHP OOP 忘記密碼

[英]Learning PHP OOP Forgot Password

希望你的假期一切順利。 我正在嘗試了解如何在實際意義上使用 OOP 來處理忘記密碼表單(標准輸入 email,將其放入 mysql 並發送電子郵件)。 我已經對程序方法有了理解和工作版本。 但是當我試圖慢慢地重新編碼我的網站的某些部分時,它們是面向對象的。

forgot_password.php

<?php
session_start();
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);

//include database file
require_once('database.php');
require_once('functions.php');
require_once('includes/classes/user.php');

$user = New User;

//set Variables to empty
$error_message = "";
$success_message = "";

//check if form has been submitted
if($_POST){
  $email = test_input($_POST['email']);
  $user->forgot_password($email);
}
?>

<html>
  <head><title>Forgot Password</title></head>
    <body>
      <form action="forgot_password.php" method="POST">
      <strong>Email</strong> <input type="text" name="email"> <br>
      <input type="submit" value="Request New Password">
      </form>

      <?php echo $user->message; ?>
    </body>
</html>
    <?php
  class User{
    var $email;
    var $conn;
    var $message;

    function __construct(){
      $servername = "servername";
      $username = "username";
      $password = "password";
      $database = "database";
      // Create connection
      $conn = new mysqli($servername, $username, $password, $database);
    }

    function forgot_password($email){
      //query for userid, fname, lname, email based off of email they entered
      $sql = "SELECT user_id, first_name, last_name, email FROM users WHERE email='$email'";
      $result = $conn->query($sql);

      //if rows == 1 (email found) then insert into password_reset
      if($result->num_rows == 1){
        $row = $result->fetch_assoc();

        //delete old records so no confusion
        $sql = "DELETE FROM password_reset WHERE user_id='$row[user_id]'";
        $this->query($sql);

        $timestamp = time();
        $token = bin2hex(random_bytes(10));

        //insert into password_reset table
        $sql = "INSERT INTO password_reset (user_id, random_token, date_created) VALUES ('$row[user_id]','$token','$timestamp')";
        $result = $conn->query($sql);

        //insert email into email queue
        $message = "Hi $row[first_name] $row[last_name], <br>
        ?token=$token\">Reset Password</a>";

        $sql = "INSERT INTO email_queue (first_name, last_name, email, message, priority, date_created) VALUES ('$row[first_name]','$row[last_name]','$row[email]','$message','2','$timestamp')";
        $result = $conn->query($sql) or die($conn->error);

        $this->message = "Please check your email for further instructions.";
      }
      //else let them know email wasnt found
      else{
        $this->message = "Sorry there was an error. ";
      }
    }
  }
?>

這是錯誤:注意:未定義變量:第 19 行 /includes/classes/user.php 中的 conn

Fatal error: Uncaught Error: Call to a member function query() on null in /includes/classes/user.php:19 Stack trace: #0 /forgot_password.php(21): User->forgot_password('asdf') # 1 {main} 在第 1 行的 /includes/classes/user.php 中拋出

您收到此錯誤,因為您的所有 class 變量都需要按以下方式聲明:

  $this->servername = "servername";
  $this->username = "username";
  $this->password = "password";
  $this->database = "database";
  // Create connection
  $this->conn = new mysqli($servername, $username, $password, $database);

然后你應該在其他功能中以相同的方式使用它們。 $this 指的是 class 的當前實例。 沒有它,變量會在 function 的 scope 之外丟失。 這就是為什么你會得到“呼叫成員 function query() on null”,因為它認為 $conn 是 null。

“this”的概念不僅在 PHP 中使用,而且在許多其他語言中也使用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM