Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Пара вопросов по навигации
 
 автор: ferz   (06.06.2006 в 16:53)   письмо автору
 
 

Я использую следующую навигацию (привожу код):

<?php
// Устанавливаем соединение с базой данных
include "connect.php";
// Переменная хранит число сообщений выводимых на странице
$num 5;
$pervpage="";
$nextpage="";
$page2left="";
$page1left="";
$page1right="";
$page2right="";
// Извлекаем из URL текущую страницу
$page $_GET['page'];
// Определяем общее число сообщений в базе данных
$result mysql_query("SELECT COUNT(*) as cnt FROM fresh");
$posts=mysql_result($result,0,"cnt");
// Находим общее число страниц
$total intval(($posts 1) / $num) + 1;
// Определяем начало сообщений для текущей страницы
$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 * FROM fresh LIMIT $start$num");
// В цикле переносим результаты запроса в массив $postrow
while ( $postrow[] = mysql_fetch_array($result))
echo 
"<table>";
for(
$i 0$i $num$i++)
{
echo 
"<tr>
         <td>"
.$postrow[$i]['rubrika']."</td>
         <td>"
.$postrow[$i]['zag']."</td></tr>
       <tr><td colspan=\"2\">"
.$postrow[$i]['data']."</td></tr>";
}
echo 
"</table>";
// Проверяем нужны ли стрелки назад
if ($page != 1$pervpage '<a href= ./post.php?page=1><<</a>
                               <a href= ./post.php?page='
. ($page 1) .'><</a> ';
// Проверяем нужны ли стрелки вперед
if ($page != $total$nextpage ' <a href= ./post.php?page='. ($page 1) .'>></a>
                                   <a href= ./post.php?page=' 
.$total'>>></a>';

// Находим две ближайшие страницы с обоих краев, если они есть
if($page 0$page2left ' <a href= ./post.php?page='. ($page 2) .'>'. ($page 2) .'</a> | ';
if(
$page 0$page1left '<a href= ./post.php?page='. ($page 1) .'>'. ($page 1) .'</a> | ';
if(
$page <= $total$page2right ' | <a href= ./post.php?page='. ($page 2) .'>'. ($page 2) .'</a>';
if(
$page <= $total$page1right ' | <a href= ./post.php?page='. ($page 1) .'>'. ($page 1) .'</a>';

// Вывод меню
echo $pervpage.$page2left.$page1left.'<b>'.$page.'</b>'.$page1right.$page2right.$nextpage;

?>

Взята мною была с этого сайта. У меня 2 вопроса:
1) По поводу этого:

// Переменная хранит число сообщений выводимых на странице
$num = 5;

Присваиваем необходимое кол-во выводимых сообщений...

for($i = 0; $i < $num; $i++)
{
echo "<tr>
         <td>".$postrow[$i]['rubrika']."</td>
         <td>".$postrow[$i]['zag']."</td></tr>
       <tr><td colspan=\"2\">".$postrow[$i]['data']."</td></tr>";
}

А вот в цикле выводим значения. А если у меня в таблице вдруг окажется меньше записей, чем мы хотим выводить на одной странице, то возникает ошибочка. Как исправить?
2) ВОПРОС ПОВАЖНЕЕ:
Для того, чтобы выбрать нужное кол-во записей на страницу, в запросе используется LIMIT:

$result = mysql_query("SELECT * FROM fresh LIMIT $start, $num");

С одной таблицей все ясно. А мне нужно брать данные из 2-х таблиц ( старые статьи и новые статьи). Как в таком случае быть???
Заранее благодарен.

   
 
 автор: cheops   (06.06.2006 в 19:41)   письмо автору
 
   для: ferz   (06.06.2006 в 16:53)
 

1) Что за ошибка?
2) Для этого необходимо воспользоваться двухтабличным запросом
<?php
$query 
"SELECT fresh.*, old.* FROM fresh, old GROUP BY id LIMIT $start$num";
$result mysql_query($query);
?>

   
 
 автор: ferz   (06.06.2006 в 20:19)   письмо автору
 
   для: cheops   (06.06.2006 в 19:41)
 

По поводу первого вопроса:
Выводится примерно следующее:
Notice: Undefined offset: 3 in z:\home\localhost\www\vestnik\post.php on line 37
Notice: Undefined offset: 3 in z:\home\localhost\www\vestnik\post.php on line 38
Notice: Undefined offset: 3 in z:\home\localhost\www\vestnik\post.php on line 39
Notice: Undefined offset: 4 in z:\home\localhost\www\vestnik\post.php on line 37
Notice: Undefined offset: 4 in z:\home\localhost\www\vestnik\post.php on line 38
Notice: Undefined offset: 4 in z:\home\localhost\www\vestnik\post.php on line 39
Т.е. в этих строчках:

<td>".$postrow[$i]['rubrika']."</td>
         <td>".$postrow[$i]['zag']."</td></tr>
       <tr><td colspan=\"2\">".$postrow[$i]['data']."</td></tr>";

ПО ВТОРОМУ ВОПРОСУ:
Поменял строчку

$result = mysql_query("SELECT * FROM fresh LIMIT $start, $num");

на то, что посоветовали вы:

$result = mysql_query("SELECT fresh.*, articles.* FROM fresh, articles GROUP BY id LIMIT $start, $num");

В результате ошибка:
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in z:\home\localhost\www\vestnik\post.php on line 32
Т.е. в этой строке:

while ( $postrow[] = mysql_fetch_array($result))

   
 
 автор: cheops   (07.06.2006 в 01:07)   письмо автору
 
   для: ferz   (06.06.2006 в 20:19)
 

1)notice является своеобразным советом и выводится, когда выставлена максимальная чувствительность PHP к ошибкам - её следует понизить, как это сделано на всех хостингах, иначе они не дадут работать. Для этого, следует выставить соответствующее значение для директивы error_reporting http://www.softtime.ru/info/articlephp.php?id_article=23, в конфигурационном файле php.ini
error_reporting = E_ALL & ~E_NOTICE  

Так же можно изменить уровень обработки ошибок локально, для этого в начало скрипта следует поместить функцию
<?php 
Error_Reporting
(E_ALL & ~E_NOTICE); 
?>

В качестве параметра, которой передать соответствующий уровень обработки ошибок.

2) Сразу после выполнения SQL-запроса
<?php
  $result 
mysql_query("SELECT * FROM fresh LIMIT $start$num");
?>

поставьте проверку
<?php
  
if(!$result) exit("Ошибка - ".mysql_error());
?>

   
 
 автор: ferz   (07.06.2006 в 10:46)   письмо автору
 
   для: cheops   (07.06.2006 в 01:07)
 

Ошибка - Column 'id' in group statement is ambiguous

   
 
 автор: cheops   (07.06.2006 в 12:03)   письмо автору
 
   для: ferz   (07.06.2006 в 10:46)
 

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

   
 
 автор: ferz   (07.06.2006 в 13:27)   письмо автору
 
   для: cheops   (07.06.2006 в 12:03)
 

id int(11) auto_increment
rubrika text - рубрика
zag text - заголовок статьи
body text - текст статьи
data date - дата
pic text - изображение
avtor text - автор
Обе таблицы с такими полями
Мне надо выбирать статьи,нужной рубрики в таблицу. Вот я написал запрос таким образом:

<?
$query 
"SELECT fresh.*, articles.* FROM fresh, articles WHERE rubrika='$rub' GROUP BY id LIMIT $start$num ";
?>

Но он не работает...

   
 
 автор: cheops   (07.06.2006 в 21:40)   письмо автору
 
   для: ferz   (07.06.2006 в 13:27)
 

Погодите... это копии друг друга? Тогда вам вероятно нужно их объединение, а не пересечение
SELECT * FROM fresh WHERE rubrika='$rub'
UNION
SELECT * FROM articles WHERE rubrika='$rub'

   
 
 автор: ferz   (08.06.2006 в 08:56)   письмо автору
 
   для: cheops   (07.06.2006 в 21:40)
 

Большое спасибо! Теперь все работает

   
 
 автор: ferz   (09.06.2006 в 11:43)   письмо автору
 
   для: ferz   (08.06.2006 в 08:56)
 

У меня тут по ходу появился еще 1 вопрос: Вот вывел я из двух таблиц (старые статьи и новые статьи) данные в таблицу на странице. Мне нужно при нажатии на заголовок статьи вывести эту статью. Я делал так, но только в случае с одной таблицей (передавал значение первичного ключа через GET). А как с двумя? Что передать через GET?

   
 
 автор: cheops   (09.06.2006 в 12:00)   письмо автору
 
   для: ferz   (09.06.2006 в 11:43)
 

А в таблицах id не уникален? Т.е. в каждой таблице id начинается с 1? Если так, то можно передать второй параметр который будет указывать архивная эта таблица или актуальная.

   
 
 автор: ferz   (09.06.2006 в 12:21)   письмо автору
 
   для: cheops   (09.06.2006 в 12:00)
 

Да, id не уникален. А что присваивать второму параметру? Я с помощью запроса выбрал записи из обеих таблиц, и как я узнаю потом, откуда эта запись была взята?

   
 
 автор: Trianon   (09.06.2006 в 12:32)   письмо автору
 
   для: ferz   (09.06.2006 в 12:21)
 

Второму параметру присваиваете номер таблицы. 1 - если из новых, 2 - если из старых.
Запрос переделываете так, чтобы номер таблицы был доступен.
SELECT 1 as tab, * FROM fresh ....
UNION
SELECT 2 as tab, * FROM articles .....

   
 
 автор: Trianon   (09.06.2006 в 12:00)   письмо автору
 
   для: ferz   (09.06.2006 в 11:43)
 

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

   
 
 автор: ferz   (09.06.2006 в 14:42)   письмо автору
 
   для: Trianon   (09.06.2006 в 12:00)
 

Сделал так, как вы сказали:

<?
$query 
"SELECT 1 AS tab,* FROM fresh WHERE rubrika='$rub' AND data<=NOW() UNION SELECT 2 AS tab,* FROM articles WHERE rubrika='$rub' AND data<=NOW() LIMIT $start$num ";
?>

Не работает. А вообще, че за смысл? Он наверное пытается выбрать значения столбца "1", которого нет... Или я че-то не догоняю

   
 
 автор: Trianon   (09.06.2006 в 15:14)   письмо автору
 
   для: ferz   (09.06.2006 в 14:42)
 

Значит так:
<? 
$query 
"SELECT 1 AS tab, fresh.* FROM fresh WHERE rubrika='$rub' AND data<=NOW() 
UNION 
SELECT 2 AS tab, articles.* FROM articles WHERE rubrika='
$rub' AND data<=NOW() LIMIT $start$num "
?>

   
 
 автор: ferz   (09.06.2006 в 16:06)   письмо автору
 
   для: Trianon   (09.06.2006 в 15:14)
 

О, спасибо!!! Теперь работает

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования