Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как упростить и снизить и время и нагрузку на серв 
:(
    Опции темы
Predator199
  Дата 5.12.2012, 12:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 412
Регистрация: 1.2.2012

Репутация: -3
Всего: -4



Есть массив.
Что нужно:
-Нужно вытащить содержание массива
-Раскодировать.
-Раскодированная часть- массив, из которого нужно вытащить результат и сложить так чтоб можно было подсчитать количество и сделать постраничную навигацию.

Как я сделал:
Код

$id = ($_GET['page']>=2) ? ($_GET['page']-1)*$limit+1 : 1;
$count_player = $db->query("SELECT `id`,`cache_pl` FROM `serv` where status =1");
// Вытаскиваем из запроса (массива) нужное, нужное раскодировываем, из раскодированного(массив) вытаскиваем и слаживаем результат для того чтоб можно было подсчитать и разбить на страницы.
if(is_array($count_player)){
        foreach ($count_player as $ser){
            $ggggh = unserialize(base64_decode($ser->cache_pl));
        foreach ($ggggh as $se){
        $mass[]= Array ( 'id'=>$ser->id, 'name'=>$se['name'],);     
            } 
        }
    }
    $informer_kat ='Всего '.count($mass);

 //Постран навиг
        $page = $_GET['page'];
       $posts = count($mass) ;
        $total = (($posts - 1) / $limit) + 1;
        $total =  intval($total);
        $page = intval($page);
        if(empty($page) or $page < 0) $page = 1;
        if($page > $total) $page = $total;
        $start = $page * $limit - $limit;
        $fin=$id-1;
        $mas_25=$id+$limit; 

        $url ='/index.php?'.(($_GET['pm']=='sear') ? '&pm=sear' : '');
        //Cтрелки вперед
        $pervpage= ($page != 1) ? '<a href='.$url.'&page='. ($page - 1) .'>« предыдущая</a><font color="#a2a2a2">&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;</font>' : '<font color="#a2a2a2">« предыдущая&nbsp;&nbsp;|&nbsp;</font>';
        //Cтрелки назад
        $nextpage= ($page  != $total) ? '<font color="#a2a2a2">&nbsp;&nbsp;&nbsp;|</font>&nbsp;&nbsp;<a href="'.$url.'&page='. ($page + 1) .'">Cледующая »</a>' : '<font color="#a2a2a2">&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;Cледующая »</font>';

        // Находим две ближайшие станицы с обоих краев, если они есть
        if($page - 5 > 0) $page5left = '<a href='.$url.'&pg=2'. ($page - 5) .'>'. ($page - 5) .'</a>&nbsp;&nbsp;';
        if($page - 4 > 0) $page4left = '<a href='.$url.'&page='. ($page - 4) .'>'. ($page - 4) .'</a>&nbsp;&nbsp;';
        if($page - 3 > 0) $page3left = '<a href='.$url.'&page='. ($page - 3) .'>'. ($page - 3) .'</a>&nbsp;&nbsp;';
        if($page - 2 > 0) $page2left = '<a href='.$url.'&page='. ($page - 2) .'>'. ($page - 2) .'</a>&nbsp;&nbsp;';
        if($page - 1 > 0) $page1left = '<a href='.$url.'&page='. ($page - 1) .'>'. ($page - 1) .'</a>&nbsp;&nbsp;';

        if($page + 5 <= $total) $page5right = '&nbsp;&nbsp;<a href='.$url.'&page='. ($page + 5) .'>'. ($page + 5) .'</a>';
        if($page + 4 <= $total) $page4right = '&nbsp;&nbsp;<a href='.$url.'&page='. ($page + 4) .'>'. ($page + 4) .'</a>';
        if($page + 3 <= $total) $page3right = '&nbsp;&nbsp;<a href='.$url.'&page='. ($page + 3) .'>'. ($page + 3) .'</a>';
        if($page + 2 <= $total) $page2right = '&nbsp;&nbsp;<a href='.$url.'&page='. ($page + 2) .'>'. ($page + 2) .'</a>';
        if($page + 1 <= $total) $page1right = '&nbsp;&nbsp;<a href='.$url.'&page='. ($page + 1) .'>'. ($page + 1) .'</a>';
        
        // Вывод меню если страниц больше одной
        if ($total > 1) $gg = $pervpage.$page5left.$page4left.$page3left.$page2left.$page1left.'<b>'.$page.'</b>'.$page1right.$page2right.$page3right.$page4right.$page5right.$nextpage;       


//Разбиваем результат на страницы и выводим в браузер
if(is_array($count_player)){    
    function cmp($a, $b) 
    {
        return ($a['name'] > $b['name']) ? -1 : 1;
    }
    usort($mass, "cmp");
       $i=1;
       foreach ($mass as $pl){
        if($i<= $mas_25 & $i>=$fin){    
            $server_list .='<tr><td id="TD" width="1%" >'.$i.'</td>
                                                   <td id="TD" width="21%" >'.$pl['name'].'</td>
                            </tr>';            
         }
        $i++;    
        }
}  

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

Это сообщение отредактировал(а) Predator199 - 5.12.2012, 13:04
PM MAIL   Вверх
Guedda
Дата 5.12.2012, 13:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Подрывник
****


Профиль
Группа: Завсегдатай
Сообщений: 3137
Регистрация: 27.12.2005
Где: Ростов-на-Дону

Репутация: 13
Всего: 78



Код

// Находим две ближайшие станицы с обоих краев, если они есть
        if($page - 5 > 0) $page5left = '<a href='.$url.'&pg=2'. ($page - 5) .'>'. ($page - 5) .'</a>&nbsp;&nbsp;';
        if($page - 4 > 0) $page4left = '<a href='.$url.'&page='. ($page - 4) .'>'. ($page - 4) .'</a>&nbsp;&nbsp;';
        if($page - 3 > 0) $page3left = '<a href='.$url.'&page='. ($page - 3) .'>'. ($page - 3) .'</a>&nbsp;&nbsp;';
        if($page - 2 > 0) $page2left = '<a href='.$url.'&page='. ($page - 2) .'>'. ($page - 2) .'</a>&nbsp;&nbsp;';
        if($page - 1 > 0) $page1left = '<a href='.$url.'&page='. ($page - 1) .'>'. ($page - 1) .'</a>&nbsp;&nbsp;';
        if($page + 5 <= $total) $page5right = '&nbsp;&nbsp;<a href='.$url.'&page='. ($page + 5) .'>'. ($page + 5) .'</a>';
        if($page + 4 <= $total) $page4right = '&nbsp;&nbsp;<a href='.$url.'&page='. ($page + 4) .'>'. ($page + 4) .'</a>';
        if($page + 3 <= $total) $page3right = '&nbsp;&nbsp;<a href='.$url.'&page='. ($page + 3) .'>'. ($page + 3) .'</a>';
        if($page + 2 <= $total) $page2right = '&nbsp;&nbsp;<a href='.$url.'&page='. ($page + 2) .'>'. ($page + 2) .'</a>';
        if($page + 1 <= $total) $page1right = '&nbsp;&nbsp;<a href='.$url.'&page='. ($page + 1) .'>'. ($page + 1) .'</a>';
        
        // Вывод меню если страниц больше одной
        if ($total > 1) $gg = $pervpage.$page5left.$page4left.$page3left.$page2left.$page1left.'<b>'.$page.'</b>'.$page1right.$page2right.$page3right.$page4right.$page5right.$nextpage;       

порадовало smile Весь этот бред можно сделать в три строки smile

Добавлено @ 13:17
Код

$gg = "";
for ($i = -5; $i < 6; $i++) {
    if (($page + $i) > 0 && ($page + $i) <= $total) {
        $gg .= ($i != 0) ? '<a href='.$url.'&page='. ($page + $i) .'>'. ($page + $i) .'</a>&nbsp;&nbsp;' : '<b>' . $page . '</b>';
    }
}


Это сообщение отредактировал(а) Guedda - 5.12.2012, 13:19


--------------------
Ll 2
PM MAIL WWW ICQ Skype GTalk   Вверх
Predator199
Дата 5.12.2012, 13:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 412
Регистрация: 1.2.2012

Репутация: -3
Всего: -4



Спасибо. Можно ли не разделять по частям (подсчет и вывод массива)? Тут нужно сперва подсчитать количество чтоб можно было разбить на страницы. Никак?
PM MAIL   Вверх
Sanchezzz
Дата 5.12.2012, 16:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1670
Регистрация: 19.11.2006
Где: Voronezh

Репутация: 41
Всего: 60



что бы подсчитать количество в mysql есть функция count( какое не будь поле ) 
но мне больше нравится SQL_CALC_FOUND_ROWS

в общем товарищь повышайте скил поиска по форуму и прокачивайте левел в гугле) "постраничная навигация PHP"


--------------------
Понравился ответ "+" по репе, не забываем закрывать тему, заказы в LS.
PM MAIL Skype GTalk   Вверх
Predator199
  Дата 5.12.2012, 16:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 412
Регистрация: 1.2.2012

Репутация: -3
Всего: -4



Дак дело в том, мне нужно не количество записей подсчитать. То что нужно подсчитать-закодированный массив(подсчитать количество в каждом закодированном массиве).  
1 Нужно раскодировать.
Тут можно не так понять:
-Есть 1 запись, у этой записи раскодировали массив. В этом массиве 4 результата. Если так складывать массивы то я  подсчитаю не 4 в каждом массиве, а только гл массивы=количеству записей если так выражаются. 
-Взяли 4 записи, в каждой записи по 4 массива(раскодированный код). Должно получить 16, а не 4.
Для этого я создаю новый массив, где складываю все подмассивы и считаю их количество, после чего разбиваю на страницы(постр навигация).

Выставляю условие для того чтоб вывести к примеру с 50 массива по 75. И вывожу результат.
В итоге 1 запрос, 3 цикла. Есть ли более простое  решение? smile 

Я вот так формирую url при поиске, нормально:
Код

if(strlen($_POST['sear']) >=2) header('Location: index.php?do=mon'.(($_GET['pm']=='pl') ? '&pm=pl' : '&pm=sear')
    .(($_GET['pm']=='pl') ? ((strlen($get_postip) >=1) ? '&name='.$get_postip.'' : '') : ((strlen($get_postip) >=3) ? '&ip='.$get_postip.'' : ''))
    .(($get_postgame !=='1') ? '&game='.$get_postgame.'' : '').(($get_postcontr !=='1') ? '&contri='.$get_postcontr.'' : '')
    .(($_GET['pm']=='pl') ? (($get_posslot =='0') ? '&bot=0' : '&bot=1') : (($get_posslot !=='1') ? '&slot='.$get_posslot.'' : '')));

 smile 

Это сообщение отредактировал(а) Predator199 - 5.12.2012, 16:52
PM MAIL   Вверх
Aliance
Дата 5.12.2012, 17:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I ♥ <script>
****


Профиль
Группа: Модератор
Сообщений: 6418
Регистрация: 2.8.2004
Где: spb

Репутация: 14
Всего: 137



Денормализуй таблицу и храни в ней же (в другом месте) уже раскодированные записи (части записей), чтобы можно было быстро и одним запросом подсчитать нужные величины.
PM MAIL WWW ICQ Skype   Вверх
Sanchezzz
Дата 5.12.2012, 17:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1670
Регистрация: 19.11.2006
Где: Voronezh

Репутация: 41
Всего: 60



#$%#$%& оптимизация зачем тогда что то оптимизировать "дайте два нет лучше все данные, а дальше мне PHP мне по страничку сделает  smile " 
Прочитайте все таки про mysql LIMIT



--------------------
Понравился ответ "+" по репе, не забываем закрывать тему, заказы в LS.
PM MAIL Skype GTalk   Вверх
Predator199
  Дата 5.12.2012, 17:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 412
Регистрация: 1.2.2012

Репутация: -3
Всего: -4



Aliance,Sanchezzz Можно добавить поле, вести подсчет количество результатов в массиве.
Тогда прибавится время выполнения крона на этот подсчет,чуть позже подумаю...
Спс, за мысль.

Это сообщение отредактировал(а) Predator199 - 5.12.2012, 17:52
PM MAIL   Вверх
Sanchezzz
Дата 5.12.2012, 18:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1670
Регистрация: 19.11.2006
Где: Voronezh

Репутация: 41
Всего: 60



Удачной работы на поле... пойду  smile 


--------------------
Понравился ответ "+" по репе, не забываем закрывать тему, заказы в LS.
PM MAIL Skype GTalk   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0923 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.