1

这就是我的数据库类:

<?php
// Define configuration
define("DB_RDBMS", "mysql");
define("DB_HOST", "localhost");
define("DB_NAME", "ccaweb");
define("DB_USER", "ccawebroot");
define("DB_PASS", "Ni2o7AwE");

class database {

    // Database Managment System (Database Type)
    private $rdbms      = DB_RDBMS;

    // Database Host Address/IP
    private $dbhost     = DB_HOST;

    // Database Name
    private $dbname     = DB_NAME;

    // Database User Name
    private $dbuser     = DB_USER;

    // Database Password
    private $dbpass     = DB_PASS;

    //
    private $con = false;

    public function __construct ()
    {
        //connect to database
        if (!$this->con)
        {
            //not yet connected, make a connection
            try
            {
                $this->db = new PDO($this->rdbms.':host='.$this->dbhost.';dbname='.$this->dbname, $this->dbuser, $this->dbpass);
                $this->db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
                $this->con = true;
                return $this->con;
            }
            catch (PDOException $e)
            {
                require_once('/error/database_error.php');
                $date = date("d/m : H:i : ");

                file_put_contents('logs/db.connection.error.txt', $date.$e->getMessage().PHP_EOL,FILE_APPEND);
                exit();
            }
        }
        else
        {
            //already connected - do nothing and show true
            return true;
        }
    }

}
?>

这就是我使用该类所做的事情:

// Import database class file
include_once '../library/class/database.class.php';

//create new database instance
$db = new database();

// Create Table
$query = "DROP TABLE IF EXISTS `courseannouncement`;
CREATE TABLE IF NOT EXISTS `courseannouncement` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `courseId` varchar(10) NOT NULL,
  `title` varchar(100) NOT NULL,
  `announcementText` text NOT NULL,
  `createdBy` int(11) NOT NULL,
  `createdDate` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `deleted` int(1) NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`)
)";

$sth = $db->prepare("$query");
$sth->execute();

?>

但是我收到以下错误:致命错误:在第 22 行的 D:..\installDatabase.php 中调用未定义的方法 database::prepare()

所以我尝试将数据库类更改为

class database extends PDO {

但这仍然给我一个错误

谁能指出我做错的方向?是否对 PDO 数据库连接使用类最佳实践?

另外,我应该使用单例吗?我见过很多他们说这很好的地方,但也有很多帖子说使用单例是不好的。

4

3 回答 3

1

你的逻辑有缺陷。您的类不扩展 PDO,它只是在内部实例化一个 PDO 对象,但从不将该对象公开给使用您的类的任何人。

如果你有

$db->db->prepare(...)

然后它会起作用,因为您将访问您在对象中创建的 PDO 对象。

于 2013-08-02T15:53:23.403 回答
0

你在哪里定义database::db?您需要在您的类中有一个使用您的db成员处理查询的方法,因为那是 PDO 对象。

class database {
private $db;
  ...
  public function exeQuery($query) {
    $sth = $this->db->prepare($query);
    ...
  }

  ..
}

如果将成员db公开为公共,则可以在类外访问 pdo 对象。$db->db->prepare($query);

于 2013-08-02T15:53:28.987 回答
-2

我收到以下错误:致命错误:调用未定义的方法数据库::prepare()

您的课程中没有prepare()方法。这就是您收到此错误的原因。

所以我尝试将数据库类更改为class database extends PDO {

所以再试一次。

于 2013-08-02T15:49:04.180 回答