2016-09-05 2 views
0

Это немного сложно объяснить, особенно в названии - так вот она:Logic Ошибка PHP Looped Массив

Я делаю PHP массив с 12 индексов, по одному для каждого месяца - каждый месяц будет показывать количество просмотров страниц, которые были записаны в месяце, чтобы получить месяц, я использую текущее время UNIX и убираю 2629743 секунды (месяц), каждый раз, когда цикл перемещается, добавляется 2629743 секунды. Это должно затем создайте массив, такой как (1, 4, 5, 9) 1 вид в январе, 4 просмотра в феврале и т. д.

Если нет представлений, мне нужно, чтобы это было как (null, null, 9) поэтому нет просмотров в январе, ни одного в феврале 9 марта - но индексы полностью испорчены, и взгляды идут в wro ng порядок.

Код для цикла:

$Month = 1; // Start with January 
$MonthTimestamp = 2629743; // Start with the time of ONE month from current time 
$ArrayTimeStamp = array(); 
while ($Month <= 12): // Go from January to February 

$Value1 = $now - $MonthTimestamp; 
$ViewsThisMonth = mysqli_fetch_object(mysqli_query($db, "SELECT SUM(Views) AS NumberFinalViews FROM BlogViews WHERE TimeRecord >= '$Value1' AND TimeRecord < '$now'")); 
$ArrayTimeStamp[] = $ViewsThisMonth->NumberFinalViews; 
$MonthTimestamp = $MonthTimestamp + 2629743; 
$Month++; 
endwhile; 

Повторим, массив нужно хранить каждый месяц просмотров страниц, которые хранятся в базе данных, все виды страницы сохраняются с отметкой времени, эти отметки времени должны быть разделены на 12 месяцев, а затем помещаться в массив.

4 взгляда в феврале должны быть во втором индексе, а метка времени будет больше, чем метка в январе, но меньше, чем в марте.

Вся помощь приветствуется !!

Редактировать: $ now Текущее время UNIX в секундах.

+0

Откуда $ теперь исходит? – rahul

+0

Любая причина, по которой вы используете тайную 'endwhile' вместо просто' while (...) {...} '? – tadman

+0

** ПРЕДУПРЕЖДЕНИЕ **: при использовании 'mysqli' вы должны использовать [параметризованные запросы] (http://php.net/manual/en/mysqli.quickstart.prepared-statements.php) и [' bind_param'] (http://php.net/manual/en/mysqli-stmt.bind-param.php), чтобы добавить данные пользователя в ваш запрос. ** НЕ используйте ** интерполирование строк или конкатенацию для выполнения этого, потому что вы создали серьезную [SQL-инъекцию] (http://bobby-tables.com/). – tadman

ответ

0
  1. Вы должны убедиться, столбцы, содержащие данные связанные со временем являются DATETIME или TIMESTAMP колонны. Это упростит запросы, основанные на времени.

  2. Вы можете переместить логику вы реализуете в PHP в самом запросе:

    SELECT SUM(Views) AS NumberFinalViews, 
         EXTRACT(YEAR_MONTH FROM TimeRecord) AS YearMonth 
        FROM BlogViews 
        WHERE TimeRecord BETWEEN '$startMonth' AND '$endMonth' 
    GROUP BY YearMonth 
    

    Если TimeRecord это просто целое число, представляющее метку времени UNIX, вы должны преобразовать его:

    ... 
    EXTRACT(YEAR_MONTH FROM FROM_UNIXTIME(TimeRecord)) AS YearMonth 
    

    Это возвращает результат с полем YearMonth, который имеет такие значения, как 201609 (сентябрь 2016 года), и число Views за этот период, уже предварительно сгруппированные. Вам просто нужно установить $startMonth и $endMonth как абсолютные разделители на весь период, который вы запрашиваете, не нужно делать это за каждый месяц отдельно.

+0

Будет ли $ startMonth и $ endMonth быть целым годовым значением? Таким образом, $ startMonth будет текущим временем - годом, а время окончания - текущее время плюс год? Логика меня убивает. – Mazux2

+0

Да, это будет весь год, который вы пытаетесь запросить. Возможно, вы можете даже упростить это до 'WHERE YEAR (FROM_UNIXTIME (TimeRecord)) = 2016', если вас интересует целый календарный год. – deceze

+0

Не жизнеспособный вариант - запрос полностью убил скорость сервера – Mazux2