PDO вернуть подключение, класса для работы с базой?

Доброй ночи! Подскажите каким образом я могу вернуть подключение к базе. К примеру у меня есть класс Database в нем вообщем то я делаю вот так
public function connect()
  {
    $opt = array(
    PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
    );
    try
    {
      $PDO = new PDO ( 'mysql:host=localhost;dbname=profocus', 'root', '', $opt  );
    }
    catch ( PDOException $e )
    {
      $e->getMessage( Route::ErrorPage() );
    }
    return $PDO;
  }


Так же есть еще 2 класса. Супер класс Model и потомок Home_model.
В конструкторе супер класса я делаю вот так.
$db = new Database();
    $cnn = $db->connect();

А класс потомок выглядит следующим образом
<?php

class model_home extends model
{
  public function __construct()
  {
    parent::__construct();
    var_dump($db);
  }

  public function return_data()
  {
    $name = "228";
    $stmt = $cnn->prepare("INSERT INTO headers (parent) VALUES (:parent)");
    $stmt->bindParam(":parent", $name);
    $stmt->execute();
  }
}
 ?>

В конечном итоге получаю ошибку
Fatal error: Call to a member function prepare() on null

Понимаю, что это из - за того что var_dump($db) == null
Собственно вопрос, как правильно получить соединение с базой в классах потомках.
Спасибо огромное за помощь!
  • Вопрос задан
  • 249 просмотров
Пригласить эксперта
Ответы на вопрос 2
edli007
@edli007
full stack, team lead
вместо
$PDO = new PDO ( 'my....

Сделайте

class model_home extends model
{
  protected $db = null;
....
   $this->db = new PDO ( 'my....


а то и вовсе синглетон запилите, чтобы там делал коннект при первом обращении.
Ответ написан
Комментировать
@dev400
можно сделать отдельный объект
<?php
namespace Common;

final class Connection
{

    protected static $link;


    public static function init() {

        if ( is_null(self::$link) ) {
            try {
                $attr  = array(
                    \PDO::ATTR_ERRMODE  =>  \PDO::ERRMODE_EXCEPTION,
                    \PDO::ATTR_DEFAULT_FETCH_MODE   =>  \PDO::FETCH_ASSOC,
                    \PDO::ATTR_EMULATE_PREPARES =>  TRUE,
                );
                self::$link= new \PDO("mysql:host=localhost;dbname=localhost;charset=utf8", "local", "host", $attr);

            } catch (\PDOException $e) {
                echo "error";
                file_put_contents('error.txt', $e->getMessage(), FILE_APPEND);
            }
        }

    }

    /**
     *  @return \PDO;
     */
    public static function con() {
        return self::$link;
    }
}


в главном index.php перед инициализацией роутера инициализировать подключение
//код....
//код....
//код....

Load::init();
Connection::init();
$router = new Router();


и в базовой модели
<?php
namespace Common\Base;

use Common\Connection;

abstract class Model {

    /**
     * prefix for tables
     */
    const PREFIX =  "";

    /**
     * @var
     */
    protected $table;

    /**
     * @var
     */
    protected $key;

    /**
     * @return mixed
     */
    public function findAll() {

        return $this->fetch("SELECT * FROM " . self::PREFIX . $this->table . " ");

    }


    /**
     * @param array $args
     * @return array|string
     */
    public function findBy(Array $args) {

        $stmt = Connection::con()->prepare("SELECT * FROM " . self::PREFIX . $this->table . " where {$this->key} = ?");
        $data = "";
        if ( $stmt->execute($args) ) {
            while ($row = $stmt->fetch()) {
               $data[] = $row;
            }
        }
        return $data;

    }

    /**
     * @param $query
     * @return mixed
     */
    protected function fetch($query) {

        $stmt = Connection::con()->query($query);
        $stmt->setFetchMode(\PDO::FETCH_ASSOC);
        $data = "";
        while ($row = $stmt->fetch()) {
            $data[] = $row;
        }
        return $data;

    }

}


Ну это так, пример.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы