0 / 0 / 1
Регистрация: 02.10.2013
Сообщений: 9
1

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

02.10.2013, 13:03. Показов 611. Ответов 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.10.2013, 13:03
Ответы с готовыми решениями:

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

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

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

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

5
19 / 20 / 8
Регистрация: 27.11.2010
Сообщений: 323
02.10.2013, 13:45 2
а ты хоть проверил какие данные из базы вернулись?
0
0 / 0 / 1
Регистрация: 02.10.2013
Сообщений: 9
02.10.2013, 14:32  [ТС] 3
Из базы данные возвращаются нормальные. кроме того по подобному запросу делается еще и COUNT(*) для обнаружения общего количества записей и аномалий не наблюдается. Плюс по этому же запросу, но с добавлением AND 'disposition' = 'значение' (таким образом выбираются только отвеченные или не отвеченные звонки) происходит несколько других запросов и в их результатах аномалий тоже не наблюдается.
0
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
0 / 0 / 1
Регистрация: 02.10.2013
Сообщений: 9
03.10.2013, 11:14  [ТС] 5
Проблема была не в этом, но спасибо что натолкнули на нужную мысль. Пока пытался написать зачем там if понял истинную проблему. Дело было в том что я не передавал значения последующих элементов в $last_start. кроме того вчера еще пришли идеи по оптимизации, так что еще раз спасибо.
0
19 / 20 / 8
Регистрация: 27.11.2010
Сообщений: 323
03.10.2013, 12:48 6
Бывает)
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
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
Copyright ©2000 - 2023, CyberForum.ru