За последние 24 часа нас посетили 56411 программистов и 1683 робота. Сейчас ищут 1311 программистов ...

Помогите побороть Call to a member function exec() on a non-

Тема в разделе "PHP и базы данных", создана пользователем TigerZaka, 26 июл 2013.

  1. TigerZaka

    TigerZaka Активный пользователь

    С нами с:
    16 сен 2011
    Сообщения:
    189
    Симпатии:
    1
    Не получается вывести новости из БД, подскажите, что не так делаю, совсем запутался
    есть у меня контроллер news.php:
    Код (Text):
    1. class News extends Controller {
    2. function __construct() {
    3. parent::__construct();
    4. }
    5. public function index($arg = false) {
    6. $this->view->render('news/index');
    7. }
    8. public function news_list($arg = false) {
    9. $model = new news_model();
    10. $this->view->news_list = $model->news_list($arg);
    11. self::index();
    12. }
    13. }
    есть модель news_model.php:
    Код (Text):
    1. class news_model extends Model {
    2. function __construct() {
    3. parent::__construct();
    4. }
    5. var $arg = '';
    6. var $dataNews;
    7.  
    8. public function news_list($arg) {
    9. $myID = $arg;
    10. $this->db->exec('USE myBase;');
    11. $this->db->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING );
    12.  
    13. if(isset($myID)) { //Если мы знаем ID новости
    14. $sth = $this->db->prepare("SELECT * FROM news WHERE id_news = :myID");
    15. $sth->execute(array(':myID' => $myID));
    16. }
    17. else { //Если мы не знаем ID новости
    18. $sth = $this->db->prepare("SELECT * FROM news");
    19. $sth->execute();
    20. }
    21. if($sth->rowCount() > 0) {
    22. $dataNews = $sth->fetchAll();
    23. $this->get_news_list($dataNews);
    24.  
    25. } else { header('location: ../../error'); }
    26. }
    27.  
    28. public static function get_news_list($dataNews) {
    29. foreach ($dataNews as $key => $value) {
    30. echo $value['title_news'];
    31. }
    32. }
    33. }
    И отображение :
    Код (Text):
    1. echo news_model::news_list();
    Не могу вывести $value['title_news'] в тело сайта, выводит ошибки:

    видимо я не до конца понимаю синтаксис? подскажите, что не так?
     
  2. shelestov

    shelestov Активный пользователь

    С нами с:
    25 авг 2011
    Сообщения:
    148
    Симпатии:
    0
    Адрес:
    Россия, Арзамас
    Re: Помогите побороть Call to a member function exec() on a

    Код (Text):
    1. echo news_model::news_list(null);
    Это по warning-у
     
  3. TigerZaka

    TigerZaka Активный пользователь

    С нами с:
    16 сен 2011
    Сообщения:
    189
    Симпатии:
    1
    Re: Помогите побороть Call to a member function exec() on a

    спасибо за коммент, а данный вариант это правильное решение или что-то типа "выключим все ошибки их не будет видно" ?
     
  4. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    у тебя же не static метод, про это и пишется ошибка! видимо правильно будет вызывать так:
    Код (PHP):
    1. $news = new news_model();
    2. echo $news->news_list(null);
    3.  
    можно было бы переписать метод на public static function, но тогда надо истребить все $this внутри него, т.к. у статика нет никакого $this, он может обращаться только к static методам и переменным класса.
    решай сам как быть.
     
  5. TigerZaka

    TigerZaka Активный пользователь

    С нами с:
    16 сен 2011
    Сообщения:
    189
    Симпатии:
    1
    Re: Помогите побороть Call to a member function exec() on a

    ок, можно передать значение аргумента, которое получает
    Код (Text):
    1. public function news_list($arg) {...}
    Код (Text):
    1. echo $news->news_list(сюда);
    ??
    может надо $arg сделать, типа глобальной переменной?
    -----------------------------
    сделал так в модели:
    Код (Text):
    1. public function news_list($arg) {
    2.         $GLOBALS['myID'] = $arg; // создаем суперглобальную переменную
    3.         $myID = $arg;
    4.         $this->db->exec('USE dskvrn_estate;'); //указываем активную базу данных
    и вызов делаю так:
    Код (Text):
    1. echo $news->news_list($GLOBALS['myID']);
    Что скажите, как такой подход?

    Добавлено спустя 21 минуту 21 секунду:
    Re: Помогите побороть Call to a member function exec() on a non-
    И еще момент. При выборке новостей, может быть три варианта:
    ID передан, новость есть
    ID передан, ID не существует, выводится ошибка
    ID не передан, выводим все новости

    Проверять наличие ID в базе, я так понимаю будем в модели. А вот проверять есть ли вообще ID, где лучше в контроллере или модели?
     
  6. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    Re: Помогите побороть Call to a member function exec() on a

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

    не усложняй. ты всё равно не чувствуешь где проводить разделительную черту, поэтому пофигу где. главное делай единообразно.
     
  7. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Re: Помогите побороть Call to a member function exec() on a

    А реестры в крупных сложносвязных не монолитных системах уже не используются? Это вот в интернете написано "globals - для дураков" и все так теперь говорят. Да, 9000 говнокодеров регулярно используют globals для создания var-помоек, которые в итоге перерастают в неконтролируемое жрущее память непредсказуемое убожие. Другие 9000 говнокодеров, дабы не быть лохами, не юзают globals - они делают статичные классы, которые по сути решуют ту же задачу - var-помойка. Однако ж не топор убил старушку, а Раскольников. Не вините инструменты за то, что балбесы не умеют их применять. Так, например, в интернете пишут, что PHP - язык для идиотов и школоло, просто потому что это один из немногих языков, доступных для освоения даже идиотам и школоло. Но знание синтаксиса и умение копипастить туторы не делает их программистами. А вы не становитесь идиотом. Так и глобальные переменные в любой реализации не являются калом.

    Есть хорошее правило - не делай [нужное вписать] ради [ранее вписанное]. Не надо делать MVC ради MVC. Паттерны - это не заповеди, а рекомендации по решению стандартных задач проектирования. Если в вашей ситуации вам нет острой нужды именно в MVC - не тратьте на это время.