У меня есть один класс, содержащий три метода. Все эти методы нуждаются в базе данных. Затем я хочу создать систему для подключения к базе данных, прежде всего. Что-то вроде этого:

Class myclass
{
    private $db;

    public function __construct() {

        $db = new PDO("mysql:host = hostname; dbname = database",username, password);
    }

    function one()   {/* it needs to database and I will use it like this: */
                         $this->$db->prepare("select ...");
                     }
    function two()   {/* also it needs to database */}
    function three() {/* also it needs to database */}
}

Теперь я хочу знать (во-первых), что я сделал, это стандартный подход? и (через секунду) как я могу проверить [было ли соединение разорвано (другими словами соединение не существует), а затем соединиться]?

1
stack 21 Окт 2015 в 14:50

3 ответа

Лучший ответ

Чтобы получить доступ к свойствам класса, вы должны использовать синтаксис ->:

Class myclass
{
    private $db;

    public function __construct() {

        $this->db = new PDO("mysql:host = hostname; dbname = database",username, password);
    }

    function one()   {/* it needs to database and I will use it like this: */
        $this->db->prepare("select ...");
    }
    function two()   {/* also it needs to database */}
    function three() {/* also it needs to database */}
}

Если вы хотите обнаруживать ошибки, включите сигнализацию об ошибках с помощью

$this->db->setAttributePDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

И используйте try/catch вокруг кода, который использует БД:

function one() {
    try {
        $this->db->prepare(...);
    } catch (PDOException $e) {
        // handle error
    }
}
1
Barmar 21 Окт 2015 в 11:58

Создать класс db

class db {

/*** Declare instance ***/
private static $instance = NULL;

/**
*
* the constructor is set to private so
* so nobody can create a new instance using new
*
*/
private function __construct() {
  /*** maybe set the db name here later ***/
}

/**
*
* Return DB instance or create intitial connection
*
* @return object (PDO)
*
* @access public
*
*/
public static function getInstance() {
    if (!self::$instance) {
        self::$instance = new PDO("mysql:host=".DB_HOSTNAME.";dbname=".DB_DATABASE, DB_USERNAME, DB_PASSWORD);
        self::$instance-> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT);
    }

    return self::$instance;
}

public static function close() {
    if (self::$instance) {
        self::$instance = null;
    }
}

/**
*
* Like the constructor, we make __clone private
* so nobody can clone the instance
*
*/
private function __clone(){
}

} /*** end of class ***/

Чтобы использовать это:

DB::getInstance()

Вау, плохой ответ. ХОРОШО :)

Мне кажется, лучший способ. Просто создайте класс и, когда он вам понадобится, вызовите его экземпляр.

0
Nuno Costa 21 Окт 2015 в 12:07

2 возможных подхода:

1 .: расширить класс PDO (вы также унаследуете все общедоступные методы)

Это мой личный фаворит.

Class myclass extends PDO
{
    //constructor is inherited from PDO so you dont need to create a new one

    function one()   {/* it needs to database and I will use it like this: */
                         //access internal methods via $this:
                         $this->prepare("select ...");
                     }
    function two()   {/* also it needs to database */}
    function three() {/* also it needs to database */}
}

Пытается установить соединение:

try{
    $db = new myclass("mysql:host = hostname; dbname = database","useer", "asdf");
}
 catch (PDOException $e) {
   print "Error!: " . $e->getMessage() . "<br/>".PHP_EOL;
   exit("ERROR OCCURED");
}

2. создать объект pdo как свойство

Класс myclass2 {частный $ db;

public function __construct() {

    try{
            $this->db = new myclass("mysql:host = hostname; dbname = database","useer", "asdf");
            }
             catch (PDOException $e) {
               print "Error!: " . $e->getMessage() . "<br/>".PHP_EOL;
               exit("ERROR OCCURED");
            }
    }

function one()   {/* it needs to database and I will use it like this: */
                     $this->db->prepare("select ...");
                 }
function two()   {/* also it needs to database */}
function three() {/* also it needs to database */}

}

1
Tanuel Mategi 21 Окт 2015 в 12:06