Php 基于pdo的静态认证方法

Php 基于pdo的静态认证方法,php,authentication,pdo,Php,Authentication,Pdo,我一直在转换一些更基本的脚本,因此它们开始使用PDO,而我似乎无法让我的静态身份验证方法工作。我已经让它工作,但它不是静态的 以下是采用非静态身份验证方法的相关代码: private $dbh; public function __construct() { $this->dbh = new PDO("mysql:host=localhost;dbname=carmen", 'root', ''); $this->dbh->setAttribute(PDO::

我一直在转换一些更基本的脚本,因此它们开始使用PDO,而我似乎无法让我的静态身份验证方法工作。我已经让它工作,但它不是静态的

以下是采用非静态身份验证方法的相关代码:

private $dbh;
public  function __construct()
{
    $this->dbh = new PDO("mysql:host=localhost;dbname=carmen", 'root', '');
    $this->dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}

 public function authenticate($username="", $password="")
 {
    $sql  = "SELECT * FROM user ";
    $sql .= "WHERE username = :username ";
    $sql .= "AND pass = :password ";
    $sql .= "LIMIT 1"; 

    $stmt = $this->dbh->prepare($sql);
    $stmt->bindParam(':username', $username);
    $stmt->bindParam(':password', $password);
    $stmt->execute();
    $result = $stmt->fetchAll(PDO::FETCH_ASSOC);

    return !empty($result) ?  true : false;
 }

当我试图声明mehthod static时,我在解决方案中的尝试通常在sql语句后的第一行遇到问题。我猜它必须处理$dbh在课程开始时被声明为私有的问题

您的问题是,一旦转换为静态方法,
$this->dbh
将无法工作

如果您想使此方法成为静态的,可能最简单的方法是将PDO对象作为参数传递给函数


相反,您可以将
$dbh
声明为静态变量,然后使用
self::$dbh
访问它,但还必须添加一些方法来初始化它(可能是另一个静态方法),而不是构造函数。

静态函数无法访问
$this
指针。在这种情况下,这毫无意义

一些解决办法是:

  • 保持功能非静态,或

  • 将$dbh句柄设为静态。然后,您可能会用某种静态init函数替换构造函数,或者

  • 将$dbh句柄传递给需要它的静态函数

您可能需要重新审视您的总体设计