Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何更改我的类PDO以获得正确的工作_Php_Oop_Pdo - Fatal编程技术网

Php 如何更改我的类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;

我已经重写了从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;
    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;
}