Умный поиск в MySQL

ONK

Пассивист PHPСluba
Патриот,
для простого счётчика, с самыми приметивными возможностями тебе подойдёт всего одна таблица примерно такой структуры:

day | user_ip

в первом строковом столбце например (varchar(8))храни результат функции date('y_m_d')
во втором столбце (INT) результат функции ip2long($user_ip)

в этой таблице надо сделать двухстолбцовый индекс (day , user_ip) именно в таком порядке, который позволит в реальном времени делать быстрые запросы на выборку как количества хитов за текущий день так и количества уникальных ip адресов. Помимо этого таблица не будет страдать от большого количества записей за предидущие дни.

В результате твоя функция добавления новых хитов ограничится одним запросом типа
"INSERT INTO tab_name (day , user_ip)VALUES('".date('y_m_d')."','".ip2long($user_ip)."')"

А выборка результатов в реальном времени может производить двумя простыми запросами
"SELECT COUT(*) AS hits FROM tab_name WHERE day = '".date('y_m_d')."'"

и

"SELECT COUT(*) AS hosts FROM tab_name WHERE day = '".date('y_m_d')."' GROUP BY user_ip"

вот и весть твой счётчик.

Для написания чего-то более серьёзного нужно вести таблицу регистрации в реальном времени всех возможных данных + иметь скрипт который периодически обрабатывает эту таблицу расовывая из неё данные в специализированные таблицы оптимизированные для генерирования соответствующих отчётов.
 

si

Administrator
Почему на этом форуме так часто смеются над новичками и так мало говорят о том как исправить ошибки?
потому что ты сам не хочешь слушать ничего.
НУ НЕЛЬЗЯ МНЕ ХРАНИТЬ ТАК IP!
т.е ты обладаешь нулевыми знаниями, но при этом делаешь такие утверждения
 

pauk

Новичок
Автор оригинала: Патриот
Я хочу сделать просто счётчик... без наворотов, что бы он считал кол-во человек и кол-во загружаемых страниц. Что бы посчитать кол-во человек я решил записывать ip, что бы считать загрузки создал поле hit.

Вопросы:
Хосты - это кол-во челов?
Хиты - это кол-во загружаемых страниц?
что то мне подсказывает что это не так =)
Непонятно почему ты решил хранить IP таким и только таким образом.
:)
Достаточно сделать таблицу
день-IP
Если в этот день были посещения с этим IP, то host не меняется, hit=hit+1
Если нет то увеличиваешь на 1 оба значения

ЗЫ.
Host - количество уникальных IP
c определенного момента времени на данный момент
Hit - количество посещенных страниц c определенного момента времени на данный момент
 

Yurik

/dev/null
Хосты - это к-во уникальных ИП за определенный промежуток времени.
Хиты - к-во запросов на страницы

Таблица должна быть такая и никакая иначе
id
datetime
ip
[xip]
[user-agent]

В поле ip храни ip2long значение ip. Каждый запрос вставляй в таблицу. А уже анализатором разбирай по днях, хостах и хитах. Последние 2 поля (HTTP_X_FORWARDED_FOR и USER_AGENT) опциональны (если нужна такая инфа)

Если сайт полностью на сессиях, то можно сделать так:
- добавить поле hits (хиты в пределах сесии)
- если первый заход (создается сессия) то вставляешь новую запись
- если сессия уже существует - делаешь UPDATE .. SET hits=hits+1
 

Патриот

Новичок
Спасибо за безценные советы и разъяснения...
Последнее: Вы не подскажете где можно почитать о использовании таблиц в MySQL, а то я даже не знаю для какого объёма использовать какие таблицы... Кстати тут недавно говорилось что скоро MySQL не будет в php, это правда? if("Да") То на какою базу лучше перелезть сразу, что бы потом не переучиватся?
 

Фанат

oncle terrible
Команда форума
... Кстати тут недавно говорилось что скоро MySQL не будет в php
врут.

про объем можно почитать на сайте mysql.
собственно, по объему ограничений никаких нет.
вопрос в быстродействии и планируемой нагрузке.
простому счетчику хватит и одной таблицы.
 

Yukko

Новичок
что бы потом не переучиватся?
с утра это читаю, аж муторно за нацию становится.
Есть у меня на работе один летючий голландец, он знает MsSQL (может администрировать, запросы пишет), но он с ужасом в глазах слышит фразу, что мы можем переехать на Postgre. Он не знает, что это такое и с какой стороны ему подъехать, хотя принципы работы реляционных СУБД никто не менял!

Патриот
Знаешь какой иностранный язык самый легкий? Следующий, который ты учишь. Вот и тут точно так же, после того, как ты постиг MySQL, и как с ним работать из PHP, я думаю, что при необходимости ты додумаешься, что принципы работы с MsSQL те же (даже функции пишутся почти одинаково: mysql_connect и mssql_connect)! и что SQL Query Analyzer+Enterprise Manager мало чем отличаются от phpMySQLAdmin.
 

Alexandre

PHPПенсионер
Фанат - а в пятой версии mySQL модуль будет не встроенный а внешний. А ты уверен, что MySQL AB быдет его отдовать в свободном распространении?
НЕ УВЕРЕН НЕ ОБГОНЯЙ

про объем можно почитать на сайте mysql.
Фанат ты забыл добавить com или ru, человек спросил где можно что-то найти, а ты отвечаешь: "пойди туда- не знаю куда, хотя знаешь-же заррр...за"
 

Фанат

oncle terrible
Команда форума
кто-нибудь, дайте этому Alexandre укрепительного?
У него словесный понос.

в фразе
А ты уверен, что MySQL AB быдет его отдовать в свободном распространении?
столько же смысла, сколько и в "А ты уверен что РНР будет бесплатным?".
И что теперь? Бросать РНР?
Сашенька, ты сам-то в своих словах логику видишь? или ты опустился до уровня некоторых местных собачек, которым все равно что - лишь бы сбрехнуть?
Очень надеюсь, что это временное явление
в пятой версии mySQL модуль будет не встроенный а внешний
В третьей он тоже был внешний.
Что НИКАК не помешало бешеной их обоих популярности.
А еще в РНР по умолчанию не включена куча модулей. Что никак не мешает никому ими пользоваться.
Давай ты будешь писать только о вещах, в которых хоть немного смыслишь - хорошо?
 

Bermuda

Новичок
Автор оригинала: Патриот
как мне это пришло в голову так я и сделал, неужели всё так страшно и не пригодно для использования?
Раз ты изобрел свою собственную систему, то зачем обращаешься за советом? Или изобретай свой велосипед и возись с ним сам, или пользуйся уже созданными вещами и обращайся за советом -- тебе всегда его дадут.

Мля! Ну сказали же, что нельзя так хранить. В ответ вопрос "А почему?" ответили почему нельзя, порекомендовали почитать документацию по реляционным базам данных. Все равно недостаточно:

Автор оригинала: Патриот
Скажите лучше что там не так? Работает вроде правильно =)
Кроме того, храня информацию таким образом ты УЖЕ НЕ МОЖЕШЬ с ней полноценно работать. Вот тебе еще один аргумент. Базы данных придумывали люди для людей. Думаю не зря. Сходин на CIT-forum, там есть очень объемная теория баз данных.
http://citforum.ru/database/
 

valyala

Новичок
Re: Умный поиск в MySQL

Автор оригинала: Патриот
В поле хранятся ip адреса и оно имеет следующий вид:
123.123.123|321.312.321|456.456.456|

скрипт проверяет наличие ip в базе и если его нету, то он его добавляет... всё бы хорошо, НО! Если в базе 123.123.1230 а у юзера 123.123.123, то скрипт считает что этот ip есть в базе... т.е. ему плевать что там 0 в конце.
....
Может существуют такие вещи как разделители при поиске? Или ещё чего... как мне поступить?
Нужно сделать регулярной структуру поля ip. Это можно сделать разными способами. Например, все мы знаем, что ip-адрес состоит из четырех частей, разделенных точками. Максимальная длина каждой части - 3 символа. Чтобы добиться регулярности в структуре поля ip, можно дополнять каждую часть ip-адреса нулями, чтобы ее длина всегда была равна трем. Например, 127.0.0.1 преобразуем в 127.000.000.001 .

Вышеописанный способ решает твою проблему, но имеет один недостаток - высокую избыточность - каждый ip-адрес занимает 15 байт. Если вспомнить, что на самом деле ip - это 32-битное число, становится ясно, что для его двоичной записи достаточно 4 байта. Чтобы упаковать ip в 4 байта, используй
PHP:
pack('L', ip2long($ip))
. Но тогда появляется проблема выбора разделителя. Это должна быть последовательность символов, которая ни разу не встречается в допустимых ip-адресах.

Есть третий способ, занимающий промежуточное положение между двумя вышеописанными по избыточности - хранить ip в неупакованном виде:
PHP:
$n = ip2long($ip);
if ($n < 0) $n += 0xffffffff + 1;
$ip = str_pad(base_convert($n, 10, 36), 7, '0', STR_PAD_LEFT);
В этом случае длина ip будет равна 7 байтам, зато в качестве разделителя можно использовать любой символ, отличный от алфавитно-цифрового, т.е. [0-9a-zA-Z]

Посмотрел ответы других участников форума. Все они уклонялись от поставленного вопроса, переводя тему на некорректность твоего выбора. Ничего не могу сказать по этому поводу. Ты проектируешь БД - тебе и решать. На твой вопрос я ответил
 

Фанат

oncle terrible
Команда форума
valyala, тебя не затруднит пояснить, какую проблемы ты решил?
Вот ты пишешь -
Вышеописанный способ решает твою проблему
Не опишешь, буквально парой слов, эту проблему?
Я буду тебе премного обязан.
а то сдается мне, что ты невнимательно читал вопрос, и среагировал на ключевое слово "разделители", но совершенно не понял, что имеет в виду тов. Патриот.

А там, глядишь, и поймешь, почему все "уклонялись от вопроса"...
 

netdog

net @
valyala
... Вышеописанный способ решает твою проблему, но имеет один недостаток - высокую избыточность - каждый ip-адрес занимает 15 байт...
Ну так как ты думаешь зафига ему втирали функцию ip2long и хранение результата в int поле?
Лучше уже не сделать.
 
Сверху