Сбор статей из базы данных статьи


Я новичок в PHP и ООП и методов строительства в целях получения статьи из базы данных статьи. Мой метод принимает три параметра: $limit, $category, $order. Я думаю, что это нуждается в пояснениях, однако, у меня есть несколько вопросов:

  • Что произойдет, если один из аргументов не хватает? Будет метод возвращает false? Как я могу избежать этого?
  • Я не знаю, как собрать атрибутами из двух связанных таблиц, то есть каждая статья относится к категории.
  • Я должен поставить каждый из методов я строю внутри try-catch пункт? Это будет полезно для меня или моей if-elseы делать трюк?
  • Я делаю правильно обязательный параметр, или я должен указать третий аргумент, который я думаю, это типа я должен быть ожидаем переменную? Что делать, если ВАР представил, отличается от ожидаемого типа?

Вот мои связанные таблицы. Я думаю, что я правильно их отношений.

Статьи таблицу:

CREATE TABLE articles
(
  id                     SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,  -- Each article unique identifier:
  categoryId             SMALLINT UNSIGNED NOT NULL,                 -- The artcle category id:
  image                  VARCHAR(255) NULL DEFAULT 'images/img_default_article.jpg',                      -- Main image of the article:
  title                  TEXT NOT NULL,                              -- Full title of the article:
  summary                TEXT NOT NULL,                              -- The summary of the article:
  content                MEDIUMTEXT NOT NULL,                        -- The HTML content of the article:
  created                DATE NOT NULL,                              -- Day and Month the article entry was created
  modified               TIMESTAMP  NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, --Timestamp the article was last edited
  visible                INT(11) NOT NULL,                           -- 1 - Visible, 0 - Not visible:


  PRIMARY KEY     (id)
  FOREIGN KEY     (categoryId) REFERENCES categories(id) ON UPDATE CASCADE ON DELETE CASCADE
)

ENGINE=innoDB DEFAULT CHARSET=utf8 COMMENT='all the articles available';

Категории таблица:

CREATE TABLE categories
(
  id              SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,         -- Category unique identifier
  image           TEXT NOT NULL DEFAULT "images/img_default_category.jpg",    -- Image of the article
  name            VARCHAR(255) NOT NULL,                             -- Name of the category:
  description     TEXT NOT NULL,                                     -- A short description of the category:

  PRIMARY KEY     (id)
)

ENGINE=innoDB DEFAULT CHARSET=utf8 COMMENT="Categories for all th articles";

PHP код:

<?php
class Article extends BaseEntity{
    private $id, $categoryid, $author, $image, $title, $summary, $content, $created, $modified, $visible;

    public function __construct($adapter) {
        $table="articles";
        parent::__construct($table, $adapter);
    }



    public function getArticlesAdv($limit, $category, $order){
        $sql = "SELECT *
                FROM articles
                ORDER BY created DESC";

        $stmt = $this->db->prepare($sql);
        $stmt->execute();
        if($stmt->execute()){

            $numrows = $stmt->rowCount();
            if(numrows>0){

                while ($row = $query->fetchAll(PDO::FETCH_OBJ))
                {
                $resultSet[]=$row;
                }
                return $resultSet;

            }
            else
            {   
            return false;
            }   
        }

        else
        {
        return false;   
        }
    }

    public function getAllArticles(){
        $sql = "SELECT *
                FROM articles
                ORDER BY created DESC";

        $stmt = $this->db->prepare($sql);

        $stmt->execute();

        $numrows = $stmt->rowCount();

        if(numrows>0){

        while ($row = $query->fetchAll(PDO::FETCH_OBJ)) {
           $resultSet[]=$row;
        }

        return $resultSet;

        }
        else{
            return false;
        }


    }

?>


125
2
задан 9 марта 2018 в 03:03 Источник Поделиться
Комментарии
1 ответ


Что произойдет, если один из аргументов не хватает? Будет метод возвращает false? Как я могу избежать этого?

Вы должны добавить значение по умолчанию аргумента. Это делает его проще и понятнее в использовании.

public function getArticlesAdv($category, $limit = 15, $order = 'desc')

Вы могли бы также рассмотреть позиции аргументов. Е. Г. что не менее важно?

Это позволит вам позвонить getArticlesAdv($id); или getArticlesAdv($id, 100) без сучка и задоринки.


Я не знаю, как собрать атрибутами из двух связанных таблиц, то есть каждая статья относится к категории.

Поправьте меня, если я ошибаюсь, но разве это не связанные с базой данных запросов? Вы можете смотреть в присоединяйтесь к отчетности.


Я должен поставить каждый из методов я строю внутри попробовать-поймать положение? Это будет полезно для меня или моей, если надо делать трюк?

Я действительно считаю, что вам нужно, чтобы аннотация Вашего getArticlesAdv() функции намного больше. Это делает слишком много. Либо использование конструкции try-catch или если-Либо, вы будете в конечном итоге с большим функции, содержащей множество условий. Это очень трудно потом поддерживать.

Я объясню этот момент в конце моего ответа.


Я делаю правильно обязательный параметр, или я должен указать третий аргумент, который я думаю, это типа я должен быть ожидаем переменную? Что делать, если ВАР представил, отличается от ожидаемого типа?

Я не вижу никакой привязки параметров. В $sql заявление обоих одинаковы для getArticlesAdv() и getAllArticles(). Хотя да, это рискованно и как всегда говорю, никогда не доверяйте ввод данных пользователем.


Что вы должны по сути, это понятие 'конструктор запросов' происходит. Google об этом и попытаемся реализовать таким образом, что вы можете сделать:

$articles = Article::orderBy('desc')->limit(15)->get();

Это называется методом сцепления и помогает довольно много.

Вот попытка:

<?php

class Article extends BaseEntity
{

private $id,
$categoryid,
$author,
$image,
$title,
$summary,
$content,
$created,
$modified,
$visible;

protected $limit;

protected $orderByColumn;

protected $direction;

public function __construct($adapter)
{
$table = "articles";

parent::__construct($table, $adapter);
}

public function limit(int $limit)
{
$this->limit = $limit;

/*
* We return $this so we can method-chain.
* E.g. Article::limit(15)->get();
*
*/

return $this;
}

public function orderBy($columnName = 'created', $direction = 'desc')
{
$this->orderByColumn = $columnName;
$this->direction = $direction;

return $this;
}

public function get()
{
/**
* TODO: Now, you can build your final db query
* based on this class' vars $limit, $direction
* $orderByColumn and whatever else you may
* think is necessary.
*
* Finally, wrap up everything here.
*/

$sql = "SELECT *
FROM " . $this->table . "
ORDER BY " . $this->orderByColumn . "DESC";

// TODO: Bind the variables to protect against SQL injection since
// $this->orderByColumn could come from a user input.

$stmt = $this->db->prepare($sql);
$stmt->execute();
if($stmt->execute()) {

$numrows = $stmt->rowCount();
if(numrows>0){

while ($row = $query->fetchAll(PDO::FETCH_OBJ))
{
$resultSet[] = $row;
}

return $resultSet;

} else {
return false;
}
} else {
return false;
}
}

Вы можете иметь множество функций, таких как with('categories') что вы можете цепи.

В качестве последнего замечания, я заметил, что вы сделали по умолчанию изображения в статье ссылку на шаблон изображения. Я не советовал, потому что он имеет дело с базой данных напрямую, а не в вашем коде, вы должны пытаться вставить изображение по умолчанию при создании новых статей, вместо того, на уровне базы данных, чтобы справиться с ней.

Таким образом, вы можете изменить имя изображения по умолчанию без хлопот.

Что совет может быть применен как правило, когда дело доходит до значений по умолчанию для базы данных.

1
ответ дан 10 марта 2018 в 01:03 Источник Поделиться