За последние 24 часа нас посетили 16557 программистов и 1578 роботов. Сейчас ищут 1023 программиста ...

Проблема с запросом pdo

Тема в разделе "PHP для новичков", создана пользователем Magnum, 9 окт 2016.

  1. Magnum

    Magnum Активный пользователь

    С нами с:
    19 июл 2015
    Сообщения:
    62
    Симпатии:
    0
    Здравствуйте мастера.
    Вот пытаюсь перейти на пдо, и ооп, но пока что попытки тщетны(Подскажите пожалуйста, что тут не так?

    Мой класс подключения к бд
    PHP:
    1. class DB {
    2.     private $dsn;
    3.     private $opt = array();
    4.     static public $pdo;
    5.  
    6.     function __construct() {
    7.         $this->dsn = "mysql:host=".DB_SERVER.";dbname=".DB_NAME.";charset='UTF8'";
    8.         $this->opt = array(
    9.             PDO::ATTR_ERRMODE               => PDO::ERRMODE_EXCEPTION,
    10.             PDO::ATTR_DEFAULT_FETCH_MODE    => PDO::FETCH_ASSOC
    11.         );
    12.         self::$pdo = new PDO($this->dsn, DB_USER, DB_PASS, $this->opt);
    13.     }
    14. }
    А вот сам файл, где пытаюсь сделать запрос:

    PHP:
    1. <?php
    2.  
    3. include '../includes/db_connects.php';
    4.  
    5. DB::$pdo->query("SELECT COUNT(id) FROM `users`")->fetchColumn();
    6.  
    7. ?>
    Но получаю ошибку:
    "Fatal error: Call to a member function query() on a non-object in C:\OpenServer\domains\oop\public\index.php on line 8"

    Помогите пожалуйста(
     
  2. Magnum

    Magnum Активный пользователь

    С нами с:
    19 июл 2015
    Сообщения:
    62
    Симпатии:
    0
    PHP:
    1. include 'config.php';
    2. Вот так работает:
    3.  
    4. class DB {
    5.     private $dsn;
    6.     private $opt = array();
    7.     private $pdo;
    8.  
    9.     function db_connect() {
    10.         $this->dsn = "mysql:host=".DB_SERVER.";dbname=".DB_NAME.";charset='UTF8'";
    11.         $this->opt = array(
    12.             PDO::ATTR_ERRMODE               => PDO::ERRMODE_EXCEPTION,
    13.             PDO::ATTR_DEFAULT_FETCH_MODE    => PDO::FETCH_ASSOC
    14.         );
    15.         return $this->pdo = new PDO($this->dsn, DB_USER, DB_PASS, $this->opt);
    16.     }
    17. }
    потом просто создаю объект с подключением к бд отдельно, так нормально? Или можно, в __construct() запихнуть вызов метода db_connect (не получилось так)
     
  3. Abyss

    Abyss Старожил

    С нами с:
    12 дек 2015
    Сообщения:
    1.298
    Симпатии:
    218
    Адрес:
    Default city
    В первом случае вы используете статическую переменную для хранения подключения, но само подключение происходит при инициализации объекта, которую вы не делаете. Что происходит во втором случае я не знаю.
     
  4. Magnum

    Magnum Активный пользователь

    С нами с:
    19 июл 2015
    Сообщения:
    62
    Симпатии:
    0
    Во втором случае, просто создаю объект с подключением.

    $connect = new DB();
    $db = $connect->db_connect();
     
  5. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Первый случай - жесть. Вы не разобрались, что такое конструкторы, статические поля, не статические поля. Во-втором - ну можно и в конструктор, да
     
    denis01 нравится это.
  6. Magnum

    Magnum Активный пользователь

    С нами с:
    19 июл 2015
    Сообщения:
    62
    Симпатии:
    0
    ну конструктор, это метод, который выполняется сразу же после инициализации объекта. Статический метод - метод, который можно вызывать без создания экземпляра класса, это я понял.
    Не совсем пока ясно, что куда рационально применять, но всё же, начинаю вникать
     
  7. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Причём здесь статический метод, если у вас статическое поле.