[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: постраничный вывод с сортировкой
vaanyaa
Зравствуйте.
Решили с другом самостоятельно написать скрипт постраничного вывода и сортировки по нескольким параметрам.
В итоге получилось это:

 <td id="content">

<?php

if(isset($_GET['cat'])) /*если есть глобальная переменная, заносим ее в обычную*/
{
$cat =$_GET['cat'];
$q_cat = "WHERE cat=".$cat;/*Часть запроса для выборки заносим в переменную*/
$c = "&cat=".$cat; /*переменная добавляет запрос на ссылках*/
$w="";
$and="";

if (isset ($_GET['low_l']))
{ $low_l=$_GET['low_l'];
$low_q="AND prise >= '$low_l'";}
else
{$low_q="";}

if (isset ($_GET['high_l']))
{ $high_l=$_GET['high_l'];
$high_q="AND prise <= '$high_l'";}
else {$high_q="";}
}

else/*если категория не выбнанна переменные равны пустой строке*/
{
$q_cat = "";
$c = "";
$w = "WHERE";
$and="";

if (isset ($_GET['low_l']))
{ if ($_GET['low_l'] !== "")
{ $low_l=$_GET['low_l'];
$low_q="prise >= ".$low_l;}
else {$low_q="";}
}

else {$low_q="";}


if (isset ($_GET['high_l']))
{ if ($_GET['high_l'] !== "")
{
$high_l=$_GET['high_l'];
$high_q="prise <= ".$high_l;
}
else {$high_q="";}
}

else {$high_q="";}

if (isset ($low_l) and isset($high_l))
{
if($low_l !== "" and $high_l !== "")
{
$and="AND";
}
}


if (!isset($low_l) and !isset($high_l))
{$w="";}
}

if (isset($_GET['byprise_up']))
{
$byprise="ORDER by prise";
$p="&byprise_up";/*Переменная, которая подключает сортировку по цене в списке страниц*/
}
else {
$byprise="ORDER by prise DESC";
$p="";
}
if(isset($_GET['page'])) $page = $_GET['page'];/*определяем номер текущей страницы*/
else $page = 1;/*если параметр не выбран, по умолчанию 1 страница*/
$limit = 2;
$start = ($page - 1) * $limit;

$result1 = mysql_query("SELECT * FROM catalog $q_cat",$db);
$myrow1 = mysql_fetch_array($result1);


$result = mysql_query("SELECT * FROM catalog $q_cat $w $low_q $and $high_q $byprise LIMIT $start,$limit",$db);
if(!$result)
{
echo "<p>Запрос на извлечение данных из бд не прошел. Сообщите администратору vaanyaa@inbox.ru. Код ошибки</p>";
exit(mysql_error());
}

if(mysql_num_rows($result) > 0)
{
$myrow = mysql_fetch_array($result);

}
else{
echo "<p>Информация из бд недоступна. Таблица пуста.</p>";
exit();
}
?>


<div
class="new">
<p>
Каталог телефонов</p>
</div>
<strong>
Производители:</strong>
<?php
/*Достаем из базы ссылки на производителей*/
if(isset($_GET['cat']))
{
echo "<a class='cat_firm' href='catalog.php' title='Все производители'>Все</a> |";
}
$result3 = mysql_query ("SELECT id,cat FROM category", $db);

if(!$result3)
{
echo "<p>Запрос на извлечение данных из бд не прошел. Сообщите администратору vaanyaa@inbox.ru. Код ошибки</p>";
exit(mysql_error());
}

if(mysql_num_rows($result3) > 0)
{
$myrow3 = mysql_fetch_array ($result3);

do{
printf("<a class='cat_firm' href='catalog.php?cat=%s' title='%s'>%s</a> |",$myrow3['id'],$myrow3['cat'],$myrow3['cat']);
}
while($myrow3 = mysql_fetch_array($result3));
}
else{
echo "<p>Информация из бд недоступна. Таблица пуста.</p>";
exit();
}
/*выборка по производителям закончилась*/
?>

<br><strong>
Сортировать по цене:</strong>

<?php

/*Сортировка по цене и по каталогу*/
if (isset($_GET['cat']))
{
print <<<HTML
<a class='cat_firm' href='catalog.php?cat=$cat' title=''>по уменьшению</a> |
<a class='cat_firm' href='catalog.php?cat=
$cat&byprise_up' title=''>по увеличению</a>
<form action="" method="get"><strong> от</strong> <input name="low_l" type="text" size="5"><strong> до</strong> <input name="high_l" type="text" size="5"> <input name="" type="submit" value="Сортировать"></form>

HTML;
}
else{
print <<<HTML
<a class='cat_firm' href='catalog.php' title=''>по уменьшению</a> |
<a class='cat_firm' href='catalog.php?byprise_up' title=''>по увеличению</a>
<form action="" method="get"><strong> от</strong> <input name="low_l" type="text" size="5"><strong> до</strong> <input name="high_l" type="text" size="5"> <input name="" type="submit" value="Сортировать"></form>

HTML;
}
/*Сортировка по цене и по каталогу*/
?>

<div
id="pages">
<?php

$min = 1;/*ссылка на первую страницу*/
$before = $page - 1;/*ссылка на предыдущую страницу*/
if($before < 1) $before = 1;/*если достигли первой стр. ссылка ведет на нее же*/
$a = mysql_num_rows($result1) / $limit;/*определяем количество страниц выборки*/
$max = ceil($a);/*определяем номер последней страницы в выборке*/
$how_mush = 4;/*количество выводимых кнопок*/
if($how_mush > $max) $how_mush = $max;/*если кнопок дольше чем страниц приравниваем кнопки к страницам*/
$after = $page + 1;/*ссылка на предыдущую страницу*/
if($after > $max) $after = $max;/*если достигли конца ссылается на нее же*/

if ($page > 1)
{
echo "<a class='pages' href=?page=".$min.$c.$p."><<</a>";/*ссылка на первую страницу*/
echo "<a class='pages' href=?page=".$before.$c.$p."><</a>";/*ссылка на предыдущую страницу*/
}
$i =$page - 2;/*счетчик, выводим 2 стр до текуцей и 2 после*/
if($i >= ($max-2)) $i = $max - 3;/*при значении i больше максим выводим до макс*/
if($i <= 0) $i = 1;/*при отицательных значениях и нуле начинаем с 1*/
$b = 1;/*счетчик цикла*/

do
{
echo "<a class='pages' href=?page=".$i.$c.$p.">".$i."</a>";/*выводим ссылочку*/
$b++;/*добавляем в четчик цикла*/
$i++;/*добавляем значение след стр*/

}
while($b<=$how_mush);/*при изменении числа меняется кол-во выводимых кнопок*/


if ($page < $max)
{
echo "<a class='pages' href=?page=".$after.$c.$p.">></a>";/*ссылка на следующую страницу*/
echo "<a class='pages' href=?page=".$max.$c.$p.">>></a>";/*ссылка на последнюю страницу*/
}
?>
</div>



<?php


/*Выводим в цикле необходимое количество записей*/
do
{
printf("<table class ='t_catalog' border='0' cellspacing='0' cellpadding='0'>
<tr height='40px'>
<td colspan='3'><div class='new'><p>Мобильный телефон: %s</p></div></td>
</tr>
<tr>
<td><p class='prise'>Цена: %s грн</p><img width='120' src='%s'></td>
<td colspan='2' id='kr_op'><p><strong>Короткое описание:</strong></p> %s</td>
</tr>
<tr>
<td id='buy'><a href='viewmodel.php?id=%s'>Oписание</a> </td>
<td id='opisanie'><a href='viewmodel.php?id=%s'>Сравнить</a> </td>
<td id='buy'><a href=
\"javascript:void window.open('shopcart.php?id=%s','','width=700,height=400,xcenter=yes,ycenter=yes')\">Купить</a> </td>
</tr>
</table>"
,$myrow['model'],$myrow['prise'],$myrow['pic'],$myrow['short_descr'],$myrow['id'],$myrow['id'],$myrow['id'],$myrow['id']);
/*Указать правильную ссылку п пункте Сравнить*/
}
while($myrow = mysql_fetch_array($result));
?>




</td>


В итоге все работает.
Но есть подозрение что это все можно сделать более изящно.
Кто знает что и как можно поменять, прошу подсказать.
Спасибо



Спустя 52 минуты, 39 секунд (15.12.2009 - 16:52) Gradus написал(а):
Ну для новичков от Попова, не плохо в плане того что вы сами написали(или передалали) код с понимаением что он делает.Но надо дальше учиться...
Того что вы хотели услышать не скажу ибо если вы хотите сделать "идеальный" переписывать придёться 80% кода.Для начала советую прочитать про sql иньекции,экранировку и по лазейте по форуму посмотрите примеры и задачки от twin'a будет очень полезно

Спустя 4 часа, 6 минут, 35 секунд (15.12.2009 - 20:59) sergeiss написал(а):
При выводе из БД имеет большой смысл забыть про цикл do-while{} и использовать цикл while{}. Тогда чтение строки из выборки будет делаться только в одном месте, и при отсутствии данных внутрь цикла вообще попадать не будешь.

Спустя 2 часа, 25 минут, 59 секунд (15.12.2009 - 23:25) vaanyaa написал(а):
sergeiss Спасибо за совет, обязательно переделаю
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.