Не могу разобраться.

12
Vit@l
На сайте с 18.11.2005
Offline
57
772

Всем привет.

Изучаю PHP+MySQL. Естественно, пробую что-то написать. Но вот попал в тупик.

Имеется таблица БД с полями:

-Порядковый номер

-Категория

-Фабрика

-Маленькая картинка

-Большая картинка

-Артикул

-Высота

-Ширина

-Длина

-Вкл/выкл

Задача: чтобы при попадании index.php?category=1&page=1 показывались товары из категории 1 (с этим разобрался) по 10шт на странице. Меню для перехода по страницам в зависимости от кол-ва товара вида 1|2|3 тоже сделал.

Но вот не могу сделать так, чтобы page=1 товары с 1 по 10, page=2 с 11 по 20 и т.д.

Сделал пока так, чтобы показывались все товары:

<?php


echo "<center>";
$a = 0;
$c = mysql_num_rows($query)/10;

while ($a++ < $c) {
if ($a == $c) break;

echo " <a href='index.php?categoryID=".$categoryID."&category=".$category."&page=".$a."'>$a</a> |"; }
echo "</center>";




echo "<table cellspacing='0' cellpadding='0' border='0' id='catalog'>";



for ($i=0; $i<mysql_num_rows($query); $i++ ) {

$show = mysql_fetch_array($query);

if (isset($show["category"]) != '') {
?>

<tr>
<td width='1%'>
<a href='products_foto/bimg/<?php echo "$show[bimg]";?>' target='_blank'><img border='0' src='products_foto/simg/<?php echo "$show[simg]";?>' alt='<?php echo "$show[fabrika]";?>'></a>
</td>
<td>

<?php
if (isset($show["article"]) != '') {echo "<br>Артикул: <b>$show[article]</b>";}
else echo "";
if (isset($show["type"]) != '') {echo "<br>Тип: <b>$show[type]</b>";}
else echo "";
if (isset($show["h"]) != '') {echo "<br>Высота: <b>$show[h]</b>";}
else echo "";
if (isset($show["w"]) != '') {echo "<br>Ширина: <b>$show[w]</b>";}
else echo "";
if (isset($show["d"]) != '') {echo "<br>Диаметр: <b>$show[d]</b>";}
else echo "";
if (isset($show["l"]) != '') {echo "<br>Длина: <b>$show[l]</b>";}
else echo "";
if (isset($show["lamp"]) != '') {echo "<br>Лампочки: <b>$show[lamp]</b>";}
else echo "";
?>
</td>
</tr>
<?php

}
else echo "";

}



echo "</table>";
?>

Кто-нибудь может наставить на путь истинный?

SZ
На сайте с 17.08.2005
Offline
63
#1

Vit@l, изучите парамерт LIMIT в mysql запросе.

Фактически вам в него надо добавить в конец "..... LIMIT X, Y;"

Где X - это начальная позиция, с которой нужно получить выборку (для первой страницы 0, для второй 10, для третьей 20 и т.д.), а Y - количество элементов (то, сколько нужно отображать на странице).

Sveta Prokopeva
На сайте с 10.05.2006
Offline
99
#2

делайте запрос десяти каких Вам надо строчек и обрабатывайте их полностью

select * from `table` where cat=1 limit 0, 10 - первые 10

select * from `table` where cat=1 limit 10, 20 - от 10 до 20 - для второй странице

Не надо делать запрос всей таблицы а затем хитрыми способоми получать нужные результаты. Это бъёт по производительности.

Vit@l
На сайте с 18.11.2005
Offline
57
#3

Огромное Вам

SZ
На сайте с 17.08.2005
Offline
63
#4

Sveta Prokopeva, немного неверно. Второй параметр - это не до какого номера, а сколько от начального. Т.е. чтобы получить от 10 по 20 включительно - нужно "LIMIT 10,11".

Причем нужно учитывать, что в mysql первая запись идет под позицией ноль.

topy
На сайте с 28.03.2006
Offline
142
#5

сталкивался с такой же ситауцией, и готового решения никто не подсказал, но юзание рук и мозгов привело меня к такому результату... вот код, делающий то, что Вы хотите...

код для ленты новостей


$db=mysql_connect($myserver, $myuser, $mypass); / тут думаю понятно
mysql_select_db($mydb, $db); / тут тоже должно быть понятно
$f=5; / количество новостей на странице

$query=mysql_query("select count(*) from news"); /считаем сколько новостей в базе
$count=mysql_fetch_array($query); /выполняем запрос
$pages = ceil($count[0] / $f); /делим без остатка на количество новостей
if($page=="" or $page=="0") /определяем $HTTP_POST_VARS страницу на которой находимся
{
$lim="0"; /если первая или просто index.php (news.php), то начинаем показывать с нулевой позиции, т,е. с первой новости.
}
else
{
$lim=($page - 1) * $f; /если нет, то вычисляем с кокой новости показывать.
}
$result=mysql_query("SELECT * FROM news order by id desc LIMIT $lim, $f"); /выполняем запрос к базе (обращаем внимание на LIMIT)
$num_results=mysql_num_rows($result); /считаем
for ($i=0; $i<$num_results; $i++) /запускаем цикл (можно и не запускать а сделать через WHILE, но у меня было сделано так
{
$row = mysql_fetch_array($result);
$id = ($row['id']);
$head = stripslashes($row['head']);
$news = stripslashes($row['news']);
$date = stripslashes($row['date']); /вытаскиваем в переменные
$head
echo "<br>";
$news
echo "<br>";
/и т.д. выводим вто, что нам надо
}
print "Всего новостей: <b>$count[0]</b>.<br>Новости: ";
if($count[0]>$f)
{
if(!isset($page))
{
$page="1";
}
for($i = 1; $i <= $pages; $i++)
{
if($i != $page)
{
$r2=$f*$i;
$r1=$r2-($f-1);
if($i==$pages)
{
print ' <a class="link1" href="news.php?page='.$i.'" >['.$r1.'-'.$count[0].']</a>';
}
else print ' <a class="link1" href="news.php?page='.$i.'" >['.$r1.'-'.$r2.']</a>';
}
else
{
$r2=$f*$i;
$r1=$r2-($f-1);
if($i==$pages)
{
print ' <b>['.$r1.'-'.$count[0].']</b>';
}
else print ' <b>['.$r1.'-'.$r2.']</b>';
}
}
} / в этой большой штуке, мы расчитываем все и выводим навигацию для нашего нелегкого дела
mysql_close(); /говорим мускулю дозззвидания

Просьба за код не судить - это лишь пример, и я оставил топикстартеру пищу для ума, а сам показал только лишь принцип кодинга в подобной ситуации. (не знаю может можно проще как-то, но серч по сети так не показал).

Новости коротко и ясно (https://subnews.ru)
Vit@l
На сайте с 18.11.2005
Offline
57
#6

С этим разобрался. Но теперь не могу понять (уже пол дня сижу) со след штукой.

Сделал страничку редактирования товара (обычная HTML форма). Некоторые товары не обладают некоторыми свойствами, т.е. некоторые поля формы просто не заполняются. Записываем это дело в таблицу и... В поле со значением NULL и значением по умолчанию NULL записывается обычный 0, который мне всю жизнь портит.

Как сделать так, чтобы поле получало св-во NULL?

Буду сильно благодарен.

Mmonger
На сайте с 01.12.2005
Offline
165
#7

В свойствах таблицы задать значения по умолчанию. Обрабатывать значения POST-переменных перед записью в базу.

Всё будет хорошо, но мы приложим усилия!
D
На сайте с 13.01.2006
Offline
114
#8

Vit@l, я вам советую идти на специализированные форумы по PHP, там все эти вопросы рассматривались и не раз, и даже не два.

http://www.phpclub.ru - очень качественный ресурс. Отвечают быстро.

topy
На сайте с 28.03.2006
Offline
142
#9

Vit@l, просто в БД поставьте чтобы было пустое значение по дефолту и все, никаких нулей не будет...

deleon
На сайте с 16.09.2004
Offline
173
#10

Ну и не забудьте вставить в конструкцию SELECT оператор SQL_CALC_FOUND_ROWS, чтобы получить общее число записей не ограниченных LIMIT

Пример из собственного рабочего скрипта:


$query_str = "SELECT SQL_CALC_FOUND_ROWS `id`,`url`,`title`,`description`
FROM `abi_sites` WHERE(`status`%10=2)
ORDER BY `id` DESC
LIMIT $START_SITE_ID, 10";
$query_search = mysql_query($query_str);
$query_found_rows = mysql_query("SELECT FOUND_ROWS()AS found_rows");
$TOTAL_SITES = mysql_result($query_found_rows, 0, "found_rows");
mysql_free_result($query_found_rows);

В переменной $TOTAL_SITES содержится общее число записей, не ограниченное конструкцией LIMIT.

12

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