(PERL) постраничный вывод

yarnik
Дата: 12.09.2006 12:45:09
надо:
1. отобразить номера страниц подходящих под запрос
2. отобразить данные на странице
как вариант придумал вот так, что то лучше может быть?
$count = $dbh->selectrow_array("SELECT COUNT(*) FROM user WHERE city=".$dbh->quote($city));
$lists=int($count/10);
if ($lists < $count/10) { $lists++; }
for ($list=1;$list<=$lists;$list++) { print $list; }
$sth = $dbh->prepare("SELECT *  FROM user WHERE city=".$dbh->quote($city)." LIMIT ".$list*10-10." , ".$list*10);
$sth->execute;
yarnik
Дата: 12.09.2006 13:42:03
и еще вот такой вариант, интересно какой будет приемлемее с учетом того что в базе 2000 записей
$sth = $dbh->prepare("SELECT *  FROM user WHERE city=".$dbh->quote($city));
$sth->execute;
if ($list eq "") { $list=1; }
$count=1;
while ( @row = $sth->fetchrow_array ) {
  if ($count <= 10) {
    if ($count == 11) { $count=1; }
    if ($count == 1) { print $list; $list++; push @table,"$_"; }
    else { push @table,"$_"; }
  }
  else { print $list; }
$count++;
}
Black
Дата: 14.09.2006 10:10:12
используйте LIMIT

p.s. не используйте звездочку в выражение SELECT, перечисляйте поля, которые надо выбрать самостоятельно
yarnik
Дата: 14.09.2006 11:25:17
то есть первый вариант верный и лучше ничего придумать нельзя?
я делаю успехи :)
а то что тут $sth = $dbh->prepare("SELECT * FROM user WHERE надо использовать поля я знаю, просто написал для удобство читаемости
Black
Дата: 14.09.2006 11:38:30
yarnik
то есть первый вариант верный и лучше ничего придумать нельзя?

А зачем что-то придумывать, если разработчики уже позаботились... от Вас требуется лишь правильно рассчитать стартовое и конечное значение LIMIT
yarnik
Дата: 14.09.2006 12:06:30
аха, и записать правильно, над чем сейчас и бьюсь.
неужели оно в середине считать никак не хочет?
LIMIT ".$list*10-10." , ".$list*10);
Anjey aka PM
Дата: 14.09.2006 12:32:07
yarnik
аха, и записать правильно, над чем сейчас и бьюсь.
неужели оно в середине считать никак не хочет?
LIMIT ".$list*10-10." , ".$list*10);


MySQL SELECT Syntax
SELECT
    [ALL | DISTINCT | DISTINCTROW ]
      [HIGH_PRIORITY]
      [STRAIGHT_JOIN]
      [SQL_SMALL_RESULT] [SQL_BIG_RESULT] [SQL_BUFFER_RESULT]
      [SQL_CACHE | SQL_NO_CACHE] [SQL_CALC_FOUND_ROWS]
    select_expr, ...
    [FROM table_references
    [WHERE where_condition]
    [GROUP BY {col_name | expr | position}
      [ASC | DESC], ... [WITH ROLLUP]]
    [HAVING where_condition]
    [ORDER BY {col_name | expr | position}
      [ASC | DESC], ...]
    [LIMIT {[offset,] row_count | row_count OFFSET offset}]
    [PROCEDURE procedure_name(argument_list)]
    [INTO OUTFILE 'file_name' export_options
      | INTO DUMPFILE 'file_name'
      | INTO @var_name [, @var_name]]
    [FOR UPDATE | LOCK IN SHARE MODE]]

отсюда вывод: учите мат.часть и выглядеть ваш кусочек будет так:

"LIMIT ".($list-1)*10.", 10"

либо

"LIMIT 10 OFFSET ".($list-1)*10

Следует напомнить что оффсет появилось в более поздних версиях
yarnik
Дата: 14.09.2006 13:15:29
огромное спасибо!
так работает
$sth = $dbh->prepare("SELECT * FROM user WHERE tip=".$dbh->quote($req)." AND city != '' ORDER BY view DESC LIMIT 10 OFFSET ".($list-1)*10);
а вот 1-й вариант работать отказался :((
Anjey aka PM
Дата: 14.09.2006 13:18:45
yarnik
огромное спасибо!
так работает
$sth = $dbh->prepare("SELECT * FROM user WHERE tip=".$dbh->quote($req)." AND city != '' ORDER BY view DESC LIMIT 10 OFFSET ".($list-1)*10);
а вот 1-й вариант работать отказался :((


я брал доку от 5-ки, возможно в старших версиях что-нить не так, но ОООЧЕНЬ МАЛОВЕРОЯТНО :)