Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Запрос возвращает 0 полей, хотя их больше на самом деле..
 
 автор: Syava   (29.04.2008 в 18:19)   письмо автору
 
 

Вот таблица:

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:22)   письмо автору
 
   для: Syava   (29.04.2008 в 18:19)
 

С каждым выполнением скрипта в базе появляется на 1 запись больше, значения id_user, agent и ip одинаковы везде.. В чём может быть проблема?

   
 
 автор: Syava   (30.04.2008 в 13:05)   письмо автору
 
   для: Syava   (29.04.2008 в 18:22)
 

Может быть проблема в индексах?

   
 
 автор: Atheist   (30.04.2008 в 13:26)   письмо автору
 
   для: 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);

А так ошибок вроде как и нет, кроме синтаксической.

   
 
 автор: Syava   (30.04.2008 в 15:13)   письмо автору
 
   для: Atheist   (30.04.2008 в 13:26)
 

Извиняюсь, синтаксическую ошибку я допустил именно здесь в теме, потому что писал последние скобки вручную, а не копировал.. А в скрипте синтаксических ошибок нету..

   
 
 автор: Axxil   (30.04.2008 в 15:44)   письмо автору
 
   для: 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).

   
 
 автор: Syava   (30.04.2008 в 16:57)   письмо автору
 
   для: Axxil   (30.04.2008 в 15:44)
 

Точно! В этом то и есть вся заморочка.. Сейчас тестировал: мой ip 195.46.107.97, в базе пишет 2147483647, а функция ip2long выдаёт -1020368031

   
 
 автор: Syava   (30.04.2008 в 17:00)   письмо автору
 
   для: Syava   (30.04.2008 в 16:57)
 

А если оставлю беззнаковый int(11) не возникнет проблем? Не совсем понимаю, ведь и сейчас записывается положительное число(хотя ip2long выдаёт совсем другое отрицательное)... Объясните пожалуйста, как будет работать это с int(11) unsigned?

   
 
 автор: Axxil   (30.04.2008 в 17:03)   письмо автору
 
   для: Syava   (30.04.2008 в 17:00)
 

один бит в числе резервируется под знак. Если вы укажете что число 100% беззнаковое, то это позволит в 2 раза увеличить диапазон положительных значений не меняя размерность.

Т.е. если раньше диапазон был -2147483647 : +2147483647, то теперь так как отрицательные уходят, получаем диапазон 0 : 4294967295

Этого хватате, так как INET_ATON('255.255.255.255') = 4294967295

   
 
 автор: Axxil   (30.04.2008 в 17:01)   письмо автору
 
   для: Syava   (30.04.2008 в 16:57)
 

ip2long тут непричём. Это другое.

INET_ATON('195.46.107.97') = 3274599265.

Поэтому и ошибка была.

   
 
 автор: Syava   (30.04.2008 в 17:34)   письмо автору
 
   для: Axxil   (30.04.2008 в 17:01)
 

Теперь понятно.. Я просто подумал что sql-команда аналогично php-функции возвратит отрицательное число, и поэтому не стал применять UNSIGNED для поля ip. Благодарю за помощь!

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования