Форум программистов, компьютерный форум, киберфорум
PHP для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/2: Рейтинг темы: голосов - 2, средняя оценка - 4.50
rr32btg
0 / 0 / 1
Регистрация: 02.10.2013
Сообщений: 9
1

Код работает не так как задумывалось

02.10.2013, 13:03. Просмотров 450. Ответов 5
Метки нет (Все метки)

Добрый день.Код должен определять количество повторных звонков с одного и того же номера за заданный промежуток времени, которые произошли через интервал менее заданного. Вроде бы по логике вещей все должно работать нормально, но при выборке за любые два дня по отдельности сумма повторных звонков получается больше, чем за эти же два дня, но в одной выборке. На php пишу уже несколько лет, но что то последние пару дней туплю и не могу найти проблему.
вот проблемный кусок кода:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
//постом получаем интервал повторяемости и преобразуем в юникстайм
//интервал приходит в формате дни-часы-минуты
$temp = explode("-", $_POST['freq']); 
$diff = $temp[0]*24*60*60+$temp[1]*60*60+$temp[2]*60;
unset($temp);
 
//cid - номер звонившего
//start - время, когда поступил звонок в unixtimestamp
//$timestamp_1 и $timestamp_2 промежуток времени за который необходимо сделать выборку
$res = mysql_query('SELECT `cid`, `start` FROM `calls` 
  WHERE `start` BETWEEN "'.$timestamp_1.'" AND "'.$timestamp_2.'" 
     AND `cid` != "Anonymous" 
     AND CHAR_LENGTH(`cid`) > 4 
     AND `disposition` IN("COMPLETED", "TRANSFERED", "ANSWERED") ORDER BY `start` ');
 
//переносим результаты в многомерный массив таким образом чтобы одному cid соответствовало несколько start'ов
while ($r = mysql_fetch_assoc($res)) {
  $ret_data[trim($r['cid'])][] = (int)trim($r['start']);
}
//обнуляем счетчик
$total = 0;
//перебираем получившийся массив
foreach ($ret_data as $start) {
  // если массив имеет более одного элемента то перебираем его элементы
  if(count($start) > 1){
    foreach ($start as $v) {
      //если это первый элемент то запоминаем его старт
      if(empty($last_start)){
        $last_start = $v;
       //если разница между временем предыдущего и текущего элементов
       //меньше заданной пользователем то плюсуем счетчик
      }elseif(abs($v - $last_start) < $diff){
        $total++;
      }
    }
  }
  unset($last_start);
}
// ну и собственно вывод $total

Это сильно сильно упрощенный вариант кода(раньше большая часть операций выполнялась на стороне базы), но и он не работает корректно. У кого какие идеи?

PS правильность конвертации границ выборки в юникстайм проверял через date -d @unixtime
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.10.2013, 13:03
Ответы с готовыми решениями:

Выпадающее меню работает не так как задумывалось
Доброго времени суток Выпадающее меню работает не так как задумывалось. ...

Код выполняемый из студии с пометкой debag, работает не так как уже компилированный код
Здравствуйте, столкнулся с такой проблемой. Код выполняемый из студии с пометкой debag, работает не...

Код не работает так, как хотелось бы
В книге есть задача с кодом: #include &quot;stdafx.h&quot; #include &lt;iostream&gt; using namespace std; int...

Код работает не так, как надо
Нужно ввести строку и слово и чтобы выводились порядковые номера слов в строке, совпадающих с...

5
HellsingOva
19 / 20 / 8
Регистрация: 27.11.2010
Сообщений: 323
02.10.2013, 13:45 2
а ты хоть проверил какие данные из базы вернулись?
0
rr32btg
0 / 0 / 1
Регистрация: 02.10.2013
Сообщений: 9
02.10.2013, 14:32  [ТС] 3
Из базы данные возвращаются нормальные. кроме того по подобному запросу делается еще и COUNT(*) для обнаружения общего количества записей и аномалий не наблюдается. Плюс по этому же запросу, но с добавлением AND 'disposition' = 'значение' (таким образом выбираются только отвеченные или не отвеченные звонки) происходит несколько других запросов и в их результатах аномалий тоже не наблюдается.
0
HellsingOva
19 / 20 / 8
Регистрация: 27.11.2010
Сообщений: 323
02.10.2013, 23:17 4
Цитата Сообщение от rr32btg Посмотреть сообщение
foreach ($start as $v) {
//если это первый элемент то запоминаем его старт
if(empty($last_start)){
$last_start = $v;
//если разница между временем предыдущего и текущего элементов
//меньше заданной пользователем то плюсуем счетчик
}elseif(abs($v - $last_start) < $diff){
$total++;

не вижу смысла в проверке
попробуй обнулять
PHP
1
$last_start
1
rr32btg
0 / 0 / 1
Регистрация: 02.10.2013
Сообщений: 9
03.10.2013, 11:14  [ТС] 5
Проблема была не в этом, но спасибо что натолкнули на нужную мысль. Пока пытался написать зачем там if понял истинную проблему. Дело было в том что я не передавал значения последующих элементов в $last_start. кроме того вчера еще пришли идеи по оптимизации, так что еще раз спасибо.
0
HellsingOva
19 / 20 / 8
Регистрация: 27.11.2010
Сообщений: 323
03.10.2013, 12:48 6
Бывает)
0
03.10.2013, 12:48
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.10.2013, 12:48

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Код работает не так, как надо
Нужно ввести строку и слово и чтобы выводились порядковые номера слов в строке, совпадающих с...

Код работает, но не так как надо
Здравствуйте. Нужно, чтобы строка поиска увеличивалась в длине от 0px до 130px при нажатии...

Код на delphi10 работает не так, как в delphi 7
Здравствуйте. Подскажите, пожалуйста, как сделать так, чтобы код работал верно при компиляции...

Код работает не так, как ожидается (найти и исправить ошибки)
#include &lt;stdio.h&gt; #include &lt;conio.h&gt; #include &lt;string.h&gt; char deletika(char a, long ot, long...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.