За последние 24 часа нас посетили 20159 программистов и 1084 робота. Сейчас ищут 725 программистов ...

Как лучше подключить PDO в объекте, где много классов

Тема в разделе "PHP для новичков", создана пользователем Andrey760247, 8 дек 2017.

Метки:
  1. Andrey760247

    Andrey760247 Новичок

    С нами с:
    8 дек 2017
    Сообщения:
    2
    Симпатии:
    0
    Как сделать так, чтоб не повторять подключение к pdo в каждом классе, если у меня их к примеру 50.
     
  2. SamyRed

    SamyRed Старожил

    С нами с:
    23 июл 2015
    Сообщения:
    1.196
    Симпатии:
    111
    Адрес:
    Украина
    Выполни подключение перед вызовом всех классов
     
  3. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.734
    Симпатии:
    1.315
    Адрес:
    Лень
    PHP:
    1. if ( self::$instance === null )
    2. {
    3.    self::instance = new pdo...;
    4. }
    5.  
    6. return self::instance;
     
    _ne_scaju_ нравится это.
  4. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.548
    Симпатии:
    1.754
    Паттерн Registry - самое простое, Service Locator и DI-контейнер - покруче. Можно готовый взять: php-di.org.
    Но начни с Registry:
    PHP:
    1. class Registry {
    2.      static private $r = [];
    3.     static public function get($what) { return self::$r[$what]; }
    4.     static public function set($what, $obj) { self::$r[$what] = $obj; }
    5. }
    6.  
    7. // В начале файла index.php, до того, как дальше передавать
    8. // Если не единая точка входа, то в начале каждой точки входа, или подключить файл с таким содержанием
    9. $db = new PDO(/* параметры */);
    10. Registry::set("db", $db);
    11.  
    12. // Там, где понадобилось
    13. class Fignya { public function super() { $db = Registry::get("db"); } }
     
  5. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.199
    Симпатии:
    184
    PHP:
    1. class DB {
    2.     private static $db;
    3.     private static $host = 'localhost';
    4.     private static $dbname = 'test';
    5.     private static $charset = 'utf8';
    6.     private static $username = 'root';
    7.     private static $password = '';
    8.  
    9.     static public function connect() {
    10.         if (self::$db === null) {
    11.             self::$db = new PDO("mysql:host=".self::$host.";dbname=".self::$dbname.";charset=".self::$charset,
    12.             self::$username, self::$password);
    13.         }
    14.          return static::$db;
    15.     }
    16.  
    17. }
     
  6. ubunta2

    ubunta2 Зэк
    [ БАН ]

    С нами с:
    27 июн 2017
    Сообщения:
    947
    Симпатии:
    28
    Код (Text):
    1. # подключаемся к базе данных
    2. try {
    3.   $DBH = new PDO("mysql:host=$host;dbname=$dbname", $user, $pass);
    4.   $DBH->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
    5.  
    6.   # Черт! Набрал DELECT вместо SELECT!
    7.   $DBH->prepare('DELECT name FROM people')->execute();
    8. }
    9. catch(PDOException $e) {
    10.     echo "Хьюстон, у нас проблемы.";
    11.     file_put_contents('PDOErrors.txt', $e->getMessage(), FILE_APPEND);
    12. }
     
  7. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    Зачем добавил еще static в для private переменных, ты еще где то собираешься их вызывать? Для $db понятно можно указать static)))
     
  8. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.199
    Симпатии:
    184
    _ne_scaju_ нравится это.
  9. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    Лучше с мануала взять, и потом под себя делать его!
    PHP:
    1. <?php
    2. define('DB_HOST', 'localhost');
    3. define('DB_NAME', 'test');
    4. define('DB_USER', 'root');
    5. define('DB_PASS', '');
    6. define('DB_CHAR', 'utf8');
    7.  
    8. class DB
    9. {
    10.     protected static $instance = null;
    11.  
    12.     public static function instance()
    13.     {
    14.         if (self::$instance === null)
    15.         {
    16.             $opt  = array(
    17.                 PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
    18.                 PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
    19.                 PDO::ATTR_EMULATE_PREPARES   => TRUE,
    20.             );
    21.             $dsn = 'mysql:host='.DB_HOST.';dbname='.DB_NAME.';charset='.DB_CHAR;
    22.             self::$instance = new PDO($dsn, DB_USER, DB_PASS, $opt);
    23.         }
    24.         return self::$instance;
    25.     }
    26.    
    27.     public static function __callStatic($method, $args)
    28.     {
    29.         return call_user_func_array(array(self::instance(), $method), $args);
    30.     }
    31.  
    32.     public static function run($sql, $args = [])
    33.     {
    34.         $stmt = self::instance()->prepare($sql);
    35.         $stmt->execute($args);
    36.         return $stmt;
    37.     }
    38. }
     
  10. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.199
    Симпатии:
    184
    @_ne_scaju_с какого мануала?
     
  11. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    Тебе что реально дать ссылку на мануал, давай сам пропиши посмотри что там находится :)
     
  12. SamyRed

    SamyRed Старожил

    С нами с:
    23 июл 2015
    Сообщения:
    1.196
    Симпатии:
    111
    Адрес:
    Украина
    Зачем ты такое советуешь? С мануала ллюбой дурак может. Желательно разобраться и в итоге сможешь сам написать, не ища всякие там мануалы. В мануал можно подсмотреть для понимания логики, если совсем туго.
     
  13. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.734
    Симпатии:
    1.315
    Адрес:
    Лень