- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
#_connect
mysql_connect("XX.XXX.XX.XX","user","pass") or die("chect db connect settings o_o'");
mysql_select_db("database") or die("db not found O_o");
#_
$ip=GetIP();
$date=date("Y-m-d H:i:s");
$browser=GetBrowser();
$referer=$_SERVER['HTTP_REFERER'];
$sql="CREATE TABLE `Stats` (
`ip` VARCHAR( 19 ) NOT NULL ,
`date` DATETIME NOT NULL ,
`browser` VARCHAR( 30 ) NOT NULL ,
`referer` VARCHAR( 128 ) NOT NULL ,
`count` MEDIUMINT NOT NULL ,
PRIMARY KEY ( `ip` )
);";
if (!defined("ADMIN"))
{
$sql="SELECT * FROM `Stats` WHERE `ip` = '$ip'";
$res=mysql_query($sql); $arr=mysql_fetch_array($res);
if (!empty($arr))
{ $sql="UPDATE Stats SET Stats.count = Stats.count +1 WHERE ip = '$ip'";
@mysql_query($sql);
$sql="UPDATE Stats SET Stats.date = '$date' WHERE ip = '$ip'";
@mysql_query($sql);
}
else
{ $sql="
INSERT INTO `Stats`
( `ip` , `date` , `browser` , `referer` , `count`, `first_date` ) VALUES
('$ip', '$date', '$browser', '$referer', 1, '$date');
";
@mysql_query($sql);
};
};
Function GetBrowser()
{ $useragent = $_SERVER['HTTP_USER_AGENT'];
$brows = 'none';
if(strpos($useragent, "Mozilla") !== false) $brows = 'Mozilla Firefox';
if(strpos($useragent, "MSIE") !== false) $brows = 'Microsoft Internet Explorer';
if(strpos($useragent, "MyIE") !== false) $brows = 'MyIE';
if(strpos($useragent, "Opera") !== false) $brows = 'Opera';
if(strpos($useragent, "Netscape")!== false) $brows = 'Netscape';
if(strpos($useragent, "Firefox") !== false) $brows = 'Mozilla Firefox';
return $brows;
};
Function GetIP()
{
$ip = $_SERVER['REMOTE_ADDR']; if(empty($ip)) $ip=$_SERVER['X_FORWARD_FOR'];
if(empty($ip)) $ip = '0.0.0.0';
return $ip;
};
Этот код инклюдится первой строкой в index.php.
Особенно феерично выглядит
--
$sql="SELECT * FROM `Stats` WHERE `ip` = '$ip'";
$res=mysql_query($sql); $arr=mysql_fetch_array($res);
--
На момент аудита исходников в таблице Stats было более 300 тысяч записей и index.php отдавался примерно за 1.5 сек
Dreyk 09.03.2010 21:27 # 0
guest 09.03.2010 22:23 # 0
HyperGeek 09.03.2010 22:35 # 0
guest 10.03.2010 03:28 # +2
При тои что владения sql тут 0 без палочки... вместо строковых написаний броузеров хотя-бы tinyint вставил... с подстановками
а по поводу запросика $sql="SELECT * FROM `Stats` WHERE `ip` = '$ip'";
если поле ip проиндексировано или приведено к integer, то что тут страшного???
pasha 10.03.2010 09:15 # 0
darkestmaster 10.03.2010 09:28 # +1
1) Выбираем * только ради того, чтобы получить факт наличия записей с указанным IP
2) Мало того, что *, так ведь ещё и mysql_fetch_array() на все эти строки
3) Выбираем из таблицы, в которой хоть и есть дата, но она никак не используется для определения наличия хитов в текущий день
4) Напомню, что этот код вызывается при каждом обращении к index.php в самом начале - никто не слышал о логах хитов и их обработке, например, раз в час, дабы не ходить в базу с такой безумной частотой?
guest 10.03.2010 23:26 # 0
Почему на все? Только на одну строку
darkestmaster 10.03.2010 23:35 # 0
guest 10.03.2010 04:52 # −1
$sql="SELECT `ip` FROM `Stats` WHERE `ip` = '$ip' limit 1" - так должно быть побыстрее. По-другому не знаю как оптимизировать.
Ну ещё два UPDATE в один убрать.
Не очень говнокодистый код... так себе.
darkestmaster 10.03.2010 09:23 # 0
guest 10.03.2010 10:59 # 0
`ip` VARCHAR( 19 ) NOT NULL
Под что автор задумал использовать 19 позиций?
mrbig66 10.03.2010 11:16 # 0
Если хранить как строку, то 15-ти достаточно.
Но, как было сказано, лучше перевести в INT.
guest 11.03.2010 05:24 # 0
HyperGeek 10.03.2010 12:50 # 0
mrbig66 10.03.2010 16:42 # 0
HyperGeek 10.03.2010 17:27 # 0
guest 13.03.2010 16:12 # 0
ab368 24.08.2021 23:00 # 0
negr 25.08.2021 19:28 # 0