Php 如何更改我的类PDO以获得正确的工作
我已经重写了从mysqli到PDO的数据库连接。我的连接与准备好的语句一起工作。我的班级PDO是这样的:Php 如何更改我的类PDO以获得正确的工作,php,oop,pdo,Php,Oop,Pdo,我已经重写了从mysqli到PDO的数据库连接。我的连接与准备好的语句一起工作。我的班级PDO是这样的: <?php define('DB_HOST', 'xxx'); define('DB_NAME', 'xxx'); define('DB_USER', 'xxx'); define('DB_PASS', 'xxx'); define('DB_CHAR', 'xxx'); class DBController { protected static $instance;
<?php
define('DB_HOST', 'xxx');
define('DB_NAME', 'xxx');
define('DB_USER', 'xxx');
define('DB_PASS', 'xxx');
define('DB_CHAR', 'xxx');
class DBController
{
protected static $instance;
protected $pdo;
public function __construct() {
$opt = array(
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_OBJ,
PDO::ATTR_EMULATE_PREPARES => FALSE,
);
$dsn = 'mysql:host='.DB_HOST.';dbname='.DB_NAME.';charset='.DB_CHAR;
$this->pdo = new PDO($dsn, DB_USER, DB_PASS, $opt);
}
// a classical static method to make it universally available
public static function instance()
{
if (self::$instance === null)
{
self::$instance = new self;
}
return self::$instance;
}
// a proxy to native PDO methods
public function __call($method, $args)
{
return call_user_func_array(array($this->pdo, $method), $args);
}
// a helper function to run prepared statements smoothly
public function run($sql, $args = [])
{
if (!$args)
{
return $this->query($sql);
}
$stmt = $this->pdo->prepare($sql);
$stmt->execute($args);
return $stmt;
}
function insert($query) {
if (!$args)
{
return $this->query($sql);
}
$stmt = $this->pdo->prepare($sql);
$stmt->execute($args);
return $stmt;
}
function update($query) {
if (!$args)
{
return $this->query($sql);
}
$stmt = $this->pdo->prepare($sql);
$stmt->execute($args);
return $stmt;
}
}
<?php
require "DBController.class.php";
class Auth {
protected $db;
protected $data;
public function __construct()
{
$this->db = DBController::instance();
}
function getMemberByUsername($username)
{
$this->data = $this->db->run("Select * from `members` where `member_name` = ?", array($username))->fetchAll(0);
}
function getTokenByUsername($username,$expired)
{
$this->data = $this->db->run("Select * from `tbl_token_auth` where `username` = ? and `is_expired` = ?", [$username, $expired])->fetchAll();
}
function markAsExpired($tokenId)
{
$expired = 1;
$this->data = $this->db->run("UPDATE `tbl_token_auth` SET `is_expired` = ? WHERE id = ?", [$expired, $tokenId])->fetchAll();
}
function insertToken($username, $random_password_hash, $random_selector_hash, $expiry_date)
{
$this->data = $this->db->run("INSERT INTO `tbl_token_auth` (username, password_hash, selector_hash, expiry_date) values (?, ?, ?,?)", [$username, $random_password_hash, $random_selector_hash, $expiry_date])->fetchAll();
}
}
}
我做错了什么 您使用的是
O::ATTR\u DEFAULT\u FETCH\u MODE=>PDO::FETCH\u OBJ
,因此fetchAll()
返回一个对象数组,而不是数组。因此,您需要使用$user[0]->member\u password
从结果中获取密码
if (password_verify($password, $user[0]->member_password)) {
$isAuthenticated = true;
}
您的
insert()
和update()
方法使用if(!$args)
,但它们都不像run()
那样接受$args
作为函数参数。我已将$args添加到函数insert()和update()中。您确定数据库中存在具有此类用户名的记录吗?也许这些值是用空格填充的?我确定。我试图用另一个用户登录,但我看到了同样的情况。可能是在talken中检查用户时出现问题。我添加了这个代码。谢谢你的回答。我已经更正了,但仍然看到“无效登录”为什么在fetchAll(0)
?0中有0
?这是一个错误。我把它删掉了。变量转储($username);显示——字符串(5)“andre”var_dump($user);显示为空
if (password_verify($password, $user[0]->member_password)) {
$isAuthenticated = true;
}