Вывод списка новостей

P
На сайте с 14.05.2012
Offline
35
734

Есть определённое количество новостей (скажем 10). Мне нужно выводить на страницу по 9 новостей в столбик, примерно следующим образом. На страницу передается айди записи (по GET), этот айди помещается в центр страницы с верху должны быть 4 записи которые были сделаны раньше. А ниже 4 которые были сделаны позже.

То-есть при айди 1 должны выйти числа: 1, 2, 3, 4, 5, 6, 7, 8, 9

... при айди 3 должны выйти числа: 1, 2, 3, 4, 5, 6, 7, 8, 9

... при айди 6 должны выйти числа: 2, 3, 4, 5, 6, 7, 8, 9, 10

... при айди 8 должны выйти числа: 4, 5, 6, 7, 8, 9, 10

Надеюсь мысль ясна. Вот мои наработки, не совсем удачные.

<?php

$db=mysql_connect("localhost","news","news") ;
mysql_select_db("news",$db);

$negativ = 0;
$id = $_GET['id'];
$g = 0;
$post_max = mysql_num_rows(mysql_query("SELECT * FROM news"));


if ($id > $post_max){ exit('Таких записей нет'); }


//если записи по середине, то прибавляем с каждой стороны по 4 записи.
for ($i = -4; $i <= 4; $i++) {

$post_id = $id + $i;


if($post_id > 0){
if ($post_id <= $post_max){
if ($i == -4){
echo "<span class='unik-".$id."'>". $post_idr.'</span><br>'; //выводим первую запись с униальным class записи
}else{
echo $post_id.'<br>'; //выводим вторую и последующие записи
}
}
}else{
$negativ++;
}
}


if ($negativ > 0){
for ($i = 1; $i <= $negativ; $i++) {
$post_id + $i .'<br>';//выводим недостоющие записи
}
}
?>
siv1987
На сайте с 02.04.2009
Offline
427
#1
perevezenzev:
Надеюсь мысль ясна.

Не очень ясна. Почему при id1 должны выйти такие цифры (9), а при id8 другие (7)?

Следуя вашей логике, при id1 должно быть 1 > 2,3,4,5

При id5 1,2,3,4 < 5 > 6,7,8,9

При id8 4,5,6,7 < 8 > 9,10[,11,12]

P
На сайте с 14.05.2012
Offline
35
#2
siv1987:
Не очень ясна. Почему при id1 должны выйти такие цифры (9), а при id8 другие (7)?

Следуя вашей логике, при id1 должно быть 1 > 2,3,4,5
При id5 1,2,3,4 < 5 > 6,7,8,9
При id8 4,5,6,7 < 8 > 9,10[,11,12]

Всегда на странице должно быть 9 записей, вот главная суть. Если записей "с лева" (как при ид 3) не хватает то больше пишутся с права, а когда "справа" (при ид 8) не хватает то больше получается справа.

[,11,12] - В данном примере всего 10 записей, а так да.

siv1987
На сайте с 02.04.2009
Offline
427
#3


$id = intval( $_GET['id'] );

if( $id > 9 AND $max_posts > 9 )
{
$prv = 4;
$nxt = 4;

$min = $id - $prv;
$max = $id + $nxt;
if( $max > $max_posts )
{
$_t = $max_posts - $max;
$min = $min - $_t;
$min = ($min) ? $min : 1;
}
}
else
{
$min = 1;
$max = ($max_posts < 9) ? $max_posts : 9;
}

echo "min: {$min}<br />max: {$max}";

for( $i=$min; $i< $max; $i++ )
{
//как-то так
}
perevezenzev:

$post_max = mysql_num_rows(mysql_query("SELECT * FROM news"));
if ($id > $post_max){ exit('Таких записей нет'); }

Кстати, не совсем верное утверждение. Максимальный $id не обязательно должен быть равен общему количеству новостей в базе. У меня может быть новости с id 15 при их общем количестве в таблице 5. Да вообще это лол, для подсчета записей нужно юзать SELECT COUNT(*)

P
На сайте с 14.05.2012
Offline
35
#4

siv1987, спасибо но у меня это не работает. При ?id=8 выводит min: 1 max: 9 а должно быть min: 4 max: 10 и при остальных числах также. Толи я дурак то ли сани не едят

siv1987
На сайте с 02.04.2009
Offline
427
#5
perevezenzev:
а должно быть min: 4 max: 10
perevezenzev:
Всегда на странице должно быть 9 записей, вот главная суть.

Где тут 10-4 девять записей?

При вводе любой цифры меньше 9, у вас не может быть другого списка как 1-9 согласно условию.

Кстати, мой $max_posts == вашему $post_max

P
На сайте с 14.05.2012
Offline
35
#6

Спасибо, говорю же дурак я.

siv1987
На сайте с 02.04.2009
Offline
427
#7

Все же есть один недочет, действительно с 6 по 9 список будет неправильно формироваться если новостей больше чем 9

правильнее так


$id = intval( $_GET['id'] );

$prv = 4;
$nxt = 4;
$_max = 0;

$min = $id - $prv;
if( $min <= 0 )
{
$_max = abs( $min )+1;
$min = 1;
}

$max = $id + $nxt + $_max;
if( $max > $max_posts )
{
if( $min > 1 )
{
$min = $min - ( $max- $max_posts );
$min = ($min) ? $min : 1;
}

$max = $max_posts;
}

echo "min: {$min}<br />max: {$max}"

for( $i=$min; $i<= $max; $i++ )
{
//как-то так
}

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