PHP - 无法从另一个类访问数据库连接器类。我究竟做错了什么?

时间:2014-05-02 19:36:50

标签: php mysql oop

我正在尝试完成this question中概述的相同目的,但我对该答案的应用不起作用。尝试执行涉及数据库类的任何操作时,我得到空白的白屏。

这应该很简单 - 用户在表单中输入用户名和密码。如果两者都被控制器接收,我查询数据库并将提交的密码的哈希值与文件上的哈希值进行比较。问题是,一旦我开始进行数据库调用,我的页面就不会加载。

我有一个控制器和两个班级。一个类是数据库连接器,另一个是依赖于数据库连接器的验证模块。

数据库连接器类:

class inquiry
{       
    protected $pdo;

    // Set up the initial db connection
    function __construct()
    {
        try
        {
            $this -> pdo = new PDO('mysql:host=127.0.0.1;dbname=mysqlserver','mydatabase','ffffffffffffffff');
            $this -> pdo -> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            $this -> pdo -> setAttribute(PDO::ATTR_ORACLE_NULLS, PDO::NULL_EMPTY_STRING);
            $this -> pdo -> setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
            $this -> pdo -> exec('set names "utf8"');
        }
        catch (PDOException $e)
        {
            echo $e -> getMessage();
        } 
    }   
}

然后,身份验证类:

class auth
{
private $username;
private $password;
private $db;

function __construct(inquiry $db)
{
            $this -> db = $db;
}

function login($username, $password)
{
    $this -> username = $username;
    $this -> password = $password;

    // Query database, get hashed password for username
    $this -> db -> query('select password from users where username="bob";');

    // Data needs to be fetched but PHP does not process anything past this point anyway

    return true;
}
}

然后,在控制器中:

require_once '../inc/class.inquiry.php';
require_once '../inc/class.auth.php';

if (isset($_POST['username']) && isset($_POST['password']))
{
    // Probably doing something wrong here
    $dbconnect = new inquiry();
    $user = new auth($dbconnect);

    $authorized = $user -> login($_POST['username'], $_POST['password']);

    if ($authorized == true)
    {
        // Send user to index page
        header('Location: index.php');
        exit();
    }
}

我评论了认为我错了的部分,但我不知道该怎么做。任何提示将不胜感激!

1 个答案:

答案 0 :(得分:1)

您的所有代码在许多级别上都是错误的。从代码标准开始,其中类应以大写字母开头,格式化代码,完成调用不存在的方法。

首先,您的inquiry课程没有所需的query()方法。看来你试图给我们一个你自己没有编写的代码来调试。

其次,你的课程完全无用。即使它没有自定义包装查询方法,您仍然可以使用PDO的方法来查询和执行查询。但是,即使您将PDO类型的对象的值分配给protected $pdo,您仍然无法访问该类外的$pdo,即来自auth类。你应该为$pdo编写一个访问者,这样你就可以使用像

这样的东西
$this->db->getPdo()->prepare("SELECT ......");