Php 致命错误:未捕获错误:在null上调用成员函数prepare()

Php 致命错误:未捕获错误:在null上调用成员函数prepare(),php,Php,这是三个文件 config.php functions.php index.php 我得到了一个错误“致命错误:未捕获错误:调用null上的成员函数prepare()。我是PHP oop新手。请帮帮我 我在config.php中有代码 class DatabaseConnection { public function __construct() { try { $pdo = new PDO('mysqli:host=xxx;dbname=xxx', 'ro

这是三个文件

config.php
functions.php
index.php
我得到了一个错误“致命错误:未捕获错误:调用null上的成员函数prepare()。我是PHP oop新手。请帮帮我

我在config.php中有代码

class DatabaseConnection {
   public function __construct() {
      try {
         $pdo = new PDO('mysqli:host=xxx;dbname=xxx', 'root', '');
      } catch(PDOException $e) {
          exit('Database error');
      }
   }
}
php代码见下文

require "config.php";

class LoginRegistration {
function __constructor() {
  $database = new DatabaseConnection();
}

public function registerUser($username, $password, $name, $email, $website) {
  global $pdo;
  $query = $pdo->prepare("SELECT id FROM users WHERE username = ? AND email = ?");
  exit();
  $query->execute(array($username, $email));
  $num = $query->rowCount();

  if($num == 0) {
    $query = $pdo -> prepare("INSERT INTO users (username, password, name, email, website) VALUES (?, ?, ?, ?, ?)");
    $query -> execute(array($username, $password, $name, $email, $website));
    return true;
  } else {
    print "Username and email already used.";
  }
}
}
以及index.php代码,您可以在下面找到

  require_once "functions.php";
  $user = new LoginRegistration();
    if($_SERVER['REQUEST_METHOD'] == 'POST') {
    $username = $_POST['username'];
    $password = $_POST['password'];
    $name = $_POST['name'];
    $email = $_POST['email'];
    $website = $_POST['website'];

    $password = md5($password);
    $register = $user->registerUser($username, $password, $name, $email, $website);
    if($register) {
  echo "<div class='alert alert-success'>Register done <a href='login.php'>Click her</a> for login</div>";
} else {
  echo "<div class='alert alert-danger'>Username or Email already exists.</div>";
}
}
require_once“functions.php”;
$user=新登录注册();
如果($\u服务器['REQUEST\u METHOD']=='POST'){
$username=$_POST['username'];
$password=$_POST['password'];
$name=$_POST['name'];
$email=$_POST['email'];
$website=$_POST['website'];
$password=md5($password);
$register=$user->registerUser($username、$password、$name、$email、$website);
如果($注册){
echo“登录注册完成”;
}否则{
echo“用户名或电子邮件已存在。”;
}
}

您将无法从全局范围内的
数据库连接
类中获得
$pdo
变量。因此,您的
$pdo
变量基本上是
null
。您可以按以下方式更改代码:

config.php:

class DatabaseConnection {
   public function __construct() {
      try {
         return new PDO('mysqli:host=xxx;dbname=xxx', 'root', '');            
      } catch(PDOException $e) {
          exit('Database error');
      }
   }
}
class DatabaseConnection {
   protected $pdo;
   public function __construct() {
      try {
         $this->pdo = new PDO('mysqli:host=xxx;dbname=xxx', 'root', '');            
      } catch(PDOException $e) {
          exit('Database error');
      }
   }
}
然后:

然而,我宁愿扩展
数据库连接
类,也不愿在
登录注册
类中实例化它。即:

config.php:

class DatabaseConnection {
   public function __construct() {
      try {
         return new PDO('mysqli:host=xxx;dbname=xxx', 'root', '');            
      } catch(PDOException $e) {
          exit('Database error');
      }
   }
}
class DatabaseConnection {
   protected $pdo;
   public function __construct() {
      try {
         $this->pdo = new PDO('mysqli:host=xxx;dbname=xxx', 'root', '');            
      } catch(PDOException $e) {
          exit('Database error');
      }
   }
}
然后从
LoginRegistration
类扩展
DatabaseConnection

class LoginRegistration extends DatabaseConnection {
    // constructor is not needed anymore
    public function registerUser($username, $password, $name, $email, $website) {

      $query = $this->pdo->prepare("SELECT id FROM users WHERE username = ? AND email = ?");
      $query->execute(array($username, $email));
      $num = $query->rowCount();

      ...

警告:编写自己的访问控制层并不容易,而且有很多机会使它严重出错。请不要编写您自己的身份验证系统,因为任何现代的同类产品都具有强大的内置功能。至少绝对不要使用像SHA1或MD5这样的弱高速散列来存储密码。您可以在
数据库连接中定义
$pdo
,但它只存在于该类中。因此,在
LoginRegistration
中使用
global$pdo
没有任何作用。您不应该使用。请使用PHP(
password\u hash()
password\u verify()
)来处理密码安全性。如果您使用的PHP版本低于5.5,则可以使用
密码\u hash()
。在散列之前,没有必要对它们执行任何清理或使用任何其他清理机制。
\u constructor()
这不是正确的语法。