Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Проблема с выводом контента в MVC


Автор: parnasmi 13.4.2013, 17:28
Всем привет. Я - новичок, к тому же чайник smile  Изучаю азы PHP по курсу 3х летный давности PHP: объектно-ориентированный подход(от K0stix). остановился на 9-м уроке где vmenu.php и vcontent.php инклудиться в index.php  Вот так:

Код

        require_once "config/config.php";
    require_once "views/vmenu.php";
    require_once "views/vcontent.php";

Тут и начинается проблема. Менюшки выводятся , а вот с контентом беда
http://s1.ipicture.ru/Gallery/Viewfull/23971167.html

Надпись вывода "There is problem with ID " прописано в моделе mcontent.php в случае отсуствие id Думаю вот тут причина ошибки. Вот 
содержимое mcontent.php:

Код

    require_once $_SERVER['DOCUMENT_ROOT']. "/config/db.php";
    //require_once 'Z:/home/kostix.uz/www/config/db.php';
    
    Class Mcontent extends Db{
        function return_content($id = NULL){
            $sql = "SELECT description, keywords, title, content, created, lastmod 
            FROM pages WHERE id = {$id} and visible = '1' LIMIT 1";
            if(!$id){
            die("There is problem with ID " . mysql_error());
            //$sql = "SELECT content FROM pages ORDER BY position ASC limit 1";
        }
            $result = $this -> sql($sql);
            return $result;
        }
    }
     


Если уберем

Код


if(!$id){
            die("There is problem with ID " . mysql_error());
            //$sql = "SELECT content FROM pages ORDER BY position ASC limit 1";
        }

Выводиться это:
http://s1.ipicture.ru/Gallery/Viewfull/23971667.html

Если набирать сам vcontent.php на браузере(http://kostix.loc/views/vcontent.php):

Ошибка:


Database query failed:You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'and visible = '1' LIMIT 1' at line 2


С id(http://kostix.loc/views/vcontent.php?id=1(или 2)) контент уже нормально выводиться.

Содержимое vcontent.php

Код

require_once $_SERVER['DOCUMENT_ROOT'] . "/controllers/ccontent.php";
    //require_once "../controllers/ccontent.php";
    
    $id = $_GET['id'];
    $vcontent = new Ccontent();
    echo $vcontent -> print_content($id);


 Что странно в скринкасте у самого K0stix а все нормально работает. Тоесть при нажатие на менюшки по id выводяться соотвествующие контенты.
Хотя, преверил код на последном уроке где мы писали эти меню и контент. Все идентичны. Кажеться после записи он что-то переделал, но забыл это объеснить на следуюшем уроке.

Дальше привожу все php файлы:

ccontent.php

Код

 require_once $_SERVER['DOCUMENT_ROOT']. "/models/mcontent.php";
    //require_once "Z:/home/kostix.uz/www/models/mcontent.php";
    
    Class Ccontent extends Mcontent{
        function print_content($id){
            //settype($id, 'integer');
            $res = $this -> return_content($id);
            $row = mysql_fetch_assoc($res);// массив
            //$page = array();
            //foreach($row as $key => $value){
        //        $page[$key] = $value;}
        //    return $page;
            $val = $row['content'];            
            //$this -> k_debug($row);
            return $val;
            
            
        }
    }
    
    //$obj = new Ccontent();
    //$obj -> print_content();


mmenu.php

Код

  require_once $_SERVER['DOCUMENT_ROOT']. "/config/db.php";
    //require_once "Z:/home/kostix.uz/www/config/db.php";
    class Mmenu extends Db{
        function return_menu(){
            $sql = "select id, menu_name from pages";
            $res = $this -> sql($sql);
            return $res;
        }
        
    }



cmenu.php

Код

    require_once $_SERVER['DOCUMENT_ROOT']. "/models/mmenu.php";
//    require_once "Z:/home/kostix.uz/www/models/mmenu.php";
    class Cmenu extends Mmenu{
        function print_menu(){
            $res = $this -> return_menu();// возвращаем ссылку на резултат запроса.
            while($row = mysql_fetch_array($res)){
            //$this -> k_debug($row); Просто для дебаггинга
             $mname[$row['id']] = $row['menu_name'];//Забиваем в массив результат заявки
            }
            return $mname;
            
        }
    }
    
$aux_vmenu = new Cmenu();
$vmenu = $aux_vmenu -> print_menu();



vmenu.php

Код

     require_once $_SERVER['DOCUMENT_ROOT']. "/controllers/cmenu.php";
    //require_once "../controllers/cmenu.php";
    
    echo '<ul>';
    foreach($vmenu as $uri => $link){
        echo "<li><a href = '?id = {$uri}'>{$link}</a></li>";
        //echo "<li><a href = '?id = {$uri}'>{$link}</a></li>";
            }
    echo '</ul>';


Пожалуйста, покажите "таракана", где мог ошибиться. И, как делать так, чтобы контенты при нажатие на ссылки меню выводились по очереди.Заранее спасибо за помощь.

Автор: Sanchezzz 13.4.2013, 17:42
Ошибка в SQL запросе  для mysql  пхшный NULL не совсем NULL для мускула иначе говоря нужно было его передать как строку примерно так 
Код

"WHERE ". (is_null($id) ? 'null' : $id ). " AND ";

Автор: baLamooot 13.4.2013, 17:43
Не ясно, где тут MVC, какая-то странная мешанина. Вроде есть что-то, что автор курса считает моделью, контроллером и видом, но чтобы контроллер наследовал модель а get-параметры принимались видом - попахивает клиникой smile

По вопросу. В общем случае если $_GET['id'] не определен или равен нулю (т.е. vcontent.php?id=0 или просто vcontent.php без id), то будет выводиться эта ошибка, поскольку следующие условия срабатывают всегда
Код

if (! '0') { /* код сработает*/}
if (! 0) { /* код сработает*/}
if (! NULL) { /* код сработает*/}


В остальном хорошо бы проверять вообще наличие ключа id у $_GET массива, в случае присутствия приводить к ожидаемому типу (в данном случае к int), а в случае отсутствия заменять своим значением. Если не проверять наличие ключа, при настройке ошибок E_ALL будет еще больше ошибок (верней нотисов). Вообще странно, что расчитанный на девелоперсий инвайронмент Денвер имеет такие щадящие настройки ошибок.

Судя по коду, курс ничему путному не учит. Первый же sql-запрос шлет приветы инъекциям

Автор: parnasmi 14.4.2013, 05:28
Всем спасибо. Сейчас попробую переделать. Отпишусь.

Автор: parnasmi 14.4.2013, 14:16
To Sanchezzz, baLamooot, спасибо за помощь и наводки  , но, к сожалению таки не смог решит проблему. Нашёл исходные файлы автора.  Покопаюсь там, можно кое - что найду.

Автор: baLamooot 15.4.2013, 01:02
parnasmi, в классе Mcontent поменяйте декларацию метода 
Код

function return_content($id = NULL)
 на 
Код

function return_content($id = 'null')

Обе указанные ошибки должны исчезнуть.

Автор: parnasmi 15.4.2013, 09:30
Цитата(baLamooot @ 15.4.2013,  01:02)
parnasmi, в классе Mcontent поменяйте декларацию метода 
Код

function return_content($id = NULL)
 на 
Код

function return_content($id = 'null')

Обе указанные ошибки должны исчезнуть.

Спасибо. Вероятно, проблема не в 'null' . Результат тот же и в NULL и в 'null'. Различие кодов у автора и моего не много.  все равно все переделал как у автора. Но все равно у меня контента не выводиться. Выводятся только если прописать полный путь до id. При нажатии на ссылки меню ничего не происходить. Домен на локалке - kostix.loc. Вот что выходит через index.php
http://s2.ipicture.ru/Gallery/Viewfull/24030909.html

Вывод надпись а "Привет. Это, я, таракан." происходить автоматически если при выводе vcontent.php не сушествует id. Вот что происходит при нажатии на ссылки меню

http://s1.ipicture.ru/Gallery/Viewfull/24031114.html

Почему при нажатии на ссылки в адресном строке появляються "http://kostix.loc/?id%20=%201" а не "http://kostix.loc/?id=1"? Вот и мучаюсь. Как переделать так чтобы через меню выводились соответствующие контенты из базы? Исходники прикрепил на всякий случай.

Автор: parnasmi 19.4.2013, 21:29
Проблема решена. Тему можно закрыт. Ошибка был в синтаксисе PHP. И ешё кое-где. Всем спасибо.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)