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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Оптимизировать php-код, use for-for 
:(
    Опции темы
Gumi
Дата 27.3.2012, 12:24 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Здравствуйте.
Погогите пожалуйста мне оптимизировать код. Оооочень медленно работает(((

Код

for($j=0; $j < count($maxm); $j++)
{    
?>
<tr>
<td rowspan=2 width="13%"><span lang="ru">1</span></td> 
<?

for($i=0; $i < count($pn); $i++)
{
$storeProc1 = mssql_init('sp_test;2');
mssql_bind($storeProc1,"@dat1",date($data1.$maxm[$j]."01"), SQLVARCHAR); 
mssql_bind($storeProc1,"@dat2",date($data2.$maxm[$j].$maxd['$j']), SQLVARCHAR); 
mssql_bind($storeProc1,"@item",$pn[$i], SQLVARCHAR); 
mssql_bind($storeProc1,"@item2",$item2, SQLVARCHAR); 
mssql_bind($storeProc1,"@going",$going, SQLVARCHAR); 
$result= mssql_execute($storeProc1);    
$arr1 = mssql_fetch_assoc($result);       
echo  ("<td>" .$arr1["row"]. "</td>"); 
}
?> 
  <td rowspan=2 width="7%" align="center"><?echo $sump;?>&nbsp;</td>
  <td rowspan=2 width="7%" align="center"><?echo $sump;?>&nbsp;</td>
</tr>
<tr>
<?
for($i=0; $i < count($pn); $i++)
{
$storeProc1 = mssql_init('sp_test;2');
mssql_bind($storeProc1,"@dat1",date($data1.$maxm[$j]."01"), SQLVARCHAR); 
mssql_bind($storeProc1,"@dat2",date($data2.$maxm[$j].$maxd['$j']), SQLVARCHAR); 
mssql_bind($storeProc1,"@item",$pn[$i], SQLVARCHAR); 
mssql_bind($storeProc1,"@item2",$item2, SQLVARCHAR); 
mssql_bind($storeProc1,"@going",$going, SQLVARCHAR); 
$result= mssql_execute($storeProc1);    
$arr2 = mssql_fetch_assoc($result);       
echo  ("<td>" .$arr2["row"]. "</td>"); 
}
?>
</tr>
  
<?
}
?>


sql-код работает быстро. я его проверяла с помощью sql anlyzer. 
PM MAIL   Вверх
Fortop
Дата 27.3.2012, 13:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 20
Всего: 42



А можно пояснить в двух словах, что данный код пытается сделать?


--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
Gumi
Дата 27.3.2012, 13:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Суть в формировании таблицы показывающий количество товаров за 12 месяцев. 
поэтому вот так составила алгоритм:
1. for($j=0; $j < count($maxm); $j++) 
перечисляю месяцы
2. для каждого месяца передаю по отдельности код товара
for($i=0; $i < count($pn); $i++)
3. после соответствующих вычислении на сервере возвращается количество.
вид таблицы: 
январь    19635
февраль  5897
март        7524
и т.д.

$maxd - массив значений, содержащий последние дни каждого месяца.
$maxm - массив содержащий  месяцы {01..12}.
$pn (mssql_bind($storeProc1,"@item",$pn[$i], SQLVARCHAR);)- массив из чисел, к-ый передается в хранимку для вычислений такого характера:
Код

     if (@item>3)
     begin
       select @txt=@txt+' AND STATUS LIKE ''2%''' 

        if @item=4  select @txt=@txt+' AND (STATUS LIKE ''__1%'' and STATUS LIKE ''___1%'')'





Это сообщение отредактировал(а) Gumi - 27.3.2012, 13:41
PM MAIL   Вверх
Fortop
Дата 27.3.2012, 13:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 20
Всего: 42



Сделать одним запросом не судьба?

Код

SELECT id,month(date) count|sum(чего-то там) FROM table GROUP BY id, month(date) 


И у вас уже сразу готовая табличка которую надо вывести.

А так у вас 2 * $pn * $maxn запросов. Зачем оно такое надо?


--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
Evghenusi
Дата 27.3.2012, 13:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


майский жук
**


Профиль
Группа: Участник
Сообщений: 506
Регистрация: 3.8.2006
Где: Молдова, Кишинёв

Репутация: 6
Всего: 15



не вникая в код могу посоветовать только "изменить циклы" таким образом:
for($j=0; $j < count($maxm); $j++) => for($j=0, $count=sizeof($maxm); $j < $count; $j++)
хотя прирост в скорости будет не столь значительным smile 
PM WWW   Вверх
Gumi
Дата 27.3.2012, 13:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Fortop @ 27.3.2012,  13:44)
Сделать одним запросом не судьба?

Код

SELECT id,month(date) count|sum(чего-то там) FROM table GROUP BY id, month(date) 


И у вас уже сразу готовая табличка которую надо вывести.

А так у вас 2 * $pn * $maxn запросов. Зачем оно такое надо?

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

Код

CREATE PROC sp_test;2
    @DAT1  SMALLDATETIME,
    @DAT2  SMALLDATETIME,
    @ITEM  tinyint,
    @ITEM2 tinyint,
    @Going tinyint
AS

DECLARE  @TXT VARCHAR(8000)
SET DATEFORMAT DMY 

SELECT @TXT=' SELECT  count(*) as row FROM PLAN_T WHERE DEL = 0'
SELECT @TXT=@TXT+' AND((DATA>='+''''+CAST(@DAT1-1 AS VARCHAR)+''''+' and DATA<'+''''+CAST(@DAT2+1 AS VARCHAR)+''''+'))'  
SELECT @TXT=@TXT+'AND(STATUS LIKE ''_____3%'' OR STATUS LIKE ''_____4%'' OR STATUS LIKE ''_____0%'' OR STATUS LIKE ''_____8%'')'
if (@item>3)
     begin
       select @txt=@txt+' AND STATUS LIKE ''2%''' 

        if @item=4  select @txt=@txt+' AND (STATUS LIKE ''__1%'' and STATUS LIKE ''___1%'')'
end
exec (@TXT)
GO


Это сообщение отредактировал(а) Gumi - 27.3.2012, 14:07
PM MAIL   Вверх
Fortop
Дата 27.3.2012, 14:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 20
Всего: 42



У вас месяц не совпадает с календарным? Тогда да - все туго.
Я бы предложил в таком случае завести в таблице отдельное поле, где вы бы записывали номер интервала. И уже группировать по нему.

А сами интервалы хранить в отдельной таблице id, date_start, date_end


--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
Gumi
Дата 27.3.2012, 14:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Да, поработаю в этом направлении.

Спасибо! 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

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

Важно:

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

Внимание:

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

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

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


 




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


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

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