我正在尝试完成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();
}
}
我评论了认为我错了的部分,但我不知道该怎么做。任何提示将不胜感激!
答案 0 :(得分:1)
您的所有代码在许多级别上都是错误的。从代码标准开始,其中类应以大写字母开头,格式化代码,完成调用不存在的方法。
首先,您的inquiry
课程没有所需的query()
方法。看来你试图给我们一个你自己没有编写的代码来调试。
其次,你的课程完全无用。即使它没有自定义包装查询方法,您仍然可以使用PDO的方法来查询和执行查询。但是,即使您将PDO类型的对象的值分配给protected $pdo
,您仍然无法访问该类外的$pdo
,即来自auth
类。你应该为$pdo
编写一个访问者,这样你就可以使用像
$this->db->getPdo()->prepare("SELECT ......");