За последние 24 часа нас посетили 16412 программистов и 1554 робота. Сейчас ищут 846 программистов ...

Вывод контента в переменную

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

  1. Racer

    Racer Новичок

    С нами с:
    8 дек 2013
    Сообщения:
    12
    Симпатии:
    0
    Здравствуйте, уважаемые!

    Сразу к делу. :)

    Задачи:
    1. Вывод контента в переменную и затем в шаблон.
    Более подробно:
    Есть список кратких новостей;
    Есть полные новости;
    Есть статичные страницы.

    Необходимо следующее:
    Если $_GET['option'] = statics, то в переменной $content выводится статичная страница (какая именно использую $_GET['statics'] (alians из mysql);
    Если $_GET['option'] пустая, то в переменной $content выводитя список новостей через цикл (тут проблема, опишу чуть ниже);
    Если $_GET['option'] пустая, а $_GET['news_id'] равна id новости из MySQL, то выводится в $content эта самая новость.


    Казалось бы все очень просто, однако возникают следующие проблемки:
    Имеется след. функция для вывода списка новостей:
    Код (Text):
    1. function GetList() {
    2.  
    3. global $mysql, $lang, $first, $news_on_page;
    4.  
    5. $result = mysql_query("SELECT * FROM `".$mysql['news']."` where publish='1' ORDER BY `id` DESC LIMIT ".$first.",".$news_on_page."");
    6. $news = mysql_fetch_array($result);
    7.  
    8. do {
    9.  
    10.     ob_start();
    11.  
    12.     $id = $news['id'];
    13.     $title = $news['title'];
    14.     $shortnews = $news['shortnews'];
    15.     $added = $news['added'];
    16.     $time = timestamp($added);
    17.     $author = $news['author'];
    18.     $category_id = $news['category'];
    19.     $review = $news['review'];
    20.    
    21.    
    22.     $rel = mysql_query("SELECT * FROM `".$mysql['category']."` WHERE id='".$category_id."'");
    23.     $category = mysql_fetch_array($rel);
    24.    
    25.     $category_name = $category['name'];
    26.     $category_alians = $category['alians'];
    27.    
    28.     $comments_news = mysql_num_rows(mysql_query("SELECT id from ".$mysql['comments']." WHERE news_id='".$id."'"));
    29.    
    30.     define('ID_NEWS',               $id);
    31.     define('TITLE_NEWS',            $title);
    32.     define('SHORT_NEWS',            $shortnews);
    33.     define('ADDED_NEWS',            $time);
    34.     define('AUTHOR_NEWS',           $author);
    35.     define('CATEGORY_NEWS',         $category_name);
    36.     define('ALIANS_CATEGORY_NEWS',  $category_alians);
    37.     define('REVIEW_NEWS',           $review);
    38.     define('COMMENTS_NEWS',         $comments_news);
    39.    
    40.     include (STYLE."/body/content/news/news.tpl");
    41.     $getList = ob_get_contents();
    42.     ob_end_clean();
    43. }
    44. while($news = mysql_fetch_array($result));
    45.  
    46. return $getList;
    47. }
    Выводится шаблончики новости (news.tpl) ровно тем кол-во, что и находится в таблице. Казалось бы так и должно быть, НО все новости выводятся одинаковые. То есть выводится почему только id с новостью 3 (в моем случае). Все три новости одинаковые, их id=3. Уже не знаю, что и делать даже. В функцию занес все это дело лишь для того, чтобы затем просто проще вывести этот цикл в переменную $conten, а саму эту переменную уже в шаблон.

    Помогите мне, подскажите куда рыть. :)

    Добавлено спустя 4 минуты 43 секунды:
    Ах да, для определения статичная это страница или новости использую switch case.

    switch($option_get){
    case "statics":
    include(CORE."/content/statics.php");
    break;
    default:
    include(CORE."/content/news.php");
    break;
    }

    Естественно и объявлено ранее:
    $option_get = $_POST['option'];

    По моему мнению это верно и хотелось бы использовать именно это.
     
  2. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    ob_start()
     
  3. YSandro

    YSandro Старожил

    С нами с:
    7 апр 2011
    Сообщения:
    2.523
    Симпатии:
    2
    Что-то первый раз вижу живой пример переопределения констант
    Код (PHP):
    1. define('ID_NEWS', $id); 
    Обычно люди понимают, что такое константа.

    Racer, понимаешь? В константах остаются первоначальные значения.
    У тебя id первой новости равно 3? Если да, то у тебя тот же PHP, что и у меня, и он не терпит переопределения констант ;)
     
  4. Racer

    Racer Новичок

    С нами с:
    8 дек 2013
    Сообщения:
    12
    Симпатии:
    0
    После переопределения код красивее становится. :)

    Нет, не понимаю. :D
    Почему они там первоначальные? Я полагаю, что дело в том, что используются ob`ки, но без них в переменную занести не реально.

    Может скинуть полность content.php + news.php, чтоб сами все увидели? Думаю так будет лучше всего.
    content.php:
    Код (Text):
    1. <?
    2. switch($option_get){
    3. case "statics":
    4. include(CORE."/content/statics.php");
    5. break;
    6. default:
    7. include(CORE."/content/news.php");
    8. break;
    9. }
    10.  
    11. define('TITLE_STATIC',          $title_static);
    12. define('CONTENT_STATIC',        $content_static);
    13. define('KEYWORDS_STATIC',       $keywords_static);
    14.  
    15. // Определение дополнительного заголовка
    16.  
    17. if(empty($subtitle) && empty($keywords) && empty($control_page))
    18. {
    19. $subtitle = "".$cfg['description']."";
    20. $keywords = "".$cfg['keywords']."";
    21. $control_page = $subtitle;
    22. }
    23.  
    24. define('SUBTITLE',              $subtitle);
    25. define('CONTROL_PAGE',          $control_page);
    26. define('KEYWORDS',              $keywords);
    27. define('CONTENT',               $content);
    28. define('PAGER',                 $pager);
    29. ?>
    news.php:
    Код (Text):
    1. <?
    2. $news_on_page = 10;
    3.  
    4. // Подключение постраничного вывода
    5.  
    6. include (CORE."/pagination.php");
    7.  
    8. // Вывод коротких новостей
    9.  
    10. if(!isset($news_get) && !isset($category_get))
    11. {
    12. $content = GetList();
    13. }
    14.  
    15. else
    16.  
    17. // Вывод полной новости
    18.  
    19. if(isset($news_get) && isset($category_get))
    20. {
    21. $rel_n = mysql_query("SELECT * FROM `".$mysql['news']."` where publish='1' && id='".$news_get."'");
    22. $news = mysql_fetch_array($rel_n);
    23.  
    24.     $title = $news['title'];
    25.     $fullnews = $news['fullnews'];
    26.     $keywords = $news['keywords'];
    27.     $added = $news['added'];
    28.     $time = timestamp($added);
    29.     $author = $news['author'];
    30.     $category_id = $news['category'];
    31.     $review = $news['review']; 
    32.  
    33.     $rel_c = mysql_query("SELECT * FROM `".$mysql['category']."` WHERE alians='".$category_get."'");
    34.     $category = mysql_fetch_array($rel_c);
    35.    
    36.     $category_name = $category['name'];
    37.  
    38.     $comments_news = mysql_num_rows(mysql_query("SELECT id from ".$mysql['comments']." WHERE news_id='".$news_get."'"));
    39.    
    40.     $subtitle = $title;
    41.     $control_page = "$category_name / $title";
    42.    
    43.     mysql_query("UPDATE `".$mysql['news']."` SET review = review + 1 where id='".$news_get."'");
    44.    
    45.     $comments_page = Content(CORE."/comments.php");
    46.    
    47.     define('TITLE_NEWS',            $title);
    48.     define('FULL_NEWS',             $fullnews);
    49.     define('ADDED_NEWS',            $time);
    50.     define('CATEGORY_NEWS',         $category_name);
    51.     define('ALIANS_CATEGORY_NEWS',  $category_get);
    52.     define('AUTHOR_NEWS',           $author);
    53.     define('REVIEW_NEWS',           $review);
    54.     define('COMMENTS_NEWS',         $comments_news);
    55.     define('COMMENTS',              $comments_page);
    56.    
    57.     $content = Content(STYLE."/body/content/news/fullnews.tpl");
    58.  
    59. }
    60.  
    61. else
    62.  
    63. if(!isset($news_get) && isset($category_get))
    64. {
    65. $content = GetList();
    66. }
    67.  
    68. if(!isset($news_get))
    69. {
    70.     $pager = Content(CORE."/pager.php");
    71. }
    72. ?>
    Добавлено спустя 1 минуту 24 секунды:
    Функция Content():
    Код (Text):
    1. function Content($include) {
    2.  
    3.     global $mysql, $lang, $page, $total;
    4.    
    5.         ob_start();
    6.         include($include);
    7.         $content = ob_get_contents();
    8.         ob_end_clean();
    9.         return $content;
    10. }
    Добавлено спустя :
    Функция Content():
    Код (Text):
    1. function Content($include) {
    2.  
    3.     global $mysql, $lang, $page, $total;
    4.    
    5.         ob_start();
    6.         include($include);
    7.         $content = ob_get_contents();
    8.         ob_end_clean();
    9.         return $content;
    10. }
     
  5. YSandro

    YSandro Старожил

    С нами с:
    7 апр 2011
    Сообщения:
    2.523
    Симпатии:
    2
     
  6. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.904
    Симпатии:
    719
    Да ваще... Кто придумал, что константы изменять нельзя? Требую прировнять pi к 3!

    з.ы. и опять do {} while. Всё таки попова надо запретить, как оружие массового поражения )
     
  7. Racer

    Racer Новичок

    С нами с:
    8 дек 2013
    Сообщения:
    12
    Симпатии:
    0
    Нет. Первая новость, как и следовало ожидать имеет id=1. Последняя id=3.
    Всего их 3.
    То есть id по порядку. Учитывая, что вывожу я через DESC, то получается, что первая, как раз с id=3.

    Получается Вы правы, однако, что это дает?
     
  8. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Вы за анальную кастрацию? =)

    Добавлено спустя 1 минуту 21 секунду:
    темплейт через константы. это же так забавно. почему никто не смеется? =)
     
  9. Racer

    Racer Новичок

    С нами с:
    8 дек 2013
    Сообщения:
    12
    Симпатии:
    0
    При чем тут Попов? Это прикол такой новый? Я никогда не узучал литература по языкам и не собираюсь, все сам, либо по примерам.
    while{} - не выводит 1-ю запись, либо выводит 1 запись из трех. Не помню точно. Уже пробовал. :)

    Добавлено спустя 52 секунды:
    Мне тут не особо смешно, давайте не будем отходить от темы. Знаете решение - помогите, а нет, так не надо засорять тему пожалуйста.
     
  10. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.904
    Симпатии:
    719
    * попытался представить * пожалуй, да.

    Racer, константа это константа. Она задается один раз и более не меняется. "лат. constanta — постоянная, неизменная" говорит нам википедия. Соответственно ты заполняешь константы значениями первой новости и они выводятся циклом ровно по количеству новостей. Если нужно не только хранить, но и изменять, следует пользоваться другим великим изобретением человеческого гения - переменными.
     
  11. Racer

    Racer Новичок

    С нами с:
    8 дек 2013
    Сообщения:
    12
    Симпатии:
    0
    Предложите решение лучше, хотелось бы с помощью функции выводить список новостей, при этом подключая в функии шаблон этой краткой новости.
    Затем эту функцию в переменную $content. Ведь это возможно?
     
  12. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.904
    Симпатии:
    719
    А кто сказал что нельзя? Надо только чуть изменить скрипт.
    Код (Text):
    1. define('TITLE_NEWS'.ID_NEWS, $title);
    и потом выводить constant('TITLE_NEWS'.ID_NEWS) циклом )
     
  13. Racer

    Racer Новичок

    С нами с:
    8 дек 2013
    Сообщения:
    12
    Симпатии:
    0
    Все? Посмеялись и хватит? Помощь то будет?
     
  14. YSandro

    YSandro Старожил

    С нами с:
    7 апр 2011
    Сообщения:
    2.523
    Симпатии:
    2
    Тебе по существу ответили, считай, помогли:
    Если не помогает, шуток будет больше.
     
  15. Racer

    Racer Новичок

    С нами с:
    8 дек 2013
    Сообщения:
    12
    Симпатии:
    0
    Как можно считать, что помогли, если не показано не единого примера. Мне всего лишь навсего необходимо запихуть цикл в переменную. ВСЕ.
    Вы тут натации читаете, что хорошо, что плохо. Я этого не просил. Как заключить цикл или его вывод в переменную. Это возможно?
     
  16. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.904
    Симпатии:
    719
    На самом деле всё плохо ) хз... ты забиваешь гвозди отверткой и спрашиваешь как это поудобнее сделать. Может стоит всё же чего-нибудь почитать, прежде чем спрашивать? Что бы понимать хоть какие-то базовые концепции?
    Не будет тебе готовых решений, ни в этом случае, ни после. Область деятельности такая. Могут только тыкнуть в какую сторону копать, что собственно и сделали, а дальше уж сам. Либо привыкай сразу, либо бросай это гиблое дело )

    1. Зачем ты плодишь сущности? Получаешь массив, раскидываешь по переменным и потом всё это задаешь в константы? Чем собственно массив то плох был?
    2. ob_start() и иже с ним тебе тоже не нужен ) Не будем про bad practices, но почему тогда сразу не выводишь шаблон? Ну типа:
    Код (PHP):
    1. $news = mysql_fetch_array($result);
    2. include (STYLE."/body/content/news/news.tpl");
    3.  
    4. /* а там */
    5. <h1><?php echo $news['title'];?></h1>
    6. <?php echo $news['content'];?>
    А еще лучше собрать все новости в один массив и потом уже в шаблоне циклом вывести разом, вместо того что бы дергать его инклудом на каждой записи.
    з.ы. мой пример кстати тоже ничего общего с пряморуким кодом не имеет )
    з.з.ы. mysql_* - зло и уже по сути труп. mysqli или лучше сразу PDO.
     
  17. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Используй переменные :D