Поэтому я собираюсь научиться создавать собственные классы DB, используя PDO. Я довольно новичок в PDO и более сложном развитии класса и хотел получить небольшое руководство от сообщества, прежде чем я заберусь с ним слишком далеко. У меня есть класс, частично построенный, но я знаю, что для этого должен быть лучший / более логичный способ.
Я бы очень хотел, чтобы у меня был единственный метод запроса, поэтому я мог бы на нем что-то нарисовать в моем классе DB. Если это ошибочное мышление, пожалуйста, дайте мне знать, почему.
В настоящее время у меня есть файл config.php с определенными константами DB и класс под названием DB. Вот мой код:
В index.php:
require_once 'config.php'; require_once '_inc/class.db.php'; $db = new DB();
И мой класс:
public $dbh; public function __construct(){ $dbh = new PDO('mysql:host='.DB_HOST.';dbname='.DB_NAME, DB_USER, DB_PASSWORD); }//end __construct public function build_query( $args ){ $defaults = array( 'type' => 'SELECT', 'fields' => '*', 'table' => '', 'where' => '', 'orderby' => 'id', 'order' => 'DESC' 'offset' => '0', 'limit' => '' ); $params = array_merge( $defaults, $args ); $sql = $params['type']; $sql .= ' '.$params['fields'].' FROM '.$params['table']; if( $params['where'] ) $sql .= ' WHERE '.$params['where']; $sql .= ' ORDER BY '$params['orderby'].' '.$params['order']; if( $limit ) $sql .= ' LIMIT '.$params['offset'].', '.$params['offset']; return $sql; }//end build_query public function dbq( $args ){ $sql = $this->build_query( $args ); $this->$dbh->prepare( $sql ); return $this->$dbh->execute();
Я знаю, что здесь что-то не хватает. Пожалуйста, просто подталкивайте меня в правильном направлении, поскольку я действительно хочу научиться этому, чтобы стать лучшим разработчиком PHP. Я немного искал использование одноэлементного паттерна, но хотел получить немного больше информации от людей, которые действительно знают, как все это работает и подходит друг к другу.
Заранее спасибо!
Если я правильно прочитал ваш вопрос, вы ищете так называемый Query-Builder. Конструктор запросов – это класс, который имеет некоторые параметры и который может возвращать запрос на основе параметров.
На самом деле это не нуждается ни в чем больше и не что иное, если пример, который у вас есть, – это то, что вам нужно. Вам нужно только поместить это в свой класс, потому что остальная часть уровня базы данных имеет другие функции.
Затем вы можете передать объект Query туда, где он принадлежит. Обычно вы используете это внутри в каком-то классе. Таким образом, вы на самом деле не спрашиваете о создании общего класса бота DB (который был бы запахом btw), но вы просто хотите, чтобы SQL Query String Builder был включен в собственный класс:
/** * SQL Query */ class SqlQuery { public $type = 'SELECT', $fields = '*', $table, $where, $orderby = 'id', $order = 'DESC', $offset, $limit; /** * @return string */ public function getQuery() { $sql = sprintf('%s %s FROM %s', $this->type, $this->fields, $this->table); $this->where && $sql .= sprintf(' WHERE %s', $this->where) ; $sql .= sprintf(' ORDER BY %s %s', $this->orderby, $this->order); $this->limit && $sql .= sprintf(' LIMIT %s, %s', $this->offset, $this->limit) ; $sql .= ';'; ### not strictly necessary but nice for debugging ### return $sql; } public function __toString() { return $this->getQuery(); } } ### Usage: ### $query = new SqlQuery; $query->table = 'TABLE1'; echo $query; // SELECT * FROM TABLE1 ORDER BY id DESC;
Этот пример фактически охватывает все, что у вас есть до сих пор, но дает ему определенный интерфейс. Таким образом, у вас есть значения свойств по умолчанию, и у вас есть функция построения. Затем вы можете передать этот SqlQuery
где он вам нужен.