我一直在转换一些更基本的脚本,所以他们开始使用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。
答案 0 :(得分:0)
您的问题是,一旦转换为静态方法,$this->dbh
将无效。
如果你想让这个方法变为静态,那么将PDO对象作为参数传递给函数可能是最容易的。
您可以将$dbh
声明为静态变量,然后使用self::$dbh
访问它,但是您还需要添加一些方法来初始化它(可能是另一种静态方法)而不是构造函数。
答案 1 :(得分:0)
静态函数无法访问$this
指针。在这种背景下没有任何意义。
有些解决方案是:
保持功能非静态,或
使$ dbh句柄保持静态。然后,您可能会使用某种静态init函数替换构造函数,或者
将$ dbh句柄传递给需要它的静态函数。
您可能需要重新审视整体设计。