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

123
Ragnarok
На сайте с 25.06.2010
Offline
239
#11

Sly32, Почти правильно.

1. Если функция не вернёт массив, будет ошибка

2. приведите $limit к типу int, как я писал

//TODO: перестать откладывать на потом
S3
На сайте с 29.03.2012
Offline
366
#12

Ragnarok,

1. Да,нужно сделать еще проверку полученных данных. Я проверяю, правда наличие строки после выполнения query - этого недостаточно, думаете? Проверять еще и каждый fetch?

2. как правильно - прямо вфункции вставить $limit = (int)$limit; ?

Ragnarok
На сайте с 25.06.2010
Offline
239
#13
Sly32:
Ragnarok,
1. Да,нужно сделать еще проверку полученных данных. Я проверяю, правда наличие строки после выполнения query - этого недостаточно, думаете? Проверять еще и каждый fetch?
2. как правильно - прямо вфункции вставить $limit = (int)$limit; ?

1. Если $row_cnt == 0, То будет echo 'Ничего не найдено', а потом ошибка

2. В запросе

$arg = "SELECT * FROM `posts` WHERE `p_type` = 'news' ORDER BY `p_title` ASC LIMIT 0, " . (int)$limit;

S3
На сайте с 29.03.2012
Offline
366
#14

Ragnarok, Понятно, спасибо за помощь

Mad_Man
На сайте с 10.11.2008
Offline
162
#15

Sly32, методы классов не должны ничем гадить в основной поток вывода. Никаких echo во внутренних вызовах не должно быть.

S3
На сайте с 29.03.2012
Offline
366
#16
Mad_Man:
Sly32, методы классов не должны ничем гадить в основной поток вывода. Никаких echo во внутренних вызовах не должно быть.

И вам спасибо, добрый человек))) Ценно, буду знать. А как тогда обработать случай с отсутствием данных?

Mad_Man
На сайте с 10.11.2008
Offline
162
#17
Sly32:
И вам спасибо, добрый человек))) Ценно, буду знать. А как тогда обработать случай с отсутствием данных?

http://php.net/manual/ru/function.trigger-error.php


<?

class exception
{
public static function notice($message) { return static::trigger($message, E_USER_NOTICE); }
public static function warning($message) { return static::trigger($message, E_USER_WARNING); }
public static function deprecated($message) { return static::trigger($message, E_USER_DEPRECATED); }
public static function error($message) { return static::trigger($message, E_USER_ERROR); }

private static function trigger($error_message, $error_type)
{
return trigger_error($error_message, $error_type);
}
}

+ в качестве хорошего бонуса можно прочесть коммент #2 из линка выше и немного пропатчить простейший класс.

В самом методе, в котором данных не нашлось, возвращаете null, либо пустой набор данных ожидаемого типа (пустой массив если ожидается массив, пустую строку если строка, stdClass класс если ожидается объект и т.д.)

PN
На сайте с 22.08.2012
Offline
103
#18

Вам нужно делать еще больший уклон в сторону MVC. При таком подходе вы еще далеки от него. У вас на странице вывода не должно быть никаких

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

потому что так получается, что представление запрашивает модель. Ошибки, из-за которых представленное не соответствует MVC:

1. global $mysqli; - а если $mysqli не будет определена в вашем следующем проекте?

2. echo в запросе данных - модель ничего не выводит.

Один из способов реализации здесь MVC (и то пассивного):

1. Модель


class News {
private $mysqli;
function __construct($mysqli)
{
$this->mysqli = $mysqli;
}

function get($limit)
{
$arg = "SELECT * FROM `posts` WHERE `p_type` = 'news' ORDER BY `p_title` ASC LIMIT 0, " . $limit;
$query = $this->mysqli->query($arg);
$row_cnt = $query->num_rows;
if ($row_cnt > 0)
{
$result = array();
while ($res = $query->fetch_array(MYSQLI_ASSOC))
{
$result[] = $res['p_title'];
}
return $result;
}
return false;
}
}

2. Контроллер

class newsController
{
public function someAction()
{
$news_class = 'style-class';
$news = new News($mysqli);
$result = $news->get(5);
include 'template.php';
}
}

3. Представление

<?php foreach ($result as $res): ?>
<div class="<?=$news_class?>">
<div class="meta-data"><?=$res?></div>
</div>
<?php endforeach; ?>

могут быть ошибки, набросал за 5 мин:)

Мой совет помог? Не скупись! Bitcoin 1Lseddet1o1B6odgXQHbGaWGwRkt1Db8Ef Ethereum 0x450f1a17461e25194B7F9226cDEe70173F39e1e1
K
На сайте с 03.06.2015
Offline
45
#19

Если читатель цитирует коды с global, то случай заведомо неоперабельный. Это я по своему опыту переписки на форумах программистов давным давно знаю.

---------- Добавлено 07.06.2015 в 23:26 ----------

По делу. Класс новостей (статей) на сайте это явный виджет. Ему не нужен контроллер и модель в упор не стучит. Потому что листинг надо мочь вывести в любую врезку, а равно статью вывести в любую секцию. Например выводим листинг релевантный запросу в каталоге. Или печатаем связанную статью под листингом товаров. Ну какой там экшон и в чем разница моделей? Пишется класс со всем скарбом, можно сначала интерфейс, или абстрактный. Потом наследуемся с него под разные нужды, или тупо перечисляем все методы под разные нужды и вперде.

MYSQL PHP JS HTML CSS SEO TXT США СССР
Mad_Man
На сайте с 10.11.2008
Offline
162
#20
kostyanet:
По делу. Класс новостей (статей) на сайте это явный виджет. Ему не нужен контроллер и модель в упор не стучит. Потому что листинг надо мочь вывести в любую врезку, а равно статью вывести в любую секцию. Например выводим листинг релевантный запросу в каталоге. Или печатаем связанную статью под листингом товаров. Ну какой там экшон и в чем разница моделей? Пишется класс со всем скарбом, можно сначала интерфейс, или абстрактный. Потом наследуемся с него под разные нужды, или тупо перечисляем все методы под разные нужды и вперде.

Два чая этому человеку.

123

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