Постраничный ввод

raizus

Новичок
Постраничный ввод

Скрипт работает. Но вот можно ли его сделать проще. Приходится делать 2 запроса.

PHP:
<?

echo "Новости<br>";
//  Подключаемся к базе данных
$bdyas=@mysql_connect($bdhost,$bduser,$bdpass) or die("Не возможно установить соединение с сервером.");
@mysql_select_db("fanclub", $bdyas) or die("Не возможно выбрать базу данных "); 

// Для Mysql 4.1 и выше ставлю для кодировки
mysql_query("SET NAMES cp1251");


// Подсчитываю количесто тем
$request = "SELECT * FROM news";
$com=mysql_query($request);
if($com){
$str=0;
while($row=mysql_fetch_array($com)){
$str++;
}
}


// Новости выводить нужно по 5 строк на странице. (р) это страница передаётся через адрес. ?p=
if($p==""){$pa=0;}
else {$p--; $pa=$p*5;}


// Запрос с учётом необходимой информации. т.е. если страница номер 3 то выводить с 14 строки. именуя 0
$request = "SELECT * FROM news LIMIT $pa, 5";
$com=mysql_query($request);

// отображаем
if($com){
while($row=mysql_fetch_array($com)){echo "<br>".$row['title'];}
	} 
else 
	{
echo "Не возможно найти базу!";
	}

// Считаем страницы и делаем ссылки
echo "<br>";
$st=$str/5;
if($str%5!="0"){$st++;}
for($i=1;$i<=$st;$i++){
echo " [<a href='?id=news&p=$i'>$i</a>] ";
}



mysql_close($bdyas);

?>
 

Фанат

oncle terrible
Команда форума
Приходится делать 2 запроса
ну и что?

-~{}~ 06.11.06 18:17:

2 запроса, как и 20 - это не проблема.
Но вот то, как ты считаешь количество тем - достойно увековечения в анналах истории.

Я открою тебе одну маленькую тайну.
База данных - это не набор счётных палочек, к которым ты привык.
И чтобы посчитать количество записей, не обязательно их все перебирать по одной.
База данных может это сделать за тебя. запросом
SELECT count(*) FROM news
 

phprus

Moderator
Команда форума
// Подсчитываю количесто тем
$request = "SELECT * FROM news";
$com=mysql_query($request);
if($com){
$str=0;
while($row=mysql_fetch_array($com)){
$str++;
}
}
Это что за извращение? Читай про исполльзование оператора count в запросах.

По просьбе фаната убрал ссылку на функцию которой тут действительно не место.

P.S. Душить меня не надо.
 

AlbertTheII

Новичок
SELECT SQL_CALC_FOUND_ROWS * FROM news LIMIT $pa, 5
+
SELECT FOUND_ROWS()
будет на пару ms быстрее работать
 

phprus

Moderator
Команда форума
AlbertTheII
"Преждевременная оптимизация есть корень всех зол."
"Оптимизация имеет смысл только тогда, когда она имеет смысл."

Кроме этого советую почитать статью http://rsdn.ru/article/philosophy/Optimization.xml.
 

raizus

Новичок
Большое спасибо.

Вот что получилось. Работает.
$com=mysql_query("SELECT count(*) FROM news");
$d=mysql_result($com, 0);
echo $d;
 

AlbertTheII

Новичок
Автор оригинала: phprus
AlbertTheII
"Преждевременная оптимизация есть корень всех зол."
"Оптимизация имеет смысл только тогда, когда она имеет смысл."

Кроме этого советую почитать статью http://rsdn.ru/article/philosophy/Optimization.xml.
я думаю "черезмерно" применимо к ситуации, когда стоимость процесса оптимизации несоразмерна результату
 

phprus

Moderator
Команда форума
AlbertTheII
Статью ты явно не читал.
Оптимизация имеет смысл только тогда, когда она имеет смысл. И если это происходит, то смысл оптимизации действительно значим; но не увлекайтесь ею чрезмерно. Даже если вы знаете что есть смысл в оптимизации, сначала найдите, где есть место в коде для применения оптимизации. Без дополнительной информации о производительности вы не будете точно знать, что оптимизировать, поэтому все ваши усилия могут быть направлены не в то русло. В результате вы получите невразумительный код, который нельзя ни поддерживать, ни сопровождать, ни отлаживать, и который к тому же не решает ваших проблем. Такие последствия выражаются, во-первых, в увеличении стоимости разработки и сопровождения кода, а во-вторых, в отсутствии всякого реального улучшения производительности.
 

Фанат

oncle terrible
Команда форума
AlbertTheII
в принципе, с одной стороны, ты прав.
Запрос может быть тяжёлым, и тягать его два раза будет лишней нагрузкой.

Но с другой стороны, если запрос тяжёлый, то надо его и оптимизировать.
А когда он станет быстрым, то и дополнительный уже не будет играть роли
 

raizus

Новичок
Ещё вопросик:

Как правильно?
SELECT * FROM news ORDER BY CAST(data AS DATE) DESC LIMIT $pa, 5

или

SELECT * FROM news ORDER BY 'data' DESC LIMIT $pa, 5

Я сделал по первому принципу.
 

Фанат

oncle terrible
Команда форума
сдаётся мне, что первый вариант - бессмысленный.

-~{}~ 08.11.06 13:42:

второй, впрочем (если только это не какой-то шустрый браузер кавычки заменил) - и вовсе ничего не сортирует
 

raizus

Новичок
Плохо вам сдается. 1 работает, 2 без кавычек тоже.

А как лучше?
 

Фанат

oncle terrible
Команда форума
ты по-русски плохо понимать?
бессмысленный - это не значит "не работает"
Это значит, что если всё работает без CASТ, то зачем оно вообще нужно?
Ты можешь объяснить? Хотя бы себе?
 

raizus

Новичок
Просто в большинстве примеров у меня используется именно 1 вариант.

Но всё равно спасибо за ответ.
 

raizus

Новичок
В 2 книгах, и на 1 сайте. А больше я ни где не видел примеры.

Нужно будет купить ещё книжку на русском. А то у меня Английские.
 

ilias_n

Новичок
Автор оригинала: Фанат
ну и что?

-~{}~ 06.11.06 18:17:

2 запроса, как и 20 - это не проблема.
Но вот то, как ты считаешь количество тем - достойно увековечения в анналах истории.

Я открою тебе одну маленькую тайну.
База данных - это не набор счётных палочек, к которым ты привык.
И чтобы посчитать количество записей, не обязательно их все перебирать по одной.
База данных может это сделать за тебя. запросом
SELECT count(*) FROM news
для mySQL Вы 100% правы
но такой подход применим не ко всем серверам баз данных
на некоторых например InterBase(FireBird) count(*) по большому набору данных часто непозволительно тяжелая для сервера роскошь
 
Сверху