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

Патриот

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

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

скрипт проверяет наличие ip в базе и если его нету, то он его добавляет... всё бы хорошо, НО! Если в базе 123.123.1230 а у юзера 123.123.123, то скрипт считает что этот ip есть в базе... т.е. ему плевать что там 0 в конце.
вот кусок из кода:
PHP:
$poisk_ip=$ip;
$p_ip=mysql_query("SELECT * FROM stat WHERE date='$date' && host LIKE '%$poisk_ip%'"); 
$rp_ip = mysql_numrows($p_ip);
if($rp_ip){
//добавляем
} else {
//есть такой ip
}
Может существуют такие вещи как разделители при поиске? Или ещё чего... как мне поступить?
 

ONK

Пассивист PHPСluba
123.123.1230 - таких адресов не бывает

как и таких |321.312.321|456.456.456|


а вообще переделывай таблицу, адреса в твоём случае правильнее хранить в отдельных записях.
 

Патриот

Новичок
ONK
1. ip я ввёл на бум, а "|" - это разделитель между ними
2. в моём случае ip адреса нужно хранить именно в одной ячейке т.к. на каждый день там своя запись...

Есть такая идея:
$mas=explode("|",$row['ip']);
а потом прогнать ключи $mas на наличие этого этого ip... только вот как это сделать??? Плиз подскажите фун-ию поиска в массиве, если такая есть, или другой разумный способ...
 

Макс

Старожил PHPClub
Патриот
. в моём случае ip адреса нужно хранить именно в одной ячейке т.к. на каждый день там своя запись...
ну и что ? Создай 2 поля в таблице:
ip | date - и храни каждый адрес в отдельной записи.

Если хочешь поступать неправильно, то можно через REGEXP решить, но при больших объемах наверное тормозить будет
 

Altex

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

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

скрипт проверяет наличие ip в базе и если его нету, то он его добавляет... всё бы хорошо, НО! Если в базе 123.123.1230 а у юзера 123.123.123, то скрипт считает что этот ip есть в базе... т.е. ему плевать что там 0 в конце.
вот кусок из кода:
PHP:
$poisk_ip=$ip;
$p_ip=mysql_query("SELECT * FROM stat WHERE date='$date' && host LIKE '%$poisk_ip%'"); 
$rp_ip = mysql_numrows($p_ip);
if($rp_ip){
//добавляем
} else {
//есть такой ip
}
Может существуют такие вещи как разделители при поиске? Или ещё чего... как мне поступить?
Вся проблема в том, что не нужно использывать LIKE %...%, для точного совпадения нужно использовать IP=$ip
 

.des.

Поставил пиво кому надо ;-)
ёлы палы... НУ НЕЛЬЗЯ МНЕ ХРАНИТЬ ТАК IP!
Нельзя хранить так как хранишь ты!
Точка.

И прежде чем приводить доводы прочти что нибудь из теории по реляционным базам данных.
 

Патриот

Новичок
Хорошо.
Пусть нельзя, скажите пожалуйста фун-ию поиска в массиве и покончим с этим.
 

Патриот

Новичок
Спасибо.
вот что получилось:
PHP:
function stats() {
//*****ip*******
if(getenv("HTTP_CLIENT_IP")) { 
    $ip = getenv("HTTP_CLIENT_IP"); 
} elseif(getenv("HTTP_X_FORWARDED_FOR")) {         
    $ip = getenv("HTTP_X_FORWARDED_FOR"); 
} else { 
    $ip = getenv("REMOTE_ADDR"); 
}
//*********Дата и операции*********
if(isset($ip))
{
$date=date("d.m.y");
$p_date=mysql_query("SELECT * FROM stat WHERE date LIKE '%$date%'"); 
$rp_date = mysql_numrows($p_date);
if($rp_date==0)
{
$query = "INSERT INTO stat VALUES ('','$date','$ip|','1')";
$result = MYSQL_QUERY($query);
} else {
	$qip=mysql_query("SELECT * FROM stat WHERE date='$date'");
	$mas=mysql_fetch_array($qip);
	$masip=explode("|",$mas[2]);
	$res=array_search("$ip", $masip);
if($res=="")
{
	$addip = mysql_query("SELECT * FROM stat WHERE date='$date'");
	while( $mas = mysql_fetch_array($addip) )
	{
		$host = "UPDATE stat SET host='$mas[host]$ip|' where host='$mas[host]'";
		$rhost = MYSQL_QUERY($host);
		$hit = "UPDATE stat SET hit=hit+1 where hit='$mas[hit]'";
		$rhit = MYSQL_QUERY($hit);

	}
} else {
	$addhit = mysql_query("SELECT * FROM stat WHERE date='$date'");
	while( $mas = mysql_fetch_array($addhit) )
	{
		$hit = "UPDATE stat SET hit=hit+1 where hit='$mas[hit]'";
		$rhit = MYSQL_QUERY($hit);

	}
}
}
}

}
[sql]
CREATE TABLE `stat` (
`id` smallint(10) unsigned NOT NULL auto_increment,
`date` varchar(255) binary NOT NULL default '',
`host` text NOT NULL,
`hit` varchar(255) binary NOT NULL default '',
PRIMARY KEY (`id`)
) TYPE=MyISAM AUTO_INCREMENT=5 ;
[/sql]
А теперь скажите - ПОЧЕМУ НЕЛЬЗЯ ТАК ХРАНИТЬ???
 

ONK

Пассивист PHPСluba
Патриот, ужас и позор. Зачем ты это показал?

А,, чтобы задать вопрос, тогда правильно.

Так вот, сотри эту функцию и забудь о ней как о страшном кошмаре.

Затем расскажи на хорошем Русском языке что ты хочеш сделать. Тебе расскажут как это НАДО сделать.
 

Патриот

Новичок
я хочу сделать счётчик, который считал бы хосты и хиты... как мне это пришло в голову так я и сделал, неужели всё так страшно и не пригодно для использования?
 

Патриот

Новичок
Почему на этом форуме так часто смеются над новичками и так мало говорят о том как исправить ошибки? Я на этот скрипт весь вечер потратил, а вы его обсераете =) Скажите лучше что там не так? Работает вроде правильно =)
 

.des.

Поставил пиво кому надо ;-)
Патриот
Новичок
Sep 2003 [Cообщений: 66]
01.01.04 18:49

ёлы палы... НУ НЕЛЬЗЯ МНЕ ХРАНИТЬ ТАК IP!
Ты сам не хочешь ничего слушать. Априори уверен в своей правоте. Остановись и прислушайся к ОНК и задай вопрос о том что ты хочешь сделать.
user tracking ты основываешь на уникальности адреса.
ок. это одна таблица причем ip address хранить надо в поле типа long
далее таблица хитов. Хит это по крайней мере три атрибута. Время (DATETIME), страница (ее идентификатор а не url) и собственно сам юзер
еще у тебя есть таблица где хранятся url просмотренных страниц. и таблица хостов (сайтов).
в общем виде это выглядит так.
 

Патриот

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

Вопросы:
Хосты - это кол-во челов?
Хиты - это кол-во загружаемых страниц?
что то мне подсказывает что это не так =)
 
Сверху