PHP - передача аргументов моим методам запросов к БД с использованием PDO

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

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

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

-Должен ли я поместить каждый из методов, которые я создаю, в предложение try cath, будет ли это полезно для меня или мои if-elses помогут?

-А я правильно выполняю привязку параметров? или я должен указать thir аргумент, который, по моему мнению, является типом, которого я должен ожидать от переменной, но что, если введенная переменная отличается от ожидаемого типа?

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

Таблица категорий

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;
        }


    }

?>

Это похоже на лоты вопросов, объединенных в один, в основном спрашивающих, правильно ли вы все делаете (вместо того, чтобы пытаться исправить одну сломанную вещь) ... на самом деле это может быть лучше для codereview.stackexchange.com

CD001 09.03.2018 15:16
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
2
1
64
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Прежде всего, я бы предложил вам несколько документов:

PHP ООП: http://php.net/manual/en/language.oop5.php

PHP PDO: http://php.net/manual/en/class.pdo.php

На данный момент вы не используете ($ limit, $ category, $ order). Чтобы сделать их необязательными, вы должны указать значение по умолчанию в объявлении функции:

public function getArticlesAdv($limit = 10, $category = null, $order = 'articles.id'){

самого порядка недостаточно (порядок ... ASC / DESC), поэтому я бы изменил вашу функцию с помощью:

public function getArticlesAdv($limit = 10, $category = null, $order = 'articles.id', $orderType = 'asc'){

как только вы его измените, вам нужно создать правильный оператор SQL:

 $where = "";
 if ($category){
    $where = " where categoryID = $category ";
  }

  $sql = "SELECT a.*,c*
          FROM articles a join categories c on a.categoryID = c.id 
          $where              
          ORDER BY $order $orderType $limit";

Я поставил а. *, с. *, потому что иначе вы получите ошибку двусмысленности (то же самое для лимита)

Это лишь ОДИН из многих способов сделать это.

Надеюсь, это поможет.

Ответ принят как подходящий

Ответы I-III: в зависимости от того, что ваш PDO::ATTR_ERRMODE установлен на PDO::ERRMODE_EXCEPTION, вам может потребоваться поставить try catch или просто проверить PDO::errorCode()подробнее об обработке ошибок pdo, и что касается результата на отсутствие каких-либо параметров, PDO::ATTR_ERRMODE решит, что вы получите за него, будь то исключение или нулевой набор или ноль.

Ответ II: для сбора данных из 2 или более таблиц вы можете использовать присоединяется. пример для вас таблиц может быть:

SELECT `a`.`title`, `c`.`name` AS `category_name` FROM `articles` AS `a` INNER JOIN `categories` AS `c` ON (`a`.`categoryId` = `c`.`id`);

c.name AS category_name

это называется псевдонимом, независимо от того, находится ли он в столбце или таблице, после того, как вы его alias, вы можете использовать псевдоним в любом месте вашего запроса вместо фактического имени.

INNER JOIN categories AS c ON (a.categoryId = c.id)

это означает получение соответствующих данных из таблицы categories, которая имеет псевдоним c, где столбец categoryId из таблицы articles равен столбцу id из таблицы categories.

Ответ IV: в зависимости от того, включили ли вы строгий режим для своего сервера mysql, отказ от использования третьего параметра (по умолчанию PDO::PARAM_STR) в столбце int приведет к ошибке. Даже если у вас не установлен строгий режим, но вы отправили неправильный тип объявления типа переменной, например отправку '1' (PDO::PARAM_STR) в столбце int вместо 1 (PDO::PARAM_INT), и если у вас есть индекс в этом столбце, ваш запрос не будет использовать индекс, что приведет к снижению производительности.

Мне не удалось увидеть какую-либо привязку в вашем коде, но помните, что в PDO доступны 3 типа привязки: bindColumn, bindParam и bindValue.

Я приведу пример с bindValue, так как разница между ними или типами стилей использования вне этого контекста.

public function getArticlesAdv($limit, $category, $order){
    $sql = "SELECT * FROM articles WHERE `categoryId` = :category ORDER BY ";
    switch($order) {
       case 'categoryId':
           $sql . = "categoryId";
           break;
       case 'visible':
           $sql . = "categoryId";
           break;
       default:
           $sql . = "id";
           break;
    }
    $sql .= ' DESC LIMIT 0,:limit';

    $this->db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    try {
        $stmt = $this->db->prepare($sql);
        $stmt->bindValue($category,':category',PDO::PARAM_INT);
        $stmt->bindValue($limit,':limit',PDO::PARAM_INT);
        $stmt->execute();
        $resultSet = $stmt->fetchAll(PDO::FETCH_OBJ);
        if ($resultSet) return $resultSet;
        return array();
     catch(Exception $ex) {
        return array();
     }
}

Другие вопросы по теме