Я новичок в 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;
}
}
?>






Прежде всего, я бы предложил вам несколько документов:
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.nameAScategory_name
это называется псевдонимом, независимо от того, находится ли он в столбце или таблице, после того, как вы его alias, вы можете использовать псевдоним в любом месте вашего запроса вместо фактического имени.
INNER JOIN
categoriesAScON (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();
}
}
Это похоже на лоты вопросов, объединенных в один, в основном спрашивающих, правильно ли вы все делаете (вместо того, чтобы пытаться исправить одну сломанную вещь) ... на самом деле это может быть лучше для codereview.stackexchange.com