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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> сортировка по времени 
:(
    Опции темы
sugee
Дата 18.2.2006, 20:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Вместо strtotime попробовал mktime.
Вроде получился самый что ни на есть timestamp,
а в базе всё равно нули smile
Что я не так делаю?

Код

$time=str_replace("[", "", $time);
$time=str_replace("]", "", $time);
$time=str_replace(" +0300", "", $time);
$d=substr($time, 0, 2)."<br>";
$M=substr($time, 3, 3)."<br>";
$Y=substr($time, 7, 4)."<br>";

echo $timestamp=mktime($d,$M,$Y)."<br>"; //выводит что-то вроде 1140222806

mysql_query("INSERT INTO `logs` VALUES
('','{$host}','{$usid}','{$us}','{$timestamp}','{$req}','{$res}','{$qbyte}')");
//записывает всё равно 0000-00-00 00:00:00

PM MAIL   Вверх
sugee
Дата 18.2.2006, 21:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



А, ну <br>-ы я убрал, всё равно в таблице нули. smile
А сам timestamp выводится.
Код

$time=str_replace("[", "", $time);
$time=str_replace("]", "", $time);
$time=str_replace(" +0300", "", $time);
$d=substr($time, 0, 2);
$M=substr($time, 3, 3);
$Y=substr($time, 7, 4);

echo $timestamp=mktime($d,$M,$Y); //выводит что-то вроде 1140222806

mysql_query("INSERT INTO `logs` VALUES
('','{$host}','{$usid}','{$us}','{$timestamp}','{$req}','{$res}','{$qbyte}')");
//записывает всё равно 0000-00-00 00:00:00

PM MAIL   Вверх
sugee
Дата 18.2.2006, 21:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



smile
Код

$timestamp=mktime($M,$d,$Y);
$time=date("Y-m-d", $timestamp);

mysql_query("INSERT INTO `logs` VALUES('','{$host}','{$usid}','{$us}','{$time}','{$req}','{$res}','{$qbyte}')");

А поле datetime, теперь все правильно. Почему только Y-m-d - просто из-за парсинга строки скрипт дико тормозит!
PM MAIL   Вверх
sugee
Дата 18.2.2006, 22:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Рано радовался, у меня во всех строках теперь одинаковая дата стоит.
И если поле timestamp - то же самое.
Научите как правильно писать в поле типа timestamp smile
PM MAIL   Вверх
sugee
Дата 19.2.2006, 01:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код

$timestamp=mktime(0,0,0,$M,$d,$Y);

$time=date("M-d-Y", $timestamp)."<br>";


Вот так правильно отображается только число, год почему-то всегда меньше на единицу,
вместо 2005-го 2004-й и т.д. Месяц везде декабрь, хотя есть ещё январь и февраль.
PM MAIL   Вверх
-=Ustas=-
Дата 19.2.2006, 08:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ustix IT Group
****


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

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



Тип поля в бд под timestamp лучше делать целочисленный.
Слушай, если ты беспокоишься о том, что скрипт слишком долго выполняется, то есть еще одно решение, более простое. Насколько я знаю, Апач пишет всегда в конец файла, вот это тебе и будет уже самая что нинаесть сортировка по дате. Выхватываешь всё по-строчно из этого файла и пишешь в БД, для сортировки делаешь ORDER BY id DESC, и все твои проблемы...


--------------------
В искаженном мире все догмы одинаково произвольны, включая догму о произвольности догм.
-----
PM WWW ICQ Skype   Вверх
sugee
Дата 19.2.2006, 09:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Да, это уже предлагали
http://forum.vingrad.ru/index.php?showtopi...st&p=648474
Если нужна просто сортировка по времени, то этого достаточно,
но мне ещё нужно будет выводить статистику за последние десять дней. Сколько за день было хостов, хитов и тому подобное.

PM MAIL   Вверх
sugee
Дата 19.2.2006, 10:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Я поменял тип поля на INT(32) и пишу туда дату непосредственно в формате timestamp
Код

$timestamp=mktime(0,0,0,$M,$d,$Y);

mysql_query("INSERT INTO `logs` VALUES(
'','{$host}','{$usid}','{$us}',
'{$timestamp}','{$req}','{$res}','{$qbyte}')");


Вывожу так
Код

$q = mysql_query
("SELECT DISTINCT `time`,`host` FROM `logs` ORDER BY `time` DESС LIMIT 150");
  echo "<table border='1'>
 <tr bgcolor='silver'>
 <td>&nbsp</td><td>Дата</td><td>Кол-во хостов</td><td>Кол-во хитов</td></tr>";
 $i=1;

while($r=mysql_fetch_assoc($q)) {
$q1 = mysql_query("
SELECT COUNT(*) FROM `logs` WHERE `time`='{$r['time']}'");
$q2 = mysql_query
("SELECT DISTINCT COUNT(`host`) FROM `logs` WHERE `time`='{$r['time']}'");

echo "<tr><td>".$i."</td><td>".date("M-d-Y", $r['time'])."</td>
<td>".mysql_result($q2, 0)."</td>
<td>".mysql_result($q1, 0)."</td></tr>";

 $i++;
}

echo "</table>";
Формат в котором выводятся даты верный, но сами даты неправильные. Откуда то 2004 год появился, хотя в логе его небыло.

Это сообщение отредактировал(а) sugee - 19.2.2006, 10:35
PM MAIL   Вверх
-=Ustas=-
Дата 19.2.2006, 14:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ustix IT Group
****


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

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



Вот тебе набросал как примерчик, для получения timestamp в твоем случае:
Код

<?php

function MakeTime($string)
{
    $month = array("Jan" => 1,
                   "Feb" => 2,
                   "Mar" => 3,
                   "Apr" => 4,
                   "May" => 5,
                   "Jun" => 6,
                   "Jul" => 7,
                   "Aug" => 8,
                   "Sep" => 9,
                   "Oct" => 10,
                   "Nov" => 11,
                   "Dec" => 12);
    preg_match("#(.*)\/(.*)\/(.*):(.*):(.*):(.*)\s#U", $string, $matches);
    $time = mktime($matches[4], $matches[5], $matches[6], $month[$matches[2]], $matches[1], $matches[3]);

    return $time;
}

$string = "127.0.0.1 - - [08/Dec/2005:00:00:30 +0300] \"GET /install/install.php HTTP/1.1\" 200 61";
preg_match("#\[(.*)\]#U", $string, $matches);
echo $string."<br>";
echo MakeTime($matches[1])."<br>";

echo "<br><br><br>";

echo date("d.m.Y // H:i:s", MakeTime($matches[1]));

?>


Хотя...может можно как-то и оптимизировать, просто всё на скорую руку... smile


--------------------
В искаженном мире все догмы одинаково произвольны, включая догму о произвольности догм.
-----
PM WWW ICQ Skype   Вверх
IZ@TOP
Дата 19.2.2006, 15:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Панда-бир!
****


Профиль
Группа: Участник
Сообщений: 4795
Регистрация: 3.2.2003
Где: Бамбуковый лес

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



Код

$stmp = strtotime(
    str_replace(array('/', ':'), '', '25/Dec/2005:04:12:17')
);

echo date("d/m/y H:i:s", $stmp);

Думаю это будет побыстрее прегов.

Пишем $stmp в базу в поле типа int(10). Ставим на него индексы (в связке с другими полями, если те учавствуют в отборе).


--------------------
Один из розовых плюшевых-всадников апокалипсиса... очень злой...

Семь кругов ада для новых элементов языка
Мои разрозненные мысли
PM MAIL WWW ICQ Skype GTalk   Вверх
sugee
Дата 19.2.2006, 19:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



-=Ustas=-, я применил в своей фунции твой вариант в сочетании с вариантом IZ@TOP.
Вроде не перепутал ничего... Время получается 01.01.1970 // 03:00:01
Начало эпохи Unix если не ошибаюсь smile


Код

function MakeTime($string)
{
  $time = strtotime(str_replace(array('/', ':'), '', $string));

    return $time;
}

function LoadLogFile() {
$f=file("log_file/log_file");
 

for($i=0; $i<$all=sizeof($f); $i++) {
$exp='/^(\S+)\s+(\S+)\s+(\S+)\s+\[(.*)\]\s+"(.*)"\s+(\S+)\s+(\S+)$/';
preg_match($exp, $f[$i], $pocket);
list($full, $host, $usid, $us, $time, $req, $res, $qbyte)=$pocket;

preg_match("#\[(.*)\]#U", $f[$i], $matches);
MakeTime($matches[1]);

mysql_query(
"INSERT INTO `logs` VALUES('','{$host}','{$usid}','{$us}','{$time}','{$req}','{$res}','{$qbyte}')");

  }

return $all;
}

Добавлено @ 19:27
Поле int(10)
PM MAIL   Вверх
-=Ustas=-
Дата 20.2.2006, 10:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ustix IT Group
****


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

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



sugee, в варианте Изотопа маленькое упущение, которое ты должен был заметить, прочитав про формат входных данных функции strtotime() ;) Попробуй так:
Код

$stmp = strtotime(str_replace(array('/', ':'), ' ', '25/Dec/2005:04:12:17'));



--------------------
В искаженном мире все догмы одинаково произвольны, включая догму о произвольности догм.
-----
PM WWW ICQ Skype   Вверх
sugee
Дата 20.2.2006, 17:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Нет, то же самое получается.
PM MAIL   Вверх
-=Ustas=-
Дата 20.2.2006, 18:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ustix IT Group
****


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

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



хм... действительно. Ну попробуй тогда полностью мою функцию применить, хоть и немного дольше обрабатывает, на зато наверняка smile


--------------------
В искаженном мире все догмы одинаково произвольны, включая догму о произвольности догм.
-----
PM WWW ICQ Skype   Вверх
sugee
Дата 20.2.2006, 20:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



А вот теперь происходит очень интересная вещь.
date() перед записью в базу даёт правильный результат, а вот из базы выводится все то же 01/01/70 03:00:00.

Код

function MakeTime($string)
{
    $month = array("Jan" => 1,
                   "Feb" => 2,
                   "Mar" => 3,
                   "Apr" => 4,
                   "May" => 5,
                   "Jun" => 6,
                   "Jul" => 7,
                   "Aug" => 8,
                   "Sep" => 9,
                   "Oct" => 10,
                   "Nov" => 11,
                   "Dec" => 12);
    preg_match("#(.*)\/(.*)\/(.*):(.*):(.*):(.*)\s#U", $string, $matches);
    $time = mktime($matches[4], $matches[5], $matches[6], $month[$matches[2]], $matches[1], $matches[3]);

    return $time;
}

function LoadLogFile() {
$f=file("log_file/log_file");
 
for($i=0; $i<$all=sizeof($f)/100; $i++) {
$exp='/^(\S+)\s+(\S+)\s+(\S+)\s+\[(.*)\]\s+"(.*)"\s+(\S+)\s+(\S+)$/';
preg_match($exp, $f[$i], $pocket);
list($full, $host, $usid, $us, $_time, $req, $res, $qbyte)=$pocket;

if($res == 200) {
preg_match("#\[(.*)\]#U", $f[$i], $matches);

MakeTime($matches[1]);

echo date("d.m.Y // H:i:s", MakeTime($matches[1]))."<br>"; //всё правильно выводит

mysql_query("INSERT INTO `logs` VALUES('','{$host}','{$usid}','{$us}','{$time}','{$req}','{$res}','{$qbyte}')");
      }
  }


return $all;

}

PM MAIL   Вверх
Страницы: (3) Все 1 [2] 3 
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Базы Данных | Следующая тема »


 




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


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

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