BVIsoft.com - документация, статьи и примеры по PHP. [Назад]

PHP в вопросах и ответах. Часть I.[Печать]
Разместил: admin . Раздел: Для начинающих. Опубликовано: 07-25-2007 22:31:40

Ниже приведены ответы на наиболее часто задаваемые вопросы в форумах посвященных программированию на PHP.

Вопрос: Как определить версию браузера?

Ответ. Выполните эту программу и Вам все станет ясно:
<body text=white bgcolor=black>

<?php

echo "Ваш адрес (REMOTE_ADDR):
<font color=#ccccff><b><big>
".getenv("REMOTE_ADDR")." </big></b></font><br><br>";
echo "Ваша программа (HTTP_USER_AGENT): <font color=#ccccff><b>
".getenv("HTTP_USER_AGENT")." </b></font><br><br>";
echo "Предыдущая страница (HTTP_REFERER): <font color=#ccccff><b>
".getenv("HTTP_REFERER")." </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]";
   }
?>

Если у Вас сложная структура и двухмерный массив ($asd['info']['name']), то делайте (в echo) вот так:

<?php 
 echo "Ваше имя - {".$asd[info][name]."}";
?>

Вопрос:Как преобразовать IP в число integer и обратно?

Ответ.Для чего нужно преобразовывать 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 функции прямо во время вставки/выборки.

Источник: http://www.softportal.com/   Прочитана 1132 раз.