|
|
|
| Вот таблица:
CREATE TABLE `tbl`(`id` int(11 ) NOT NULL auto_increment,
`id_user` int(11 ) UNSIGNED NOT NULL,
`agent` varchar(100 ) NOT NULL,
`ip` int(11 ) NOT NULL,
`time` int(11 ) UNSIGNED NOT NULL,
PRIMARY KEY(`id`),
INDEX(`id_user`, `agent`(10 ), `ip`)) TYPE=MyISAM;
|
Вот такой код:
$id_user = intval($_GET['id_user']);
$agent = mysql_escape_string($_SERVER['HTTP_USER_AGENT']);
$ip = $_SERVER['REMOTE_ADDR'];
$count = mysql_fetch_row(mysql_query('SELECT COUNT(*)
FROM `tbl` WHERE `id_user` = '.$id_user.' AND `agent` = "'.$agent.'" AND `ip` = INET_ATON("'.$ip.'");');
if($count[0] == 0)
{
mysql_query('INSERT INTO `tbl` SET `id_user` = '.$id_user.', `agent` = "'.$agent.'", `ip` = INET_ATON("'.$ip.'"), `time` = UNIX_TIMESTAMP();');
}
|
$count[0] выдаёт всё время 0 и записывает в базу одни и те же данные за исключением значения unix_timestamp.. Пробовал mysql_num_rows для SELECT-а и он тоже всегда говорит 0. | |
|
|
|
|
|
|
|
для: Syava
(29.04.2008 в 18:19)
| | С каждым выполнением скрипта в базе появляется на 1 запись больше, значения id_user, agent и ip одинаковы везде.. В чём может быть проблема? | |
|
|
|
|
|
|
|
для: Syava
(29.04.2008 в 18:22)
| | Может быть проблема в индексах? | |
|
|
|
|
|
|
|
для: Syava
(30.04.2008 в 13:05)
| | Такой код вообще не пройдет синтаксическую проверку:
$count = mysql_fetch_row(mysql_query('SELECT COUNT(*) FROM `tbl` WHERE `id_user` = '.$id_user.' AND `agent` = "'.$agent.'" AND `ip` = INET_ATON("'.$ip.'");'); - отсутствует одна закрывающая скобка.
При этом, если не получается понять где ошибка, надо сводить задачу к минимализму, убирая ненужные детали, по возможности избавляясь от переменных вообще, т.е. попробовать выполнить запрос явно:
SELECT COUNT(*) FROM `tbl` WHERE `id_user` = 1 AND `ip` = 123456 ...
Попытаться вывести то, что ты собственно проверяешь:
var_dump($count);
А так ошибок вроде как и нет, кроме синтаксической. | |
|
|
|
|
|
|
|
для: Atheist
(30.04.2008 в 13:26)
| | Извиняюсь, синтаксическую ошибку я допустил именно здесь в теме, потому что писал последние скобки вручную, а не копировал.. А в скрипте синтаксических ошибок нету.. | |
|
|
|
|
|
|
|
для: Syava
(30.04.2008 в 15:13)
| | функция INET_ATON выдаёт числа выходящие за границы типа int(11) максимальный ip который можно туда записать: 127.255.255.255 всё что выше (начиная с ip 128.0.0.0, например 192.168.0.23) будет обрезаться до максимального значения типа int(11) 2147483647
Попробуйте расширить тип поля ip до BigInt или оставить int(11), но сделать поле ip беззнаковым (UNSIGNED). | |
|
|
|
|
|
|
|
для: Axxil
(30.04.2008 в 15:44)
| | Точно! В этом то и есть вся заморочка.. Сейчас тестировал: мой ip 195.46.107.97, в базе пишет 2147483647, а функция ip2long выдаёт -1020368031 | |
|
|
|
|
|
|
|
для: Syava
(30.04.2008 в 16:57)
| | А если оставлю беззнаковый int(11) не возникнет проблем? Не совсем понимаю, ведь и сейчас записывается положительное число(хотя ip2long выдаёт совсем другое отрицательное)... Объясните пожалуйста, как будет работать это с int(11) unsigned? | |
|
|
|
|
|
|
|
для: Syava
(30.04.2008 в 17:00)
| | один бит в числе резервируется под знак. Если вы укажете что число 100% беззнаковое, то это позволит в 2 раза увеличить диапазон положительных значений не меняя размерность.
Т.е. если раньше диапазон был -2147483647 : +2147483647, то теперь так как отрицательные уходят, получаем диапазон 0 : 4294967295
Этого хватате, так как INET_ATON('255.255.255.255') = 4294967295 | |
|
|
|
|
|
|
|
для: Syava
(30.04.2008 в 16:57)
| | ip2long тут непричём. Это другое.
INET_ATON('195.46.107.97') = 3274599265.
Поэтому и ошибка была. | |
|
|
|
|
|
|
|
для: Axxil
(30.04.2008 в 17:01)
| | Теперь понятно.. Я просто подумал что sql-команда аналогично php-функции возвратит отрицательное число, и поэтому не стал применять UNSIGNED для поля ip. Благодарю за помощь! | |
|
|
|