Каков наилучший способ вывода данных из базы данных с использованием php?

0

Я относительно новичок в php, и я работаю над проектом с использованием базы данных mysql. Проект состоит из пользователей, которые могут писать сообщения, которые затем отображаются в формате списка. Проблема в том, что сообщения отображаются в разных местах сайта, например, на главной странице и странице профиля пользователей. Похоже на твиттер, если вы в замешательстве. Мой вопрос: каков наилучший способ отображения сообщений? В настоящее время я использую класс, который я создал. Он имеет функции для извлечения сообщений из базы данных, сохраняя их все в многомерном массиве. Затем другая функция в классе форматирует весь список с помощью foreach, а затем возвращает отформатированный HTML-список сообщений. Все, что мне нужно сделать, это повторить то, что возвращается. Но я где-то читал, что это плохая практика для написания функций (особенно функций класса), которые выводят HTML. Какой был бы лучший способ сделать это, без необходимости переписывать один и тот же код на каждой странице, где отображаются сообщения. Действительно ли испорчена практика использования HTML в функциях?

Пример... страница профиля выглядит примерно так.

<

require('class.php'); 

require('header.php');

$profile = new Profile(); 

$userProfile = $profile->GetUserProfile($userID); 

echo $userProfile;

$class = new Posts(); 

$posts = $class->GetUserPosts($userID); 

echo $posts;

require('footer.php'); 

?>

И главная страница выглядит примерно так:

<

$class = new Posts(); 

$posts = $class->GetAllPosts(); 

echo $posts;


?> 

где класс профиля будет принимать идентификатор пользователя и выводить профиль пользователей, уже отформатированный в HTML. И класс posts имеет функции для возврата определенного количества сообщений, уже отформатированных в списке HTML.

Должен ли я хранить все в классе или есть лучший способ?

Спасибо

Теги:
oop

5 ответов

1

Хорошо, если вы не используете какую-либо структуру MVC, я бы сказал, что наличие функций, которые выводят HTML, не собирается никого убивать.

Вообще, однако, полезно отделить HTML от логики, и это обычно делается путем создания HTML-шаблона и фрагментов шаблона с вкрапленным PHP. Что-то вроде этого:

<div>
    <h1><?php echo $title; ?></h1>
</div>

Затем вы можете настроить переменную $title (и другие) и include('title_fragment.php') для вывода этого бита HTML. Вы можете расширить это, чтобы работать со всеми страницами, делая это так, чтобы ваш код имел дело с небольшим количеством данных, которые передаются в шаблон.

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

1

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

С PHP одна из простейших библиотек для разделения двух - это шаблоны Smarty. Используя Smarty (или любую другую библиотеку шаблонов), вы можете написать HTML файл с макетом и некоторыми простыми циклами или другими конструкциями, а затем визуализировать этот шаблон с использованием структуры данных. По крайней мере, я бы предложил изменить свой класс, чтобы использовать шаблон и создавать выходные данные таким образом, а не mish-mash выражений print или echo с кучей HTML в них.

Я даже уклоняюсь от @zombat решения выражений эха в фрагментах HTML, они быстро становятся уродливыми.

Пример шаблона Smarty для достижения чего-то вроде того, что вы хотите:

{section name=i loop=$posts}
   <li>{$posts[i].author} &mdash; {$post[i].text}</li>
{/section}

И некоторый PHP-код поддержки:

// Instantiate Smarty object
$smarty = new Smarty();

// Assign a hash of data
$smarty->assign('posts', array(
    array('author' => 'Jim',   'text' => 'Hi this is my post!'),
    array('author' => 'Sally', 'text' => 'My first post to the system')
  )
);

// Use the file with the above template in it
$smarty->display('posts.html');

Часть, в которой вы назначаете данные шаблону, должна, вероятно, выполняться с помощью некоторых программных средств для преобразования списка объектов класса в список хэшей.

Таким образом вы можете легко изменить способ вывода, просто отредактировав HTML-шаблон, и вам не нужно беспокоиться о касании какого-либо кода, чтобы изменить вывод.

0

Я вообще не знаком с Smarty... как именно это работает, и каковы преимущества использования smarty или просто создания функций для получения больших объемов данных и возврата html, содержащих эти данные, для последующего эха.

0

Вы можете использовать буферизацию вывода. Это помогает создавать ваши шаблоны и не принудительно обрабатывать данные в порядке отображения.

<?php
  $posts = take_data_from_class();
  ob_start();
  require_once('path/to/posts.php');
  $html_posts = ob_get_clean();

  // you can do the same with other parts like header or footer
  ob_start();
  require_once('path/to/header.php');
  $header = ob_get_clean();

  ob_start();
  require_once('path/to/footer.php');
  $footer = ob_get_clean();

?>

В posts.php вы можете отображать сообщения:

<? foreach ($posts as $p) { ?>
<div class="...">
  post data here
</div>
<? } ?>

Теперь, чтобы отобразить все это:

<?php echo $header . $html_posts . $footer; ?>

Подробнее в http://us3.php.net/manual/en/book.outcontrol.php

Наслаждайтесь!

0

Ваш класс должен в идеале предоставить только данные. Используйте другой PHP файл или общий класс для вывода HTML, так что позже вы можете вывести, например. XML, JSON и т.д. Из одного класса данных. Это отделяет вашу обработку данных (модель/контроллер) от представления данных (просмотр).

Я бы не согласился с использованием механизма шаблонов, такого как Smarty. PHP - это механизм шаблонов.

  • 0
    Я думаю, что моя мысль в том, что PHP достаточно уродлив, вы не хотите бросать код в свой вывод. Кроме того, вы можете использовать Smarty или другой шаблонизатор для вывода любого другого формата, который вам нравится, без изменения кода, кроме выбора, какой шаблон будет использоваться;)
  • 0
    У меня есть класс, который содержит функции для сбора сообщений и сохранения их в массиве. В том же классе у меня есть отдельные функции, которые имеют дело только с форматированием данных в html, используя foreach. У меня также есть функции, которые получают пользовательские данные, и отдельная функция для форматирования профиля с использованием этих данных. Это достаточно хорошо, или это плохая практика. Должен ли я создать целый новый класс, чтобы иметь дело только с форматированием?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню