【问题标题】:PHP PDO Database Connect Class [duplicate]PHP PDO数据库连接类[重复]
【发布时间】:2013-08-03 23:18:31
【问题描述】:

这是我的数据库类:

<?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 数据库连接?

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

【问题讨论】:

  • 可能想要$sth = $db-&gt;db-&gt;prepare("$query");
  • 另外,我想指出,PDO 不是数据库。

标签: php mysql oop pdo database-connection


【解决方案1】:

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

如果你有

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

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

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

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

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

      所以再试一次。

      【讨论】:

        猜你喜欢
        • 2013-05-14
        • 1970-01-01
        • 2021-12-06
        • 2016-03-27
        • 1970-01-01
        • 1970-01-01
        • 2011-07-22
        • 2017-11-29
        • 2023-03-22
        相关资源
        最近更新 更多