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

Форум MySQL

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

 

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

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

тема: Вывести список пользователей из базы данных, отсортированных по количеству постов
 
 автор: Елена Смирнова   (17.12.2007 в 15:18)   письмо автору
 
 

Есть таблица:

id login pass post

Помогите вывести
все логины отсортированные по кол-ву постов (post)
по 10 штук на страницу... с удобной навигацией, как это делается?
Заранее блогадарю!

   
 
 автор: Unkind   (17.12.2007 в 15:22)   письмо автору
 
   для: Елена Смирнова   (17.12.2007 в 15:18)
 

Часть запроса (без LIMIT):
SELECT `login` FROM `tbl` ORDER BY `post` DESC ...
, где tbl - имя таблицы

О постраничной навигации уже говорили не один раз

   
 
 автор: Елена Смирнова   (17.12.2007 в 15:33)   письмо автору
 
   для: Unkind   (17.12.2007 в 15:22)
 

Unkind , что значит без " (без LIMIT)" разве он тут нужен?

   
 
 автор: sim5   (17.12.2007 в 15:45)   письмо автору
 
   для: Елена Смирнова   (17.12.2007 в 15:33)
 

При постраничной навигации будет нужен. Почитайте по ссылкам представленным.

   
 
 автор: Елена Смирнова   (17.12.2007 в 16:01)   письмо автору
 
   для: sim5   (17.12.2007 в 15:45)
 

Перебираю сейчас по поиску все примеры постраничной навигации...
И никак не могу понять ( буду дальше ща разбираться...
А вообще у меня задача немного иная... мне нужна постраничная навигация для поиска...
Тоесть есть БД

id login pass post hobbi

В hobbi находятся русские слова... (интересы пользователя)
Нужно сделать форму для поиска по интересам и выводить найденное
в виде login - (post) по 10 ссылок на страницу и сортировать это по кол-ву post

   
 
 автор: Елена Смирнова   (17.12.2007 в 16:06)   письмо автору
 
   для: Елена Смирнова   (17.12.2007 в 16:01)
 

Вот нашла подобный пример но не пойму как его для себя переделать?
http://softtime.ru/forum/read.php?id_forum=1&id_theme=31636

Тока у меня SQLlite а MySQL

   
 
 автор: sim5   (17.12.2007 в 16:09)   письмо автору
 
   для: Елена Смирнова   (17.12.2007 в 16:01)
 

Вот об этом вам Unkind и написал. Если вам нужно будет выводить постранично, то, например, LIMIT 10, 10 в запросе, выведет 10 записей начиная с записи №10. Есть в приведенных ссылках о постраничной навигации и очень много, эта тема действительно многократно подымалась на форуме.

   
 
 автор: Unkind   (17.12.2007 в 16:09)   письмо автору
 
   для: Елена Смирнова   (17.12.2007 в 16:01)
 

Предварительно нужно установить индекс FULLTEXT на поле "hobby" (удобнее всего в phpMyAdmin). Тогда в запрос добавится условие(я):
SELECT * FROM `tbl` WHERE MATCH(`hobby`) AGAINST('хобби') ORDER BY `post` DESC ...

Ссылки в постраничной навигации должны содержать помимо номера страницы еще данные запроса.

   
 
 автор: Елена Смирнова   (17.12.2007 в 16:13)   письмо автору
 
   для: Unkind   (17.12.2007 в 16:09)
 

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

   
 
 автор: Unkind   (17.12.2007 в 16:34)   письмо автору
 
   для: Елена Смирнова   (17.12.2007 в 16:13)
 

Попробуйте это:

<?php
function maxpage($total$onpage)
{
    global 
$page;

    if( 
$total )
    {
        
$maxpage = (int) (($total $onpage) ? ($total $onpage) : ($total $onpage 1));
        if(
$page $maxpage$page $maxpage;
        if(
$page 0$page 0;
    }
    else
    {
        
$maxpage $page 0;
    }

    return 
$maxpage;
}

function 
limit($page$onpage)
{
    return (
$page $onpage) . ', ' $onpage;
}

function 
pages($page$maxpage$onpage$links_qty 2$query ''$path '')
{
    
$links = array();
    
$path = empty( $path ) ? $_SERVER['PHP_SELF'] : $path;

    if(
$page $links_qty 1)
    {
        
$links[] = "<a href='" $path "?" $query "'>1</a>";
        
$links[] = "...";

        for(
$i $page $links_qty$i $page$i++)
        {
            
$links[] = "<a href='" $path "?page=" $i "&amp;" $query "'>" . ($i 1) . "</a>";
        }
    }
    else
    {

        for(
$i 0$i $page$i++)
        {
            
$links[] = "<a href='" $path "?page=" $i "&amp;" .  $query "'>" . ($i 1) . "</a>";
        }
    }

    if(
$page $links_qty $maxpage)
    {
        for(
$i $page$i <= $page $links_qty$i++)
        {
            if(
$page == $i$links[] = $i 1;
            else 
$links[] = "<a href='" $path "?page=" $i "&amp;" .  $query "'>" . ($i 1) . "</a>";
        }

        if(
$maxpage $i != 0$links[] = "...";
        
$links[] = "<a href='" $path "?page=" $maxpage "&amp;" .  $query "'>" . ($maxpage 1) . "</a>";
    }
    else
    {
        for(
$i $page$i <= $maxpage$i++)
        {
            if(
$page == $i$links[] = $i 1;
            else 
$links[] = "<a href='" $path "?page=" $i "&amp;" .  $query "'>" . ($i 1) . "</a>";
        }
    }

    if( 
count($links) == )
    {
        return;
    }

    echo 
implode(' '$links) . "<br />\r\n";
}

$onpage 10;
$q 'софттайм';
$logic 'AND';

$page = isset( $_GET['page'] ) ? (int) $_GET['page'] : 0;
$q = isset( $_REQUEST['q'] ) ? (string) $_REQUEST['q'] : '';
$logic = isset( $_REQUEST['logic'] ) ? (string) $_REQUEST['logic'] : false;

if( !
in_array($logic, array('AND''OR')) )
{
    
$logic 'AND';
}

if( 
get_magic_quotes_gpc() )
{
    
$q stripslashes$q );
}

$escape_array = array(
"\x2a" => ""//*
"\x22" => ""//"
"\x2b" => ""//+
"\x2d" => ""//-
"\x7e" => ""//~
"\x28" => ""//(
"\x29" => ""//)
"\x3c" => ""//<
"\x3e" => ""  //>
);

$q preg_replace('/\s/'' '$q);
$q preg_replace('/ {2,}/'' '$q);
$q trim$q );
$q explode(' '$q);

for(
$i 0$part_of_query ''$sep ''$i count$q ); $i++, $sep $logic)
{
    
$part_of_query .= $sep " MATCH(`hobby`) AGAINST('" mysql_escape_string(strtr($q[$i], $escape_array)) . "' IN BOOLEAN MODE) ";
}

if( !(
$sql mysql_query("SELECT COUNT(*) FROM `tbl` WHERE " $part_of_query ";")) )
{
    die( 
'Failure: ' mysql_error() . ', File: ' __FILE__ ', Line: ' __LINE__ );
}

$total mysql_result($sql0);

if( 
$total )
{
    
$maxpage maxpage($total$onpage);
    
$limit limit($page$onpage);

    if( !(
$sql mysql_query("SELECT * FROM `tbl` WHERE " $part_of_query " ORDER BY `post` DESC LIMIT " $limit ";")) )
    {
        die( 
'Failure: ' mysql_error() . ', File: ' __FILE__ ', Line: ' __LINE__ );
    }
    
    
// Выведение результатов

    
while( $match mysql_fetch_assoc($sql) )
    {
        
print_r$match );
    }

    
// Ссылки для постраничной навигации
    
pages($page$maxpage$onpage2'q=' urlencode(implode(' '$q)) . '&amp;logic=' $logic$_SERVER['PHP_SELF']);
}
else
{
    echo 
'No matches';
}
?>


P.S. Правильно "hobby", а не "hobbi". Если считаете наоборот, то правьте код...
P.P.S. К сожалению, нет времени проверить работоспособность.
P.P.P.S. В самом начале, конечно, должно быть соединение с СУБД. И выбор БД.

   
 
 автор: Елена Смирнова   (17.12.2007 в 16:52)   письмо автору
 
   для: Unkind   (17.12.2007 в 16:34)
 

Сделала FULLTEXT, добавила 2-ум юзерам в hobby слово "софттайм" - результат: No matches

   
 
 автор: Unkind   (17.12.2007 в 17:05)   письмо автору
 
   для: Елена Смирнова   (17.12.2007 в 16:52)
 

Измените часть кода:

<?php

//...

$page = isset( $_GET['page'] ) ? (int) $_GET['page'] : 0
$q = isset( $_REQUEST['q'] ) ? (string) $_REQUEST['q'] : ''
$logic = isset( $_REQUEST['logic'] ) ? (string) $_REQUEST['logic'] : false;

$onpage 10
$q 'софттайм'
$logic 'AND'

// ...
?>

   
 
 автор: Елена Смирнова   (17.12.2007 в 18:38)   письмо автору
 
   для: Unkind   (17.12.2007 в 17:05)
 

Unkind, огромное спасибо!
Работает, но выдает разобранный по полкам массив:

Array ( [datar] => 20071216 
[from] => 
[tel] => 
[mail] => 
[hobbi] => софттайм 
[info] => 
[regdata] => 
[post] => 0 
[money] => 0 
[pol] => 1 
[xdatar] => 0 
[xpol] => 0 
[xtel] => 0 
[xmail] => 0 
[ip] => [rat] => 0 
[time] => 200712161917 
[online] => 0 )

Как сделать чтобы он показал только логин и кол-во постов (login,post)

Пробовала так:
<?
echo $match['login'];
?>

безуспешно.

   
 
 автор: Unkind   (17.12.2007 в 18:51)   письмо автору
 
   для: Елена Смирнова   (17.12.2007 в 18:38)
 

Вы уверены? Должно быть всё нормально.

<?php
// ...

    
while( $match mysql_fetch_assoc($sql) ) 
    { 
        echo 
"Логин: " htmlspecialchars($match['login']), " Кол-во постов: " $match['post'] . "<br />\r\n"
    }

// ...
?>


P.S. htmlspecialchars() не должен применяться перевод вводом данных в БД. Это на тот случай, если вместо <, >, & или " будут появляться &lt;, &gt;, &amp;, &quot;.
P.P.S. А поле "login" вообще есть в структуре таблицы? В дампе массива, что Вы показали его нет.

   
 
 автор: Елена Смирнова   (17.12.2007 в 20:49)   письмо автору
 
   для: Unkind   (17.12.2007 в 18:51)
 

Unkind, большое Вам спасибо!
Вы мне очень помогли!
Все работает!
Это самая главная часть моей социальной сети )
Терь буду пытаться сделать поиск по другим критериям, по возрасту например.

   
Rambler's Top100
вверх

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