使用pdo进行静态验证方法

时间:2011-03-11 03:25:01

标签: php authentication 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。

2 个答案:

答案 0 :(得分:0)

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

如果你想让这个方法变为静态,那么将PDO对象作为参数传递给函数可能是最容易的。

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

答案 1 :(得分:0)

静态函数无法访问$this指针。在这种背景下没有任何意义。

有些解决方案是:

  • 保持功能非静态,或

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

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

您可能需要重新审视整体设计。