Структура на посещения

nom3r1

Registered
Здравейте, чудя се каква да ми е структурата на посещения на динамичните страници.

В момента посещенията се записват като "разглеждания" тоест, при всяко отваряне на дадена страница се трупа +1 посещение..

Да, но искам да го направя нещо по-сложно, по-готино, по-модерно.

Мислех си за следната SQL структура:
`table_views`
id | page_id | time | ip | count | country
1 | 2 | 432233 | 127.0.0.1 | 10 | bg
2 | 5 | 31522 | 127.0.0.1 | 32 | ru

Колоните:
page_id - ID номера, на дадената страница - index.php?view=1
time - час, на посещението
ip - Адреса на посетителя
count - колко пъти е посетил тази страница
country - държавата на посетителя

---------------------------

Добре, да предприемем че записвам нещата , както по-горе съм ги дал. Слагам колоната `count`, защото искам да не "трупам" излишни редове в таблицата, просто ще правя заявка , с която ще проверявам дали IP-то го има в таблицата на днешната дата, ако го има тогава правя +1 на count-а..

Но аз ще записвам time-а , чрез тази функция time(); , тогава как ще взимам точния ден?

Обясних го доста дървено, но приемам всякакви идеи , може пък да се измисли нещо читаво и добро.

П.С. Статистиката мисля да я извеждам с jquery графики

Статистиките за:
Седмицата (посещенията през дните)
Месеца (посещенията през седмиците в месеца)
Годината (посещенията през месеците в годината)

Точно за това мисля и да използвам time(); , за да си записвам всичко - година, месец, ден..

ЕДИТ: Сега се замислих, няма ли да е по-добре да записвам ден.месец.година в отделна колона както и час:минути ?
 

relax4o

Registered
Няма нужда. Ползвай TIMESTAMP и форматирай времето чрез DATE_FORMAT() на SQL. Относно функцията как се подават параметрите можеш да видиш в официалния сайт.

А, ако time() не го ползваш никъде другаде в скрипта, то при добавяне използвай пак SQL - и именно UNIX_TIMESTAMP(). Практически и като производителност е по-добре. Нека нещата свързани със SQL да си се компилират от SQL. :)
 

nom3r1

Registered
Имам бледи спомени , че DATE_FORMAT , бачкаше на подобен принцип:

DATE_FORMAT('2012-02-16 20:54:00', '%Y-%m-%d');

Резултата би бил: 2012 02 16 /година месец ден/

Ако заявката ми при time(); би била така:

PHP:
$time = time();
SELECT * FROM `table_views` WHERE `ip`='{$get_ip}' AND DATE_FORMAT(`time`, "%Y-%m-%d") =< '.date('Y-m-d', $time).';

Като резултатите в таблица `time` са от този вид: 1329419428

Или греша?

ЕДИТ: Относно unix_timestamp(), предполагам пак ще е на тоя принцип:

[sql]SELECT * FROM `table_views`
WHERE `ip`='{$get_ip}' AND
DATE_FORMAT(`time`, "%Y-%m-%d") =< '.date('Y-m-d', unix_timestamp(now())).'[/sql]
 

relax4o

Registered
Заявката ти би изглеждала така:

[sql]
SELECT * FROM `table_views`
WHERE `ip`='{$get_ip}' AND
DATE_FORMAT(FROM_UNIXTIME(`time`), "%Y-%m-%d") =< DATE_FORMAT(FROM_UNIXTIME(UNIX_TIMESTAMP()), "%Y-%m-%d")
[/sql]


ПРОМЕНЕН ПОСТ
 

nom3r1

Registered
[sql]SELECT * FROM `table_views`
WHERE `page_id`='1' AND `ip`='127.0.0.1' AND DATE_FORMAT(FROM_UNIXTIME(`time`), "%Y-%m-%d") =< DATE_FORMAT(FROM_UNIXTIME(UNIX_TIMESTAMP()), "%Y-%m-%d");[/sql]

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '=< DATE_FORMAT(FROM_UNIXTIME(UNIX_TIMESTAMP()), "%Y-%m-%d")' at line 2

[sql]CREATE TABLE `table_views` (
`id` int(15) NOT NULL auto_increment,
`page_id` int(15) NOT NULL,
`time` timestamp NOT NULL default '0000-00-00 00:00:00',
`ip` varchar(15) NOT NULL,
`count` int(200) NOT NULL default '0',
`country` varchar(10) NOT NULL,
PRIMARY KEY (`id`)
);[/sql]
 

relax4o

Registered
[sql]
SELECT * FROM `table_views`
WHERE `ip`='{$get_ip}' AND
DATE_FORMAT(`time`, '%Y-%m-%d') =< DATE_FORMAT(FROM_UNIXTIME(UNIX_TIMESTAMP()), '%Y-%m-%d')
[/sql]

А така ? И time в какъв вид ти се запазва ? unix timestamp или 0000-00-00 00:00:00 ?
 

nom3r1

Registered
Сега всичко бачка , даже с първата заявка, която ми написа.

[sql]SELECT *
FROM `table_views`
WHERE `page_id` = '{$page_id}' AND `ip`='{$ip}'
AND DATE_FORMAT( FROM_UNIXTIME( `time` ) , '%Y-%m-%d' ) >= DATE_FORMAT( FROM_UNIXTIME( UNIX_TIMESTAMP( ) ) , '%Y-%m-%d' )[/sql]

Мерси.

П.С. Предполагам за последните 7 дни резултата ще трябва да го извеждам така:

[sql]SELECT * FROM `table_views` WHERE `time` >= DATE_SUB(CURDATE(), INTERVAL 7 DAY);
[/sql]

Или греша защото не ми излизат записите, които са в момента.?
 

nom3r1

Registered
[sql]SELECT * FROM `table_views` WHERE `time` >= DATE_SUB( CURDATE( ) , INTERVAL 7 DAY );[/sql]

пробвах и;

[sql]SELECT * FROM `table_views` WHERE `time` >= DATE_SUB(UNIX_TIMESTAMP(), INTERVAL 7 DAY);

[/sql]

Все ми връща празен резултат;
MySQL returned an empty result set (i.e. zero rows). ( Query took 0.0007 sec )

Ако го пиша DAYS - ще върне грешка.

ЕДИТ: Ето така е;
[sql]SELECT *
FROM `table_views`
WHERE `time` > UNIX_TIMESTAMP( NOW( ) - INTERVAL 7
DAY )
LIMIT 0 , 30[/sql]

Мерси , все пак +1
 

Горе