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();

?>

ただし、次のエラーが表示されます: Fatal error: Call to undefined method database::prepare() in D:..\installDatabase.php on line 22

だから私はデータベースクラスを

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

次のエラーが表示されます: Fatal error: Call to undefined method database::prepare()

prepare()あなたのクラスにはメソッドがありません。これが、このエラーが発生する理由です。

だから私はデータベースクラスをclass database extends PDO {

再試行してください。

于 2013-08-02T15:49:04.180 に答える