PHP в вопросах и ответах. Часть I.
Автор: Дмитрий Бородин
Источник: php.spb.ru
Вопрос: Как определить версию браузера? Ответ. Выполните эту программу и Вам все станет ясно:
<body text=white bgcolor=black>
<?php
echo "Ваш адрес (REMOTE_ADDR):
<font color=#ccccff><b><big>\n\n
".getenv("REMOTE_ADDR")."\n\n</big></b></font><br><br>";
echo "Ваша программа (HTTP_USER_AGENT): <font color=#ccccff><b>\n\n
".getenv("HTTP_USER_AGENT")."\n\n</b></font><br><br>";
echo "Предыдущая страница (HTTP_REFERER): <font color=#ccccff><b>\n\n
".getenv("HTTP_REFERER")."\n\n</b></font><br>";
?>
Соответственно делаем if (strstr(getenv("HTTP_USER_AGENT"),"MSIE")) echo "Вы используете Internet Explorer"; и другие проверки (в зависимости от того, с какой целью Вы решили разделять браузеры).
Вопрос: У меня есть веб-форма с кучей данных. Как упростить обработку кучи полей из формы?
Ответ. Используйте массивы!
Важно!< Не используйте констукцию if ($название_поля) {действия} для проверки, установлена ли переменная. Следует использовать if (isset($названия_поля)) { ... }
<?php
<form ... >
Имя: <input type=text name=asd[]> <br>
Фамилия: <input type=text name=asd[]> <br>
Отчество: <input type=text name=asd[]> <br>
<input type=submit>
</form>
?>
<?php
for ($i=0; $i<count($asd); $i++) {
echo "$asd[$i]<br>";
}
?>
Если Вам важен порядок переменных (вдруг юзер на странице не все заполнит), то делаем так:
<?php
Имя: <input type=text name=asd[name]> <br>
Фамилия: <input type=text name=asd[name2]> <br>
?>
<?php
if ($asd[name]) { // в PHP пишите так: $asd['name']
echo "Ваше имя - $asd[name]";
}
?>
<?php
echo "Ваше имя - {".$asd[info][name]."}";
?>
Ответ. Для чего нужно преобразовывать IP в число int? Чтобы он (IP адрес) занимал меньше места. IP в виде строки: "222.222.222.222" - 15 байт. В виде числа - 4 байта. Это число можно писать в базу данных или переменную в PHP. В PHP 4 есть встроенные функции ip2long (аналог нашей ip2int) и logn2ip). Проверено - все функции работают на ура. Нужно соблюдать тип полей при вставке IP в базу: либo INT (для +/-), либо UNSIGNED INT (только +).
А теперь сами исходники функций:
Функция ip2int преобразует ip-адрес в число (которое можно хранить в PHP, помещать в MySQL...)
Функция int2ip преобразует число в ip-адрес...
<?php
function int2ip($i) {
$d[0]=(int)($i/256/256/256);
$d[1]=(int)(($i-$d[0]*256*256*256)256/256);
$d[2]=(int)(($i-$d[0]*256*256*256-$d[1]*256*256)/256);
$d[3]=$i-$d[0]*256*256*256-$d[1]*256*256-$d[2]*256;
return "$d[0].$d[1].$d[2].$d[3]";
}
function ip2int($ip) {
$a=explode(".",$ip);
return $a[0]*256*256*256+$a[1]*256*256+$a[2]*256+$a[3];
}
?>
Существует так же альтернативный вариант:
Можно переложить операции по переводу адресов на сам mySQL. Запрос select INET_ATON("209.207.224.40") вернет соответствующее число (3520061480). И наоборот, запрос select INET_NTOA(3520061480) вернет строку "209.207.224.40". mySQL переведет IP/число намного быстрее, чем функция на PHP или встроенная ip2long. Разумеется, нужно не select'ы делать (отдельным запросом), а использовать приведенные SQL функции прямо во время вставки/выборки.
![База каталогов для авторегистрации в AllSubmitter 4.x База каталогов для авторегистрации в AllSubmitter 4.x](../images/banners/tob.gif)