dobre
От: niakoi
На: 22-08-2003@15:03 GMT+2
Оценка: 1/Неутраленdobre,
kato nachalo
[Отговори на този коментар]
re: dobre
От: niakoi drug
На: 22-08-2003@15:52 GMT+2
Оценка: 1/Неутраленkakvo iskash da kajesh, niakoi?
[Отговори на този коментар]
re: dobre
От: s
На: 22-08-2003@16:11 GMT+2
Оценка: 1/Неутраленbydete po-izcherpatelni v komentarite si za da se ulavia niakakva logika. vsiaka razumna kritika e dobre doshla. sys sigurnost vyprosite ne sa izcherpani, taka che - feedback napred.
[Отговори на този коментар]
Аз за краставицата ...
От: Сале <salle< at >mysql __точка__ com>
На: 22-08-2003@21:06 GMT+2
Оценка: 1/НеутраленТ.е. за MySQL-a
[test6.php]
...
$query = "SELECT ip FROM $tbl_ip WHERE ip = '$ip'";
$result = mysql_query($query);
$numrows = mysql_num_rows($result);
Изключително лош стил на програмиране. Или по-точно най-лошия. $result се използва като параметър във функция БЕЗ да е проверено преди това дали му е присвоена стойност.
if(!$result = mysql_query(...))
Sheib,
Няма никакво значение дали даваш "простичък пример". Много са тези, които като прочетат какво си написал ще направят Copy/Paste и после ще пълнят мейл листите, форумите, IRC и т.н. с неща от рода на "Ми не ми работи"
Самият пример.
// ...
// един глас от IP в 24 часов интервал
$timeoutseconds = 3600*24;
$timestamp = time();
$timeout = $timestamp-$timeoutseconds;
mysql_query("DELETE FROM $tbl_ip WHERE timestamp<$timeout");
Две неща:
1. Пренасяне на работата от Сървъра към Клиента :) Принципно идеята е да се товари Сървъра и да ес разтоварва Клиента
2. Функциите на MySQL за работа с времена са значително по-лесни удобни, разбираеми дори без да отчитаме 1.
Същият резултат ще се получи от следния код:
// ...
// един глас от IP в 24 часов интервал
mysql_query("DELETE FROM $tbl_ip WHERE timestamp < NOW() - INTERVAL 1 DAY");
Мисля, че не е нужно човек да знае SQL за да разбере какво прави тази заявка.
За да стане максимално гъвкаво може да се препише като:
$timeout = 1;
$timeout_measure = 'DAY';
mysql_query("DELETE FROM $tbl_ip WHERE timestamp < NOW() - INTERVAL $timeout $timeout_measure");
3) Лоша практика.
TIMESTAMP и тип данни в MySQL и не е удачно да се използва като име на колона. Важи за всички резервирани думи. Възможно е но създава неприятни проблеми. По-добре да се избягва.
... WHERE ip = '$ip'";
Тук обикновено препоръчвам едно усложняване на живота, което обаче може хим да спести огромно количество дисково пространство хем да ускори много работата.
Най-ефективния тип за съхраняване на IP адреси е
INT UNSIGNED
Заема точно 3 байта колкото е и всъщност адресът при IPv4 плюс по бързи сравнения, JOIN и Индекси.
Да наистина при четене и писане трябва да се използват INET_NTOA() и INET_ATON(), но разликата в бързодействието между INT и CHAR/VARCHAR обикновено е осезателна а всеки който е работил с големи логове знае какво значи разликата от 4 байта за INT вместо 7-15 за VARCHAR(15)
[test13.php]
Sheib,
Тук си се поизложил!
Ако във:
$query = "SELECT ccinfo, ssn FROM $private WHERE userid = '$UserID'";
Замениш $UserID с "$UserID OR userid LIKE "%";'"
Заявката ще придобие вида:
SELECT ccinfo, ssn FROM $private WHERE userid = '$UserID OR userid LIKE "%";'';
И MySQL (а надявам се и всеки друг сървър), чинно ще върне празен резултат освен разбира се ако случайно има
userid == $UserID OR userid LIKE "%";
в което се съмнявам.
Виж ако оригиналът беше:
$query = "SELECT ccinfo, ssn FROM $private WHERE userid = $UserID";
Да тогава щеше да си прав.
Sheib,
Пиша всичко това с най-добри пожелания.
Накрая нека да добавя нещо от мен.
Безкрайно полезната функция на MySQL
LOAD DATA LOCAL
преди време се беше преврънал в отвратителен пробив в PHP и то по доста особен начин.
Пробивът се оказва в Middle-Tier (PHP) а Сървъра е при Нарушителя. При това администратора няма контрол върху нещата.
Всичко това е заради начина по който се извикват
функциите на PHP в Apache - с правата на процеса а не с правата на PHP-скрипта. Дори още по-лошо. PHP-модула работи в основния процес на Apache а той както знаем се стартира като root (заради port 80)
Затова преди време (донякъде и с мое участие) беше добавена омразната на много потребители опция enable/disable-local-infile
Точно с цел да се даде възможност на администратора за контрол.
По-подробно съм писал за това на:
http://www.mysql.com/newsletter/2002-05/a0000000012.html
Забележете датата. Ако оттогава насам все още някой администратор е недогледал local-infile ...
Стана малко дългичко, но когато е за безхаберност и недоглеждане мисля, че си заслужава.
Sheib,
Продължавай в същия дух. Само си пооправи малко стила защото е доста хаотичен. Може би не колкото моя но все пак .. :)
[Отговори на този коментар]
re: salle
От: sheib
На: 22-08-2003@23:17 GMT+2
Оценка: 1/Неутрален*whoosh* :) tova e veche drugo.
Изключително лош стил на програмиране. Или по-точно най-лошия. $result се използва като параметър във функция БЕЗ да е проверено преди това дали му е присвоена стойност.
if(!$result = mysql_query(...))
verno, no v interes na istinata, prosto ostanalata chast ne e paste-nata, zatova sa vsichkite dots naokolo. a kato ne im raboti na posterite...:)
1. Пренасяне на работата от Сървъра към Клиента :) Принципно идеята е да се товари Сървъра и да ес разтоварва Клиента
2. Функциите на MySQL за работа с времена са значително по-лесни удобни, разбираеми дори без да отчитаме 1.
syglasih se za rabotata s vremena, no...ne zadyljavam nikoi da go pravi taka :)
za timestamp - da moje i da syzdava problemi. no otnovo - vseki si preceniava sam.
za injection shte pogledna malko po-kysno.
Тук обикновено препоръчвам едно усложняване на живота, което обаче може хим да спести огромно количество дисково пространство хем да ускори много работата.
Най-ефективния тип за съхраняване на IP адреси е INT UNSIGNED..
udachno e, a i nikoi ne se e zabyrzal s IPv6 oshte, pone v us.
[Отговори на този коментар]
Re : Аз за краставицата ...
От: Andrey
На: 23-08-2003@14:23 GMT+2
Оценка: 1/Неутрален>Две неща:
>1. Пренасяне на работата от Сървъра към Клиента :) Принципно идеята е да се товари Сървъра и да ес разтоварва Клиента
>2. Функциите на MySQL за работа с времена са значително по-лесни удобни, разбираеми дори без да отчитаме 1.
Ситуация 1 :
БД-то Мускул и уеб сървъра работят на една машина. Тогава е по-удобно
решението с функциите за време на Мускул.
Ситуация 2 :
5-10 уеб сървъра в клъстър и един Мускул работещ на машина звяр. Ако
всичко се пренесе към БД-то то тогава се рискува да се постигне сутуацията,
при която уеб сървърите "люпят семки" докато, чакат Мускул да си свърши
работата. Явно е, че в този случай е по-удобно да се работи с функциите
на скрипт езика. Тук обаче, ще отбележа, че уеб сървърите трябва да са
синхронизирани. Т.е. във вътрешната мрежа за защитната стена може да върви
един времеви сървър и машините да си сверяват времето от него. А трябва
да стои зад стената, защото съм чувал, че за сървъра има дупки :)
Ситуация 3:
Машината, на която върви МуСкул не е според UTC часова зона. В този случай
БД-то започва да си играе с TIMESTAMP колоните, като си гледа собствената
часова зона и решава, че записаните в колоната данни са по нея. Също така,
ако се използва INTEGER колона и се работи с функции за време, МуСкул
отново взема в предвид собствената си часова зона. Точно с този проблем
се сблъсках преди повече от година, когато си пишех дипломната работа.
Доверих се на функциите на PHP за работа с време : gmmktime() и
gmstrftime(), тъй като те не отчитат часовата зона (за разлика от
mktime(), strftime(), date()). В моя случай пазех времето според UTC
в БД. Ако не се прави тънкият трик (за мен грозен) с putenv("TZ=Europe/Sofia")
(смяна на часовата зона с putenv()), играчката е голяма с преизчисляване
на времето от една часова зона в друга.
Редактиран на: 23-08-2003@14:24
[Отговори на този коментар]