@lexstile

Как мне работать с классом БД в любом файле?

Есть небольшой класс (file: db.php):
spoiler
class Db {

	protected $db;
	
	public function __construct() {
		$config = require 'config.php';
		$this->db = new PDO('mysql:host='.$config['host'].';charset=utf8;dbname='.$config['name'].'', $config['user'], $config['password']);
	}

	public function query($sql, $params = []) {
		echo '<pre>' . print_r($sql,true) . '</pre>';
		exit;
		$stmt = $this->db->prepare($sql);
		if (!empty($params)) {
			foreach ($params as $key => $val) {
				if (is_int($val)) {
					$type = PDO::PARAM_INT;
				} else {
					$type = PDO::PARAM_STR;
				}
				$stmt->bindValue(':'.$key, $val, $type);
			}
		}
		$stmt->execute();
		return $stmt;
	}

	public function row($sql, $params = []) {
		$result = $this->query($sql, $params);
		return $result->fetchAll(PDO::FETCH_ASSOC);
	}

	public function column($sql, $params = []) {
		$result = $this->query($sql, $params);
		return $result->fetchColumn();
	}

	public function lastInsertId() {
		return $this->db->lastInsertId();
	}

}

Я пробую подключить в своем файле (не работает):
spoiler
include 'Db.php';

$DB = new Db;

addUser(123, 111111111);

function addUser($user_id, $date) {
	$params = [
		'user_id' => $user_id,
		'date' => $date,
	];
	$DB->query('INSERT INTO users (user_id, date) VALUES (:name, :date)', $params);
	return $DB->lastInsertId();
}


Ошибка: Fatal error: Uncaught Error: Call to a member function query() on null
  • Вопрос задан
  • 105 просмотров
Решения вопроса 1
FanatPHP
@FanatPHP
Чебуратор тега РНР
Задумка хорошая, но реализация не очень.

Начнем с того, что это очень нелогичный класс.
Как им вообще пользоваться, если функция row() возвращает не одну строку, а все?
В классе куча лишнего кода, но при этом 90% функциональности ПДО в нем просто недоступно

Класс надо переписать хотя бы так:

class Db {
    public $db;
 
    public function __construct() {
        $config = require __DIR__.'/config.php'; 
        $options = [
            PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
            PDO::ATTR_EMULATE_PREPARES   => false,
        ];
        $dsn = 'mysql:host='.$config['host'].';charset=utf8;dbname='.$config['name'];
        $this->db = new PDO($dsn, $config['user'], $config['password'], $options);
    }
    public function query($sql, $params = []) {
        $stmt = $this->db->prepare($sql);
        $stmt->execute($params);
        return $stmt;
    }
    public function cell($sql, $params = []) {
        return $this->query($sql, $params)->fetchColumn();
    }
    public function row($sql, $params = [], $mode=PDO::FETCH_ASSOC) {
        return $this->query($sql, $params)->fetch($mode);
    }
    public function all($sql, $params = [], $mode=PDO::FETCH_ASSOC) {
        return $this->query($sql, $params)->fetchAll($mode);
    }
    public function column($sql, $params = []) {
        return $this->query($sql, $params)->fetchAll(PDO::FETCH_COLUMN);
    }
    public function lastInsertId() {
       return $this->db->lastInsertId();
    }
}

после того как ВЕСЬ функционал PDO будет добавлен, можно будет сделать db обратно приватной. А до те х пор вызывать через неё недостающие функции ПДО.

А подключать объект этого класса проще пареной репы: просто предать в функцию

include 'Db.php';
$db = new Db;

addUser($db, 123, 111111111);

function addUser($db, $user_id, $date) {
  $params = [
    'user_id' => $user_id,
    'date' => $date,
  ];
  $db->query('INSERT INTO users (user_id, date) VALUES (:name, :date)', $params);
  return $db->lastInsertId();
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@constintmid
Laravel vue.js
делай require 'Db.php'
и делай new Db()
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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