1. PHP / Говнокод #2739

    +163.3

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    57. 57
    58. 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 сек

    Запостил: darkestmaster, 09 Марта 2010

    Комментарии (19) RSS

    • O_o
      Ответить
    • Вряд ли по глупости, скорее по невнимательности, но тем не менее очень жестоко...
      Ответить
    • Лавры Гугл Аналитикс не дают школоте покоя? ))
      Ответить
    • Зачем ему вообще нужна такая статистика???
      При тои что владения sql тут 0 без палочки... вместо строковых написаний броузеров хотя-бы tinyint вставил... с подстановками

      а по поводу запросика $sql="SELECT * FROM `Stats` WHERE `ip` = '$ip'";
      если поле ip проиндексировано или приведено к integer, то что тут страшного???
      Ответить
      • имхо хранить в БД IP следует в переведенном к инт виде
        Ответить
      • Страшно, что:
        1) Выбираем * только ради того, чтобы получить факт наличия записей с указанным IP
        2) Мало того, что *, так ведь ещё и mysql_fetch_array() на все эти строки
        3) Выбираем из таблицы, в которой хоть и есть дата, но она никак не используется для определения наличия хитов в текущий день
        4) Напомню, что этот код вызывается при каждом обращении к index.php в самом начале - никто не слышал о логах хитов и их обработке, например, раз в час, дабы не ходить в базу с такой безумной частотой?
        Ответить
        • 2) Мало того, что *, так ведь ещё и mysql_fetch_array() на все эти строки
          Почему на все? Только на одну строку
          Ответить
          • А, чёрт, и правда... У меня просто в какой-то момент сложилось чёткое ощущение того, что т.к. таблица одна, то и на каждый день по строке с одинаковым ip, поэтому особенно волосы шевелились :)
            Ответить
    • Поменять тип поля и сделать его индексным.

      $sql="SELECT `ip` FROM `Stats` WHERE `ip` = '$ip' limit 1" - так должно быть побыстрее. По-другому не знаю как оптимизировать.

      Ну ещё два UPDATE в один убрать.

      Не очень говнокодистый код... так себе.
      Ответить
      • А нет ли подозрения, что если один и тот же ip адрес встречается в течение года каждый день, то данный запрос и последующий update изменят кол-во обращений неизвестно у какой записи? :) Сдаётся мне, что использование единственной таблички для hosts/hits, говнокодисто само по себе :)
        Ответить
      • Я вот озадачился зачем
        `ip` VARCHAR( 19 ) NOT NULL
        Под что автор задумал использовать 19 позиций?
        Ответить
        • VARCHAR(19) -- это строка длиной от 0 до 19 символов.
          Если хранить как строку, то 15-ти достаточно.
          Но, как было сказано, лучше перевести в INT.
          Ответить
          • Вот и я о том, автар нелогичен даже в рамках своей странной логики
            Ответить
        • Про запас ) вдруг на IPv6 решит перейти ))
          Ответить
    • А access_log для кого придумали?
      Ответить
    • - Льстец. Как насчёт завтра? Я приглашу его на ужин.
      Ответить
    • - Что я здесь делаю? - с трудом, но я всё же оторвал голову от подушки, чтобы через мгновение об этом пожалеть.
      Ответить

    Добавить комментарий