Помогите разобраться с классами в PHP

12 3
Sly32
На сайте с 29.03.2012
Offline
302
1254

Хочется максимально упростить себе разработку и разнести по файлам дизайн и функционал.

Задача - получить из базы данные и в цикле вывести их на страничке. Вижу это таким образом:

Класс запроса к базе;

class News {

public $res;

function datlim($class, $limit)
{
global $mysqli;
$arg = "SELECT * FROM `posts` WHERE `p_type` = 'news' ORDER BY `p_title` ASC LIMIT 0, " . $limit;
$query = $mysqli->query($arg);
$row_cnt = $query->num_rows;
if ($row_cnt > 0) {

while ($res = $query->fetch_array(MYSQLI_ASSOC)) {

echo '<div class="<? $class ?>">';
echo "<div class='meta-data'>" . $res['p_title'] . '</div>';

echo "</div>";
}
}else
{echo 'Ничего не найдено';}
}
}

Теперь в нужном месте на странице просто ставлю:



<?php echo News::datlim('style-class', 3);?>

И у меня выводится в цикле данные.

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

Класс, допустим:


class News {
public $res;

function datlim($class, $limit)
{
global $mysqli;
$arg = "SELECT * FROM `posts` WHERE `p_type` = 'news' ORDER BY `p_title` ASC LIMIT 0, " . $limit;
$query = $mysqli->query($arg);
$row_cnt = $query->num_rows;
if ($row_cnt > 0) {

$res = $query->fetch_array(MYSQLI_ASSOC)
return $res // Вот что здесь возвращать?
}
}else
{echo 'Ничего не найдено';}
}

А на странице:


while (Пока есть записи в передаваемом массиве) { // с чем сравнивать из класса?

echo "<div class='meta-data'>" . $res['p_title'] . '</div>'; // какая тут доступная переменная? какой массив передастся?
}

Запутался в массивах передаваемых и вообще не могу понять как это можно использовать - направьте на правильный путь. Пытаюсь разобраться по Костерову, но сложновато идет.

Ragnarok
На сайте с 25.06.2010
Offline
226
#1

Sly32, пусть функция возвращает (return) массив, а не выводит (echo) значение. Потом уже, используя полученный массив, в файле представлений (views) формируйте теги с данными. Вообще, движетесь в правильном направлении (про паттерн MVC).

Ещё, советую "не доверять" входным данным и $limit перед подстановкой превращать в (int)$limit.


foreach (News::datlim('style-class', 3) as $n) {
//тут вывод
}
//TODO: перестать откладывать на потом
Sly32
На сайте с 29.03.2012
Offline
302
#2

Ragnarok, Так вопрос в том как сформировать этот массив? Может пример на основе моего запроса?

Конкретно - как правильно в классе создать этот массив и потом как нему корректно обращаться в цикле вывода? В моем случае return $res выводит только последнюю строку. Чего то я не допонимаю...

Ilekor
На сайте с 22.04.2009
Offline
138
#3
Sly32:
Ragnarok, Так вопрос в том как сформировать этот массив? Может пример на основе моего запроса?
Конкретно - как правильно в классе создать этот массив и потом как нему корректно обращаться в цикле вывода? В моем случае return $res выводит только последнюю строку. Чего то я не допонимаю...

Sly32, Ragnarok ответил вам, соберите в массив


class News {
public $res;

function datlim($class, $limit)
{
global $mysqli;
$arg = "SELECT * FROM `posts` WHERE `p_type` = 'news' ORDER BY `p_title` ASC LIMIT 0, " . $limit;
$query = $mysqli->query($arg);
$row_cnt = $query->num_rows;
if ($row_cnt > 0) {

$res = $query->fetch_array(MYSQLI_ASSOC)
return $res // Вот что здесь возвращать?
}
}else return false;
}

foreach (News::datlim('style-class', 3) as $n) {
var_dump($n);
}
Лучший дорген 21 века AgDor(http://agdor.info)
Sly32
На сайте с 29.03.2012
Offline
302
#4

Ilekor, Стыдно признаться, но все равно не понимаю...

А вывести как? этот foreach должен быть в классе, но вне вызываемой функции?

Как потом использовать данные на странице вывода?

Ilekor
На сайте с 22.04.2009
Offline
138
#5
Sly32:
Ilekor, Стыдно признаться, но все равно не понимаю...
А вывести как? этот foreach должен быть в классе, но вне вызываемой функции?

Как потом использовать данные на странице вывода?

Форич должен быть на странице вывода

Sly32
На сайте с 29.03.2012
Offline
302
#6

Ilekor, C

этим разобрался. Но моя функция выводит данные только по одной строке из таблицы, последней по выбранным параметрам. Фореач - доступ ко всем переменным из строки - это хорошо. А как получить следующую строку?

Например вывести все заголовки p_title из таблицы posts

Ilekor
На сайте с 22.04.2009
Offline
138
#7
Sly32:
Ilekor, C
этим разобрался. Но моя функция выводит данные только по одной строке из таблицы, последней по выбранным параметрам. Фореач - доступ ко всем переменным из строки - это хорошо. А как получить следующую строку?
Например вывести все заголовки p_title из таблицы posts

Это вы должны настроить сам класс и передавать ему нужные параметры для формирования массива. Дальше вы сами, извините!

Sly32
На сайте с 29.03.2012
Offline
302
#8

Ilekor, Thanks a lot!!

Благодаря всем помогающим был направлен в нужное русло и разобрался!

Теперь в классе циклом создаю массив с нужными данными, а не как ранее, одну строку, а в выводе с помощью foreach делаю нормальный вывод. ТСтили прилепить теперь значительно проще, постепенно получается уйти от ЦМСки

Ilekor
На сайте с 22.04.2009
Offline
138
#9

Сделайте тогда так

class News {

public $res;

function datlim($class, $limit)
{
global $mysqli;
$arg = "SELECT * FROM `posts` WHERE `p_type` = 'news' ORDER BY `p_title` ASC LIMIT 0, " . $limit;
$query = $mysqli->query($arg);
$row_cnt = $query->num_rows;
if ($row_cnt > 0) {

while ($res = $query->fetch_array(MYSQLI_ASSOC)) {

$block = '<div class="<? $class ?>">';
$block .= "<div class='meta-data'>" . $res['p_title'] . '</div>';

$block .= "</div>";

$content[] = $block;
}
}else return fasle;
}
}

На странице вывода

foreach (News::datlim('style-class', 3) as $n) {

var_dump($n);
}
Sly32
На сайте с 29.03.2012
Offline
302
#10

Ilekor, Нет, я сделал именно как хотел. Может несколько коряво, но визуально проще

Класс:


public static function dat1($limit){
global $mysqli;
$res = array();
$arg = "SELECT * FROM `posts` WHERE `p_type` = 'news' ORDER BY `p_title` ASC LIMIT 0, " . $limit;
$query = $mysqli->query($arg);
$row_cnt = $query->num_rows;
if ($row_cnt > 0) {
for ($i = 0; $i < $row_cnt; $i++){
$res[$i] = $query->fetch_array(MYSQLI_ASSOC) ;
}
return $res;
}
else{
echo 'Ничего не найдено';}

}

На выводе:


foreach (News::dat1(3) as $n) {
echo $n['p_title'];
}

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

12 3

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий