MySQL — выберите данные, где отметка времени

У меня есть кусок кода, который выберет x количество дней в будущем и распечатает его.

Затем я пытаюсь выбрать данные из этих временных меток и распечатать соответственно:

Ниже я выбираю количество дней в будущем, которое должно зацикливаться ($max) и сколько там строк / данных ($data["cnt"])

    $stmt=$dbh->prepare("select round((expire - unix_timestamp()) / 86400) as days, count(*) as cnt from xeon_users_rented WHERE user_by=:username group by days;");
$stmt->bindParam(":username",$userdata['username']);
$stmt->execute();
$data=$stmt->fetchAll();
$max = max(array_map(function($d){
return $d['days'];
}, $data));

$expireData = array();

Затем я перебираю x количество дней в будущем и распечатываю: (Допустим, что $x is = 10)

for($x = 0; $x <= $max; $x++){
if ($data[$x]["cnt"] > 0){
$expireData[]  = $data[$x]["cnt"];
}else{
$expireData[] = 0;
}

$stamp = strtotime('+'.$x.' day', time());
$expireDays[] = date("Y/m/d", $stamp);

}

Затем я распечатываю данные о днях и данные:

<?php echo implode("', '", $expireDays); ?>
<?php echo implode("', '", $expireData); ?>

Что дает мне:

'2014/11/05', '2014/11/06', '2014/11/07', '2014/11/08', '2014/11/09', '2014/11/10', '2014/11/11', '2014/11/12', '2014/11/13', '2014/11/14', '2014/11/15'

и (где каждая цифра представляет значение для этой конкретной даты)

2,8,0,0,0,0,0,0,0,0

Все идет нормально. Единственная проблема здесь в том, что данные (2,8,0,0etc.) Не верны. Например, должно быть:

0,0,2,0,0,0,8,0,0,0

Мой вопрос: Как я могу распечатать данные, где это соответствует отметке времени (xeon_users_rented.expire)?

0

Решение

Чтобы упростить мой ответ до и ответить на ваш вопрос напрямую «Как я могу распечатать данные, где они соответствуют отметке времени«?

Сначала нужно указать метку времени Unix: «strtotime (‘+’. $ X. ‘Day’, time ());» в массив из вашего исходного цикла. Удалите вещи с истекшим сроком [] из этого цикла.

Затем выполните цикл по этому массиву и затем используйте array_search для поиска любых соответствующих индексов в массиве $ data.

if (found in $data array)
$expireDays[] = $data[array_search position]['cnt'];
else
$expireDays[] = 0;
1

Другие решения

Из того, что я собрал в том, что вы пытаетесь установить, SQL-запрос (например) возвращает массив, такой как:

$data = array(
array("days"=>232975857, "cnt"=> 4),
array("days"=>232975867, "cnt"=> 10),
array("days"=>232976689, "cnt"=> 0),
array("days"=>232976688, "cnt"=> 2)
);

Максимум в вашем случае — 10. Однако пожалуйста, обратите внимание что ваш код (ниже):

$max = max(array_map(function($d){
return $d['days'];
}, $data));

может вернуть много PHP E_NOTICE ошибки и быть медленным, потому что вы отрабатываете максимум из unix_timestamp на этом этапе, например 232975867 (слишком много циклов, я подозреваю, что вам нужно). Максимум должен быть разработан следующим образом, я подозреваю:

$max = count($data);

В моем случае (из моего примера с данными) это вернет что-то вроде 4, на которое должен ссылаться ваш код цикла for «<» не «<= «. Чтобы оптимизировать это, я бы на самом деле поместил прямо в цикл for» …; $ х < рассчитывать ($ данных); …; «если, конечно, вам не понадобится $ max позже.

Вот большая проблема для меня. Я не вижу, где в настоящее время у вас есть какая-либо корреляция между переменной $ stamp и столбцом «days» из вашего оператора sql. Возможно, я не видел достаточно информации от вас, чтобы полностью понять, или я неправильно интерпретирую ваш вопрос, но ваш sql для одного не обязательно будет возвращать те же даты, что и переменная штампа, будет вычисляться и не буду обязательно верните cnt 0 для любых дат, которые не существуют в этой таблице. Вот почему:

if ($data[$x]["cnt"] > 0){

часть раздела не нужна и, возможно, неверна.

Чтобы ответить на ваш вопрос, почему вы получаете «2,8,0,0,0,0 ….» вместо ожидаемого порядка, потому что sql не возвращает 0 значений cnt, так как просто не существует даты в это таблица, и ваш имплозд по-прежнему возвращает ‘0’, добавленные после того, как вы принудительно добавили послесловия 0 со строкой:

$expireData[] = 0;

Прежде всего, вам необходимо заполнить ваши данные (или переписать ваши данные, чтобы они содержали cnt of ‘0 в правильных местах массива). Вы можете добиться этого на уровне sql с помощью подзапроса, который обеспечивает отсутствие пропущенных дат, а затем применяет значение cnt 0. Я оставлю это вам на усмотрение, однако другой способ (через PHP) — сделать следующее (псевдокод):

place each 'stamps' (in unix format) in array from previous loop
forloop $i through $stamps
array_search $stamps against $data['days']
if (found)
$expireDays[] = $data[array_search position]['cnt'];
else
$expireDays[] = 0;

Это означает, что вы удаляете $ expireDays из вашего первого цикла.

Наконец, возможно, я неправильно понял, что ваш столбец ‘days’ не должен совпадать с датами $ stamp, поскольку эти даты находятся в будущем, а столбцы ‘days’ — в прошлом. В этом случае единственный вариант — настроить оператор SQL для принудительного включения пропущенных дат (между определенным диапазоном дат).

Удачи.

1

По вопросам рекламы [email protected]