我一直在研究一个databaseHandler php类,它应该连接到数据库,然后可以在其他PHP文件中使用,至少这是计划。我遇到的问题是它不能在我的PHP类中使用任何与PDO相关的函数,我已经尝试检查它是否为null,或者根本没有设置(但它确实如此)并且我也尝试使用虚函数只是回想一下,如果这个类在其他人中没有被定义,那就是测试它。
<?php
class databaseHandler {
private $db;
private static $instance;
function __construct() {
$this->buildDatabaseConnection();
}
public static function getInstance() {
if(!self::$instance) {
self::$instance = new databaseHandler();
}
return self::$instance;
}
private function buildDatabaseConnection() {
require 'dbconfig.php';
try {
$this->db = new PDO("mysql:host=" . HOST . ";dbname=" . DATABASE . ";charset=utf8", USER, PASSWORD);
if(isset($this->db)) {
if(!is_null($this->db)) {
echo "isn't null";
}
}
} catch(PDOException $e) {
$e->getMessage();
}
}
public function getConnection() {
return $this->$db;
}
public function getSomeShit() {
echo "some shit";
}
}
?>
问题可能在于getConnection()php函数,它实际上是否在这里返回PDO对象?因为主要问题在于我在其他类中使用getConnection函数时出现此错误:
Notice: Undefined variable: database in F:\Websites\DevProject\php\functions.php on line 69
Fatal error: Uncaught Error: Call to a member function prepare() on null in F:\Websites\DevProject\php\functions.php:69 Stack trace: #0 F:\Websites\DevProject\php\functions.php(51): register('qwe', 'sdasd', 'asdasd', 'asdas', '01-01-1970') #1 F:\Websites\DevProject\register.php(123): datelessRegister('qwe', 'sdasd', 'asdasd', 'asdas') #2 {main} thrown in F:\Websites\DevProject\php\functions.php on line 69
和第69行将是:
$stmnt = $database->prepare("SELECT $username, $email FROM " . USERTABLE);
$ database变量是类实例的地方:
$database = databaseHandler::getInstance();
如果我在注册php文件中尝试var_dump,它会告诉我:
object(databaseHandler)#1 (1) { ["db":"databaseHandler":private]=> object(PDO)#2 (0) { } }
然而,当我在我的函数中使用它时,它会说它是'NULL',为什么它在函数中为null但是全局定义?
所有错误都与对象有关,并且在那里它告诉我pdo是未定义的(我已经尝试检查它是否为null,但它不是!)
任何帮助都会很棒,提前谢谢。
答案 0 :(得分:3)
在getConnection
方法的return语句中,你应该编写没有$
的类变量:
return $this->db;
此外,您必须在PDO连接而不是数据库处理程序类上执行查询,因此$database = databaseHandler::getInstance();
应该是
$database = databaseHandler::getInstance()->getConnection();
或者你可以简单地使用__call
魔法来保持你现在的代码:
public function __call($method, $args)
{
return call_user_func_array(array($this->db, $method), $args);
}
另外,为了阐明如何使用这个类,你应该在你需要使用数据库的每个方法中调用它,而不是只在文件的顶部调用一次,因为在那里定义它不会在你的方法中可用/ functions除非您不使用全局语句导入变量。但是,不鼓励使用全局变量,这被认为是一种不好的做法。有关如何使用数据库的示例如下:
public function doSomething()
{
$db = databaseHandler::getInstance()->getConnection();
$db->prepare(....);
}
public function doSomethingElse()
{
$db = databaseHandler::getInstance()->getConnection();
$db->prepare(....);
}
如果您知道类中有许多使用数据库的方法,那么您可以将其定义为类变量并在构造函数中设置db实例。
答案 1 :(得分:0)
问题似乎出现在getConnection()函数中。由于$ db是字段,你必须这样做。
[$ref]
然而,对于一个简单的问题,这是一个非常复杂的类结构。 您可以直接从PDO扩展您的课程
return $this->db;
每当你想进行数据库事务时,都要创建一个这样的对象。
class DatabaseHandler extends PDO {
function __construct() {
parent::__construct('mysql:host=host_name;dbname=db_name', 'user_name', 'password');
parent::setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}
}
答案 2 :(得分:0)
您似乎遇到了范围问题。
$database = databaseHandler::getInstance();
function doSomething()
{
// $database is not defined in this scope
$database->getConnection()->prepare(/* ... */);
}
您必须将其声明为全局范围的一部分
function doSomething()
{
global $database;
$database->getConnection()->prepare(/* ... */);
}