2014-10-27 3 views
0

Я пытаюсь создать простой форум в архитектуре MVC.
Это мой настройка базы данных (соответствующая часть):

Таблица: forum_categories
Подготовленный отчет в PHP MVC

`forum_categories` (
`cat_id` INT(8) NOT NULL AUTO_INCREMENT, 
`cat_title` VARCHAR(255) NOT NULL, 
`cat_desc` TEXT NOT NULL, 
PRIMARY KEY (`cat_id`), 
UNIQUE KEY (`cat_title`) 

Таблица: forum_topics

`forum_topics` (
`topic_id` INT(8) NOT NULL AUTO_INCREMENT, 
`cat_id` INT(8) NOT NULL COMMENT 'foreign key with forum_categories table', 
`user_id` INT(11) NOT NULL COMMENT 'foreign key with users table', 
`topic_title` VARCHAR(255) NOT NULL, 
`topic_desc` TEXT NOT NULL, 
`topic_date` DATETIME DEFAULT NULL, 
PRIMARY KEY (`topic_id`), 
FOREIGN KEY (`cat_id`) REFERENCES forum_categories (`cat_id`) ON DELETE CASCADE ON UPDATE CASCADE 

Пример функциональности, я хотел бы для достижения:
Категория 1 имеет cat_id = 1
Категория 2 имеет cat_id = 2

Тема 1 имеет cat_id = 1
Тема 2 имеет cat_id = 2

Теперь, когда выбрана категория 1, я просто хочу тему 1, чтобы показать.
Если выбрана категория2, я просто хочу показать тему 2.

Это подготовленный оператор SQL добивается того, чтобы:

PREPARE stmnt FROM 
    'SELECT * 
    FROM forum_categories fc 
    JOIN forum_topics ft ON fc.cat_id = ft.cat_id 
    WHERE fc.cat_id = ? 
    ORDER BY ft.topic_date DESC'; 

SET @a = 1; 
EXECUTE stmnt USING @a; 


Мой Проблема: Я хотел бы переместить эту функцию в моей структуре PHP MVC.
Вот моя попытка, которая не работает (она показывает все темы во всех категориях).

Контроллер

/** 
* Show all the topics in the chosen category 
*/ 
public function showForumTopics() 
{ 
    $topic_model = $this->loadModel('Forum'); 
    $this->view->forum_topics = $topic_model->getForumTopics(); 
    $this->view->render('forum/viewTopics'); 
} 

Модель

/** 
* Gets an array that contains all the forum topics in the database. 
* Each array element is an object, containing a specific topic's data. 
* @return array All the forum topics 
*/ 
public function getForumTopics($cat_id) 
{ 
    $sql = 'SELECT * FROM forum_categories fc JOIN forum_topics ft ON fc.cat_id = ft.cat_id WHERE fc.cat_id = :cat_id ORDER BY ft.topic_date DESC'; 
    $query = $this->db->prepare($sql); 
    $query->execute(array(':cat_id' => $cat_id)); 

    return $query->fetchAll(); 
} 

Посмотреть

if ($this->forum_topics) { 
      foreach($this->forum_topics as $key => $value) { 
       echo '<p><strong>Title:</strong>' . $value->topic_title . '</p>'; 
       echo '<p><strong>Description:</strong> ' . $value->topic_desc . '</p>'; 
       echo '<p><strong>Author:</strong> ' . $value->topic_author . '</p>'; 
       echo '<p><strong>Date:</strong> ' . $value->topic_date . '</p>'; 
      } 
     } else { 
      echo 'No forum topics.'; 
     } 

Помощь будет высоко ценится! Спасибо!!

+0

ли $ cat_id имеют значение, которое вы ожидаете, что это? –

+0

Нет! Это моя проблема. Я хотел бы, чтобы значение $ cat_id было задано по какой категории я выбираю. – Schwesi

+0

Как вы изменяете '$ cat_id'? – Elias

ответ

0

Например, ваша страница http://example.com/?cat_id=2 Ваш код должен быть, как этот

контроллер

public function showForumTopics() 
{ 
    $default_category = 1; 
    $topic_model = $this->loadModel('Forum'); 
    $cat_id = isset($_GET['cat_id']) ? $_GET['cat_id'] : $default_category; 
    $this->view->forum_topics = $topic_model->getForumTopics($cat_id); 
    $this->view->render('forum/viewTopics'); 
} 

Модель

public function getForumTopics($cat_id) { 
    $sql = 'SELECT * FROM forum_categories fc JOIN forum_topics ft ON fc.cat_id = ft.cat_id WHERE fc.cat_id = :cat_id ORDER BY ft.topic_date DESC'; 
    $query = $this->db->prepare($sql); 
    $query->execute(array(':cat_id' => $cat_id)); 

    return $query->fetchAll(); } 

Посмотреть

if ($this->forum_topics) { 
      foreach($this->forum_topics as $key => $value) { 
       echo '<p><strong>Title:</strong>' . $value->topic_title . '</p>'; 
       echo '<p><strong>Description:</strong> ' . $value->topic_desc . '</p>'; 
       echo '<p><strong>Author:</strong> ' . $value->topic_author . '</p>'; 
       echo '<p><strong>Date:</strong> ' . $value->topic_date . '</p>'; 
      } 
     } else { 
      echo 'No forum topics.'; 
     } 
+0

Отлично! Спасибо! К сожалению, я не могу использовать URL (http://example.com/?cat_id=2), потому что я меняю его в файле .htaccess из-за структуры MVC (это будет http://example.com/forum/showForumTopics/независимо от идентификатора). Но это гораздо ближе к ответу, чем что-либо еще ... Спасибо за ваши усилия! – Schwesi

0

Ваша проблема заключается в том, что ваш бэкэнд требует и идентификатор, чтобы вытащить определенную категорию (и через соединение, правильную тему). В вашем DB Query вы ищете его здесь: WHERE fc.cat_id = ?

Функция getForumTopics($cat_id) также требует, чтобы идентификатор передавался в этот подготовленный оператор.Проблема в том, что вы не проходите какой-либо идентификатор в эту функцию при вызове его:

$this->view->forum_topics = $topic_model->getForumTopics();

Так без чего-либо, проходящего через, вашу функция теперь сломана и должна бросать ошибку. У вас есть два варианта на данный момент:

  1. Предоставлять идентификатор со страницы, через контроллер к вашей функции (подсказка, вы должны добавить его к URL, как @kringeltorte предложил, чтобы страница знает, что load!)
  2. Сделайте резервную копию, в которой перечислены все темы, если не выбрана какая-либо конкретная категория. Вы бы что-то вроде этого в определении функции:

    // Specifying the backup option null here, for when there is no ID passed 
    public function getForumTopics($cat_id = null) { 
    
        // Simple check for an ID 
        if ($id) { 
    
         // Run the code you had before 
         $sql = 'SELECT * FROM forum_categories fc JOIN forum_topics ft ON fc.cat_id = ft.cat_id WHERE fc.cat_id = :cat_id ORDER BY ft.topic_date DESC'; 
         $query = $this->db->prepare($sql); 
         $query->execute(array(':cat_id' => $cat_id)); 
    
         return $query->fetchAll(); } 
    
        } else { 
    
         // Otherwise, do the same thing as above but without a WHERE clause 
        } 
    
    } 
    
Смежные вопросы