|
|
|
| Всем доброго времени суток. Подскажите пожалуйста, как сделать постраничную навигацию для поиска, чтобы после запроса на одной странице не выдавалась целая лента ответов. Есть такая навигация:
<?php
echo $myrow ['text'];
$result77 = mysql_query("SELECT str FROM options", $db);
$myrow77 = mysql_fetch_array($result77);
$num = $myrow77["str"];
// Извлекаем из URL текущую страницу
@$page = $_GET['page'];
// Определяем общее число сообщений в базе данных
$result00 = mysql_query("SELECT COUNT(*) FROM products");
$temp = mysql_fetch_array($result00);
$posts = $temp[0];
// Находим общее число страниц
$total = (($posts - 1) / $num) + 1;
$total = intval($total);
// Определяем начало сообщений для текущей страницы
$page = intval($page);
// Если значение $page меньше единицы или отрицательно
// переходим на первую страницу
// А если слишком большое, то переходим на последнюю
if(empty($page) or $page < 0) $page = 1;
if($page > $total) $page = $total;
// Вычисляем начиная с какого номера
// следует выводить сообщения
$start = $page * $num - $num;
// Выбираем $num сообщений начиная с номера $start
$result = mysql_query("SELECT id,title,description FROM products ORDER BY id LIMIT $start, $num", $db);
$myrow = mysql_fetch_array ($result);
do {
printf ("<table align = 'center' class='products'>
<tr>
<td><p class='products_name'><a href = 'view_products.php?id=%s'>%s</a></p></td>
</tr>
<tr>
<td>%s</td>
</tr>
</table><br><br>", $myrow["id"], $myrow["title"], $myrow["description"]);
}
while ($myrow = mysql_fetch_array ($result));
// Проверяем нужны ли стрелки назад
if ($page != 1) $pervpage = '<a href= products.php?page=1>Первая</a>
<a href= products.php?page='. ($page - 1) .'>Предыдущая</a> ';
// Проверяем нужны ли стрелки вперед
if ($page != $total) $nextpage = ' <a href= products.php?page='. ($page + 1) .'>Следующая</a>
<a href= products.php?page=' .$total. '>Последняя</a>';
// Находим две ближайшие станицы с обоих краев, если они есть
if($page - 2 > 0) $page2left = ' <a href= products.php?page='. ($page - 2) .'>'. ($page - 2) .'</a> | ';
if($page - 1 > 0) $page1left = '<a href= products.php?page='. ($page - 1) .'>'. ($page - 1) .'</a> | ';
if($page + 2 <= $total) $page2right = ' | <a href= products.php?page='. ($page + 2) .'>'. ($page + 2) .'</a>';
if($page + 1 <= $total) $page1right = ' | <a href= products.php?page='. ($page + 1) .'>'. ($page + 1) .'</a>';
// Вывод меню
if ($total > 1)
{
Error_Reporting(E_ALL & ~E_NOTICE);
echo "<div class=\"pstrnav\">";
echo $pervpage.$page2left.$page1left.'<b>'.$page.'</b>'.$page1right.$page2right.$nextpage;
echo "</div>";
}
?>
|
Она отлично работает по разделам....а вот в поиске у меня возникли проблемы..
вот собственно код поиска:
<?php
include ("blocks/bd.php"); /* СОЕДИНЯЕМСЯ С БД */
if (isset($_POST['submit_s'])) {$submit_s = $_POST['submit_s'];}
if (isset($_POST['search'])) {$search = $_POST['search'];}
if (isset ($submit_s))
{
if (empty($search) or strlen($search) < 4)
{
exit ("<p>Поисковый запрос не введён, либо он меньше 4-х символов</p>");
}
$search = trim ($search);
$search = stripslashes ($search);
$search = htmlspecialchars ($search);
}
else
{
exit ("<p>Вы обратились к файлу без необходимых параметров</p>");
}
?>
<p><h3><span style="color: #C03">Найденая информация по запросу: <?php echo "'$search'"; ?></p></span></h3>
<?php
/*ВЫВОДИМ ИНФОРМАЦИЮ ИЗ ТАБЛИЦЫ "АКУСТОМАГНИТНЫЕ ПРОТИВОКРАЖНЫЕ РАМКИ"*/
$result = mysql_query ("SELECT id, title, description FROM akustomagnit_antikrazh_ramki WHERE text LIKE '%$search%'" , $db);
if (!result)
{
echo "<p>Запрос не введён, либо он менее 4-х символов</p>";
exit (mysql_error());
}
if (mysql_num_rows($result) > 0)
{
$myrow = mysql_fetch_array($result);
do
{
printf ("<table align = 'center' class='akustomagnit_antikrazh_ramki'>
<tr>
<td><p class='akustomagnit_antikrazh_ramki_name'><a href = 'view_akustomagnit_antikrazh_ramki.php?id=%s'>%s</a></p></td>
</tr>
<tr>
<td>%s</td>
</tr>
</table><br><br>", $myrow["id"], $myrow["title"], $myrow["description"]);
}
while ($myrow = mysql_fetch_array ($result));
}
else
{
echo "<p>Информация по вашему запросу на сайте не найдена!</p>";
exit ();
}
/*КОНЕЦ ВЫВОДА ИНФОРМАЦИИ ИЗ ТАБЛИЦЫ "АКУСТОМАГНИТНЫЕ ПРОТИВОКРАЖНЫЕ РАМКИ"*/
?>
<?php
/*ВЫВОДИМ ИНФОРМАЦИЮ ИЗ ТАБЛИЦЫ "АВТОМАТИЧЕСКИЕ ВОРОТА"*/
$result = mysql_query ("SELECT id, title, description FROM avt_vorota WHERE text LIKE '%$search%'" , $db);
if (!result)
{
echo "<p>Запрос не введён, либо он менее 4-х символов</p>";
exit (mysql_error());
}
if (mysql_num_rows($result) > 0)
{
$myrow = mysql_fetch_array($result);
do
{
printf ("<table align = 'center' class='avt_vorota'>
<tr>
<td><p class='avt_vorota_name'><a href = 'view_avt_vorota.php?id=%s'>%s</a></p></td>
</tr>
<tr>
<td>%s</td>
</tr>
</table><br><br>", $myrow["id"], $myrow["title"], $myrow["description"]);
}
while ($myrow = mysql_fetch_array ($result));
}
else
{
echo "<p>Информация по вашему запросу на сайте не найдена!</p>";
exit ();
}
/*КОНЕЦ ВЫВОДА ИНФОРМАЦИИ ИЗ ТАБЛИЦЫ "АВТОМАТИЧЕСКИЕ ВОРОТА"*/
?>
|
разумеется это не весь код, ведь смысла нет копировать такие поля как автоматические ворота по 100500 раз, там только названия меняются...
Вообщем я очень запарился уже, помогите пожалуйста сделать постраничную навигацию для этого поиска. Заранее спасибо!!! | |
|
|
|
|
|
|
|
для: Sprinter_One
(11.01.2013 в 11:41)
| | > у меня возникли проблемы.
А проблема в чем? Просто ко второму листингу нужно приделать проверки навигации из первого и к запросу
SELECT id, title, description FROM avt_vorota WHERE text LIKE '%$search%'"
| добавить LIMIT как в первом. | |
|
|
|
|
|
|
|
для: Sfinks
(11.01.2013 в 13:00)
| | я тоже так думал, но проблема в том что в БД есть куча таких таблиц как avt_vorota (Например, domofony). По отдельности всё работает. А когда пытаюсь объеденить, ничего не выходит. | |
|
|
|
|
|
|
|
для: Sprinter_One
(11.01.2013 в 13:04)
| | Вы же ничего об этом не говорите сразу....
Нужно значит искать сразу по всем таблицам. Запрос такого вида примерно:
SELECT * FROM(
SELECT id, title, description FROM table_1 WHERE text LIKE '%$search%'
union all
SELECT id, title, description FROM table_2 WHERE text LIKE '%$search%'
union all
SELECT id, title, description FROM table_3 WHERE text LIKE '%$search%'
union all
SELECT id, title, description FROM table_4 WHERE text LIKE '%$search%'
)t
LIMIT {x},{y}
|
P.S. Но это говорит о не правильной организации структуры БД. | |
|
|
|
|
|
|
|
для: Sfinks
(11.01.2013 в 13:19)
| | спасибо, попробую так....я думал из кода будет понятно что несколько таблиц в БД....в коде 2 приведены (автоматические ворота и акустомагнитные противокражные рамки)... | |
|
|
|
|
 3.3 Кб |
|
|
для: Sprinter_One
(11.01.2013 в 13:24)
| | опять не выходит....я уже совсем запарился и голова не работает....
куда тогда убрать этот код?
$myrow = mysql_fetch_array ($result);
do {
printf ("<table align = 'center' class='products'>
<tr>
<td><p class='products_name'><a href = 'view_products.php?id=%s'>%s</a></p></td>
</tr>
<tr>
<td>%s</td>
</tr>
</table><br><br>", $myrow["id"], $myrow["title"], $myrow["description"]);
}
while ($myrow = mysql_fetch_array ($result));
|
именно на эту часть ругается. а отдельно к каждой таблице она нужна.
к сообщению прикрепляю целый файл, посмотрите пожалуйста, может найдёте ошибку. | |
|
|
|
|
|
|
|
для: Sprinter_One
(11.01.2013 в 14:15)
| | Переделывайте структуру БД. Это будет самым верным решением.
Не должно быть каждый тип товара в отдельной таблице. Должна быть одна таблица "товары" и в ней, кроме прочего, еще поле "тип товара". Соответственно, и один php-обработчик для всех типов товара. Тогда и проблем не будет. Иначе хуже будет. Сейчас путем усложнения запроса и разбора егорезультата можно выкрутиться. Но чем дальше, тем хуже будет. | |
|
|
|
|
|
|
|
для: Sfinks
(11.01.2013 в 14:53)
| | переделал бы, но это не самый лучший вариант....структура идёт типа такого: монитор - модель телефона (тут же описание)...более 20 таблиц переделывать и в каждой из них уже более 15 записей, не вариант....может какой-нибудь альтернативный поиск подойдет? где не нужно будет так сильно затрагивать бд. | |
|
|
|
|
|
|
|
для: Sprinter_One
(11.01.2013 в 16:48)
| | более 20 таблиц переделывать и в каждой из них уже более 15 записей
это мизер, переделывайте пока не поздно | |
|
|
|
|
|
|
|
для: Valick
(11.01.2013 в 17:43)
| | не, такой вариант не подходит... | |
|
|
|
|
|
|
|
для: Sprinter_One
(11.01.2013 в 23:37)
| | Тогда сохраните эту тему в закладки и через пол годика вспомните мои слова =)
Решение такое: добавляете в запрос четвертым полем информацию о том, из какой таблицы товар и дальше в php разбирайте эту кашу.
Запрос такого вида:
SELECT * FROM(
SELECT id, title, description, 'table_1' as table_name FROM table_1 WHERE text LIKE '%$search%'
union all
SELECT id, title, description, 'table_2' FROM table_2 WHERE text LIKE '%$search%'
union all
SELECT id, title, description, 'table_3' FROM table_3 WHERE text LIKE '%$search%'
union all
SELECT id, title, description, 'table_4' FROM table_4 WHERE text LIKE '%$search%'
)t
LIMIT {x},{y}
|
| |
|
|
|
|
|
|
|
для: Sfinks
(12.01.2013 в 09:11)
| | ORDER BY не забыть, использовать mysql_fetch_assoc, предотвращать SQL-инъекции | |
|
|
|