Проблемка в хаке - cms dle

Delarante
На сайте с 13.07.2008
Offline
69
866

Друзья возникла проблемка, прошу помощи…

Есть один хак под DLE, суть которого состоит в том, чтобы при просмотре полной новости вывести две ссылки на предыдущую и следующую новость.

Проблема в том, что для некоторых новостей хак выводит вместо ссылки на предыдущую новость, ссылку на саму себя.

Грубо говоря, есть 3 новости, когда просматриваем новость-2, должны отображаться ссылки на 1 и 3, предыдущую и следующую, а отображаются на 2 и 3.

И такая проблема только с некоторыми новостями… В структуре бд ошибок нет, хаку тупо не нравятся даты некоторых новостей. Вопрос - может выполняется кривой запрос выборки?

$backlink = $db->super_query( "SELECT id, date, title, category, alt_name, flag FROM " . PREFIX . "_post WHERE date < FROM_UNIXTIME({$row['date']}) AND allow_main = '1' AND approve = '1' ORDER BY date DESC LIMIT 0,1" );

В чем косяк подскажите плз?

Весь код:

$backnext_allow = "yes";

if( $backnext_allow == "yes" ) {

if( $config['allow_cache'] != "yes" ) {
$config['allow_cache'] = "yes";
$revert_cache = true;
} else
$revert_cache = false;
$back_link = dle_cache( "backlink", $row['id'] );
$next_link = dle_cache( "nextlink", $row['id'] );

if( $back_link === FALSE ) {

$backlink = $db->super_query( "SELECT id, date, title, category, alt_name, flag FROM " . PREFIX . "_post WHERE date < FROM_UNIXTIME({$row['date']}) AND allow_main = '1' AND approve = '1' ORDER BY date DESC LIMIT 0,1" );
if( $backlink ) {
$backlink['date'] = strtotime( $backlink['date'] );
$backlink['category'] = intval( $backlink['category'] );
if( strlen( $backlink['title'] ) > 100 ) $backlink['title'] = substr( $backlink['title'], 0, 75 ) . " ...";
if( $config['allow_alt_url'] == "yes" ) {
if( $backlink['flag'] and $config['seo_type'] ) {
if( $backlink['category'] and $config['seo_type'] == 2 ) {
$back_link = $config['http_home_url'] . get_url( $backlink['category'] ) . "/" . $backlink['id'] . "-" . $backlink['alt_name'] . ".html";
} else {
$back_link = $config['http_home_url'] . $backlink['id'] . "-" . $backlink['alt_name'] . ".html";
}
} else {
$back_link = $config['http_home_url'] . date( 'Y/m/d/', $backlink['date'] ) . $backlink['alt_name'] . ".html";
}
} else {
$back_link = $config['http_home_url'] . "index.php?newsid=" . $backlink['id'];
}
} else {
$back_link = "";
}
if( $back_link ) {
$back_link = "<a href=\"" . $back_link . "\">" . stripslashes( $backlink['title'] ) . "</a>";
}
$db->free();
create_cache( "backlink", $back_link, $row['id'] );
}

if( $next_link === FALSE ) {

$nextlink = $db->super_query( "SELECT id, date, title, category, alt_name, flag FROM " . PREFIX . "_post WHERE date > FROM_UNIXTIME({$row['date']}) AND allow_main = '1' AND approve = '1' ORDER BY date ASC LIMIT 0,1" );
if( $nextlink ) {
$nextlink['date'] = strtotime( $nextlink['date'] );
$nextlink['category'] = intval( $nextlink['category'] );
if( strlen( $nextlink['title'] ) > 100 ) $nextlink['title'] = substr( $nextlink['title'], 0, 75 ) . " ...";
if( $config['allow_alt_url'] == "yes" ) {
if( $nextlink['flag'] and $config['seo_type'] ) {
if( $nextlink['category'] and $config['seo_type'] == 2 ) {
$next_link = $config['http_home_url'] . get_url( $nextlink['category'] ) . "/" . $nextlink['id'] . "-" . $nextlink['alt_name'] . ".html";
} else {
$next_link = $config['http_home_url'] . $nextlink['id'] . "-" . $nextlink['alt_name'] . ".html";
}
} else {
$next_link = $config['http_home_url'] . date( 'Y/m/d/', $nextlink['date'] ) . $nextlink['alt_name'] . ".html";
}
} else {
$next_link = $config['http_home_url'] . "index.php?newsid=" . $nextlink['id'];
}
} else {
$next_link = "";
}
if( $next_link ) {
$next_link = "<a href=\"" . $next_link . "\">" . stripslashes( $nextlink['title'] ) . "</a>";
}
$db->free();
create_cache( "nextlink", $next_link, $row['id'] );
}

$tpl->set( '{back-link}', $back_link );
$tpl->set( '{next-link}', $next_link );

if( $revert_cache ) $config['allow_cache'] = "no";
}
siv1987
На сайте с 02.04.2009
Offline
427
#1

Попробуйте вместо даты использовать ид

WHERE id < {$row['id']}

Y
На сайте с 22.01.2008
Offline
54
#2

сразу после запроса бэклинка сделайте var_dump этой переменной - что в итоге возвращается-то?

Free-lance: yTko (free-lance.ru/users/yTko/) Это мой brute (http://kocou.ytko.mybrute.com). А где твой?
Delarante
На сайте с 13.07.2008
Offline
69
#3
siv1987:
Попробуйте вместо даты использовать ид
WHERE id < {$row['id']}

Сам думал об этом, Спасибо. Но тут проблемка в том, что не у всех новостей id идет по порядку, у некоторых менялись даты публикаций. Но все же если проблему с датой не решу то этот вариант хороший. 🍻

yTko:
сразу после запроса бэклинка сделайте var_dump этой переменной - что в итоге возвращается-то?

Открываю одну из глючных новостей, к примеру - балконы, id377, и получаю данные этой же самой новости:


array(6) { ["id"]=> string(3) "377" ["date"]=> string(19) "2012-03-15 10:59:35" ["title"]=> string(25) "Балконы" ["category"]=> string(1) "5" ["alt_name"]=> string(24) "balcony" ["flag"]=> string(1) "1" }

Странно это всё. Пересохраняю новость с новой датой, все начинает работать. Возвращаю старую дату, снова тупит... Менял дату как напрямую в бд, так и через админку, результат один...

siv1987
На сайте с 02.04.2009
Offline
427
#4
Delarante:
Странно это всё. Пересохраняю новость с новой датой, все начинает работать. Возвращаю старую дату, снова тупит... Менял дату как напрямую в бд, так и через админку, результат один...

А откуда там $row['date'] в формате timestamp, вроде бы из базы должно в виде datatime?

Y
На сайте с 22.01.2008
Offline
54
#5
siv1987:
А откуда там $row['date'] в формате timestamp, вроде бы из базы должно в виде datatime?

немного неверно, но вроде да - скорее всего в этом косяк. в запросе у вас функция FROM_UNIXTIME(), которая принимает на вход timestamp, а Вы подаете строку.

т.е. надо либо функцию FROM_UNIXTIME() убрать, либо $row['date'] отдавать через strtotime()

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