faqs.org.ru

 Главная > Программирование > Web-программирование >

RU.PHP FAQ

Секция 2 из 2 - Предыдущая - Следующая

$p =PDF_new();
PDF_open_file($p, "");
PDF_begin_page($p, 595, 842);

/* ВОТ ЗДЕСЬ УКАЗЫВАЕТЬСЯ ПУТЬ К ФАЙЛУ НАСТРОЕК */
PDF_set_parameter($p, "resourcefile", "D:/php/pdf-related/pdflib.upr");

$font = PDF_findfont($p, "Arial", "cp1251", 1);
PDF_setfont($p, $font, 18.0);
PDF_set_text_pos($p, 50, 700);
PDF_show($p, "ПРОВЕРКА! УРА, РАБОТАЕТ!");
PDF_end_page($p);
PDF_close($p);
$buf = PDF_get_buffer($p);
$len = strlen($buf);
header("Content-type: application/pdf");
header("Content-Length: $len");
header("Content-Disposition: inline; filename=hello_php.pdf");
print $buf;
PDF_delete($p);

?>

3) ENJOY!!! :-)

> Igor Rulyov, info(c)de-kar.ru

-----------------------------------------------------------------------------
>>>>4. Работа с базами данных
-----------------------------------------------------------------------------
>>4.1. При выборке из базы не правильно сортирует русские буквы.
Если есть возможность, то запустите mysqld с опцией:
--default-character-set=cp1251, если нет, то попробуйте послать MySQL такой
запрос: SET CHARACTER SET cp1251_koi8 - это изменит набор символов для
текущего соединения. SET CHARACTER SET DEFAULT - установит обычную таблицу
символов.

Имейте ввиду, что эта настройка действует только для текущего соединения. Более
подробно в RTFM.

> trent

>
Для правильной работы ORDER BY и GROUP BY сервер MySQL должен знать текущий
набор символов. К сожалению, версии 3.х и 4.х MySQL могут иметь только _один_
charset на все базы одновременно. Задается в /etc/my.cnf:

[mysqld]
default-character-set=koi8_ru

Проверить можно так:

mysql> show variables like 'character_sets' ;
mysql> show variables like 'character_set' ;

В этом случае все символьные поля _во_всех_ таблицах будут храниться в KOI8-R.
Для того, чтобы работали клиенты ODBC из под Windows необходимо, чтобы первым
SQL оператором в Windows-приложении была команда:

SET CHARACTER SET cp1251_koi8 ;

Тогда включится перекодировка "на лету". На сервере будет KOI8-R, а на клиенте
Windows-1251 и все сортировки будут работать. Эту же команду можно прописать в
MyODBC 3.5х "SQL command on connect" (STMT=), она выполнится автоматически.

Другой вариант -- не использовать KOI8-R, а хранить базы в Windows-1251 и
сообщить об этом серверу, прописав в /etc/my.cnf:

[mysqld]
default-character-set=cp1251

> Alexander Voropay

>>4.2. Как перейти c MySQL на PostgreSQL?
Рекомендую http://www.webmasterbase.com/subcats/6
Migrate your site from MySQL to PostgreSQL -- Part 1
Migrate your site from MySQL to PostgreSQL -- Part 2

> Vova Rusakevich, 2:454/23.501

>>4.3. Добавляем запись с автоинкрементным уникальным индексом. Как узнать
>>значение последнего индекса?

Для MySQL
Есть замечательная функция mysql_insert_id ([идент. соединения]).
Возвращает целое значение, которое и есть необходимый идентификатор,
сгенерированный полем AUTO_INCREMENT в последем операторе INSERT.
Подробно см. в доках по функциям PHP.

Cледует обратить внимание на то, что mysql_insert_id получает число типа INT,
поэтому необходимо быть осторожным при использовании этой функции с полями
типа BIGINT.

> Dmitry Seleznev, 2:5095/6

Для MSSQL
Нужно сразу после insert выполнить запрос 'select @@IDENTITY newID from
Твоя_Таблица'. Получишь идентификатор для только что вставленной записи.
Подробнее о переменных см. в доках MS SQL.

> Andy Ice, 2:5012/8.13

>>4.4. Как взять картинку из BLOB?
Для MSSQL
Просто использовать функции mssql_* не получится, но можно использовать
odbc_*
Для ODBC
Должен быть создан так называемый System DSN в ODBC Admin
Вызов: getfoto.php?id=13
<?
$sql = odbc_connect("namedsn", "user", "password") or die('die message');
$query = odbc_exec($sql, "select FOTOFIELD from FOTOTABLE where ID=$id");
if ($fetched = odbc_fetch_row($query)) {
  $dbimage = odbc_result($query, "FOTO");
}
else
{
  $filename = "./none.jpg"; // Пустая картинка
  $fd = fopen ($filename, "rb");
  $dbimage = fread ($fd, filesize ($filename));
  fclose ($fd);
}
header('Content-type: image/jpeg');
//header('Content-Disposition: attachment; filename='.$id.'.jpg');
print $dbimage;
flush();
odbc_close($sql);
?>

> Andy Ice, 2:5012/8.13

>>4.5. Какую базу данных лучше всего выбрать?
Выбор базы данных (SQL-сервера) зависит от задач, которые планируются.

> Andy Ice, 2:5012/8.13

-----------------------------------------------------------------------------
>>>5. Работа с файлами
-----------------------------------------------------------------------------

>>5.1. Пытаюсь переслать картинку из файла, но она приходит частично,
>>"бьется", что делать?
Бинарные файлы нужно открывать с ключем "b", иначе в некоторых случаях файл
считается текстовым. Обычно такое происходит под Windows, но если в Вашей
системе параметр "b" не требуется, то он будет игнорироваться, поэтому
рекомендуется его все-таки употреб
<?
  $fp = fopen("/home/rasmus/file.txt", "rb");
?>

> Andy Ice, 2:5012/8.13


>>5.2. Почему при работе с csv-файлами теряются некоторые заглавные русские
>>буквы?
Потому что csv-файл должен удовлетворять одному, главному условию: текстовые
поля должны быть ограничены кавычками, т.е. пример такого плана:

1, "Фамилия Имя Отчество", "Должность"

> Andy Ice, 2:5012/8.13

>>5.3. При попытке отдать через header("Location: somefile") файл с
>>расширением pdf, doc, txt, IE открывает их в окне браузера. Как этого
>>избежать?
При отдаче файла через header("Location: somefile"), web сервер отдает еще
Content-type этого файла, который узнается по расширению файла. Информация о
соответствии content-а расширению берется web сервером из конфигурационного
файла mime.types. Броузеры в зависимости от получаемого Content-type знают
что дальше делать с этим файлом. При этом расширение файла броузеру ни о чем
не говорит, и если web сервер отдаст, к примеру, файл best_music.mp3 с
Content-type: application/msword, то, если в системе клиента установлен MS
Word, этот файл будет открыт им.
Для решения проблемы описанной в вопросе существуют два способа:

1. Отредактировать файл mime.types поставив желаемым расширениям файлов
(которые надо скачивать, а не открывать) в соответствие тип
application/octet-stream.
Недостатки:
- этот путь годится, если Вы яляетесь администратором сервера;
- изменения коснутся всех файлов, тип которых Вы переопределили, даже тех,
которые НАДО открывать в броузере.

2. Отдавать файл клиенту, не посредством header("Location: somefile"), а
организовав собственную процедуру отдачи файла. При этом появляется
возможность динамически менять Content-type, предоставив пользователю выбор,
открыть ли файл в броузере или просто скачать, записав на диск.
Недостатки:
- бОльшая нагрузка на сервер;
- бОльшие требования к объему RAM на сервере.

> Serge V. Tarasov

>>5.3. Как заставить браузер предлагать сохранять файл с нужным названием,
а не download.php?
В msdn нашел:

<?
    header("Content-Disposition: attachment; filename=work1.doc");
    $x = fread(fopen("test.doc", "rb"), filesize("test.doc"));
    echo $x;
?>

> Alexey Kolesnichenko

>>5.4 Как корректно заставить броузер скачать и записать файл вместо открытия
в окне с поддержкой докачки? (пример скрипта)
Предполагается, что
$cd - путь к файлу,
$fn - имя файла

<?php
$filename = $cd."/".$fn;
if (!file_exists($filename))
   {
    header ("HTTP/1.0 404 Not Found");
    exit;
   }
$fsize = filesize($filename);
$ftime = date("D, d M Y H:i:s T", filemtime($filename));
$fd = @fopen($filename, "rb");
if (!$fd){
  header ("HTTP/1.0 403 Forbidden");
  exit;
}
// Если запрашивающий агент поддерживает докачку
if ($HTTP_SERVER_VARS["HTTP_RANGE"]) {
  $range = $HTTP_SERVER_VARS["HTTP_RANGE"];
  $range = str_replace("bytes=", "", $range);
  $range = str_replace("-", "", $range);
  if ($range) {fseek($fd, $range);}
}
$content = fread($fd, filesize($filename));
fclose($fd);
if ($range) {
  header("HTTP/1.1 206 Partial Content");
}
else {
  header("HTTP/1.1 200 OK");
}
header("Content-Disposition: attachment; filename=$fn");
header("Last-Modified: $ftime");
header("Accept-Ranges: bytes");
header("Content-Length: ".($fsize-$range));
header("Content-Range: bytes $range-".($fsize -1)."/".$fsize);
header("Content-type: application/octet-stream");
print $content;
exit;

?>

> Serge V. Tarasov

>>5.5 Как сделать аттачмент к е-мейлy пpи отпpавке его с помощью фyнкции
mail?
<?
function XMail( $from, $to, $subj, $text, $filename)
{
$f         = fopen($filename,"rb");
$un        = strtoupper(uniqid(time()));
$head      = "From: $from\n";
$head     .= "To: $to\n";
$head     .= "Subject: $subj\n";
$head     .= "X-Mailer: PHPMail Tool\n";
$head     .= "Reply-To: $from\n";
$head     .= "Mime-Version: 1.0\n";
$head     .= "Content-Type:multipart/mixed;";
$head     .= "boundary=\"----------".$un."\"\n\n";
$zag       = "------------".$un."\nContent-Type:text/html;\n";
$zag      .= "Content-Transfer-Encoding: 8bit\n\n$text\n\n";
$zag      .= "------------".$un."\n";
$zag      .= "Content-Type: application/octet-stream;";
$zag      .= "name=\"".basename($filename)."\"\n";
$zag      .= "Content-Transfer-Encoding:base64\n";
$zag      .= "Content-Disposition:attachment;";
$zag      .= "filename=\"".basename($filename)."\"\n\n";
$zag      .= chunk_split(base64_encode(fread($f,filesize($filename))))."\n";

if (!@mail("$to", "$subj", $zag, $head))
 return 0;
else
 return 1;
}
?>

> Eugene Belyaev, 2:469/83.210

-----------------------------------------------------------------------------
>>>6. Работа с графикой
-----------------------------------------------------------------------------
>>6.1. Вздумалось мне локальную баннерную сеть написать, да еще и с подсчетом
>>показов. Вот и проблемка возникла: как из такой строки в HTML
>><img src="script.php"> показать картинку? Header() вроде как не проходит?
Хочется самому написать? Смотри PHP Manual в разделе GD Functions. Там
разберешься.
Или взять готовую банерокрутилку (по моему phpAds называеться,
http://www.hostcripts.com, http://php.resourceindex.com/).

> Vova Rusakevich, 2:454/23.501

>>6.2. Как с помощью GD-функций писать кириллицей на создаваемом изображении?
Надо делать так:

<?php

  header ("Content-type: image/png");
  $img = imagecreate(400, 30);
  $b = imagecolorallocate($img, 0, 0, 0);
  $w = imagecolorallocate($img, 255, 255, 255);
  imagettftext($img, 20, 0, 10, 20,
     $w, "c:/winnt/fonts/arial.ttf",
     win_uni("Это просто Test"));
  imagepng($img);
  imagedestroy($img);

function win_uni ($in) {
  $in = convert_cyr_string($in ,"w","i");
  $out = "";
  for ($i=0; $i < strlen($in); $i++) {
    $char = ord($in[$i]);
    $out .= ($char > 175)?"&#".(1040+($char-176)).";":$in[$i];
  }
  return $out;
}

?>

> (Дополнения и исправления by Serge V. Tarasov, max@arkos.ru)

> Sergey Volkov, deoxyribonuclein@gmx.net

-----------------------------------------------------------------------------
>>>7. Сетевые дела
-----------------------------------------------------------------------------
>>7.1. Почему с'апложенные jpeg-файлы не отобpажаются? (бьются?). Веб-сервер
>>- русский Апач.
Все дело в том, что русский Апач по умолчанию производит перекодировку
файлов. Так, символ с кодом 0х00 он заменяет на пробел (символ с кодом 0х20).
Для борьбы с этим эффектом нужно добавить в конфигурационный файл Апача
httpd.conf следующее:

<Location />
    CharsetRecodeMultipartForms Off
</Location>

> Dmitry Seleznev, 2:5095/6

>>7.2. Как опpеделить валидность e-mail?
<?
    function valid_mail ($email) {
        if (eregi("^[_\.0-9a-z-]+@([0-9a-z][0-9a-z-\.]+)\.([a-z]{2,4}$)",
        $email, $check)) {
            if (getmxrr($check[1] . "." . $check[2], $mxhosts)) {
                return "Valid";
            } else {
                return "No MX for " . $check[1] . "." . $check[2];
            }
        } else {
            return "Badly formed address";
        }
    }
?>

> Maxim Matyukhin

> Другой способ, использующий сокеты.
<?

/*
By: Jon S. Stevens jon@clearink.com
Copyright 1998-1999 Jon S. Stevens, Clear Ink
This code has all the normal disclaimers.
It is free for any use, just keep the credits intact.
*/

function validateEmail ( $email )
{
    global $SERVER_NAME;
    $return = array ( false, "" );
    list ( $user, $domain )  = split ( "@", $email, 2 );
    $tld = $domain;
    if ( checkdnsrr ( $tld, "MX" ) )
    {
        if ( getmxrr ( $tld, $mxhosts, $weight ) )
        {
            for ( $i = 0; $i < count ( $mxhosts ); $i++ )
            {
                $fp = fsockopen ( $mxhosts[$i], 25 );
                if ( $fp )
                {
                    $s = 0;
                    $c = 0;
                    $out = "";
                    set_socket_blocking ( $fp, false );
                    do
                    {
                        $out = fgets ( $fp, 2500 );
                        if ( ereg ( "^220", $out ) )
                        {
                            $s = 0;
                            $out = "";
                            $c++;
                        }
                        else if ( ( $c > 0 ) && ( $out == "" ) )
                        { break; }
                        else
                        { $s++;    }
                        if ( $s == 9999 ) { break; }

                    } while ( $out == "" );
                    set_socket_blocking ( $fp, true );

                    fputs ( $fp, "HELO $SERVER_NAME\n" );
                    $output = fgets ( $fp, 2000 );
                    fputs ( $fp, "MAIL FROM: <info@" . $tld . ">\n" );
                    $output = fgets ( $fp, 2000 );
                    fputs ( $fp, "RCPT TO: <$email>\n" );
                    $output = fgets ( $fp, 2000 );
                    if ( ereg ( "^250", $output ) )
                    {
                        $return[0] = true;
                    }
                    else
                    {
                        $return[0] = false;
                        $return[1] = $output;
                    }
                    fputs ( $fp, "QUIT\n" );
                    fclose( $fp );

                    if ( $return[0] == true )
                    { break; }
                }
            }
        }
    }
    return $return;
}
?>

> Jon S. Stevens


>>7.3. Как определить валидность URL?
<?
function check_url($url) {
    if (eregi( '^http://', $url)) {
        $urlArray = parse_url($url);
        if (!$urlArray[port]) $urlArray[port] =  '80';
        if (!$urlArray[path]) $urlArray[path] =  '/';
        $sock = fsockopen($urlArray[host], $urlArray[port], &$errnum,
                &$errstr);
        if (!$sock) $res =  'DNS';
        else {
        $dump .=  "GET $urlArray[path] HTTP/1.1\r\n";
        $dump .=  "Host: $urlArray[host]\r\nConnection: close\r\n";
        $dump .=  "Connection: close\r\n";
        fputs($sock, $dump);
        while ($str = fgets($sock, 1024)) {
            if (eregi("^http/[0-9]+.[0-9]+ ([0-9]{3}) [a-z ]*", $str))
                $res[code] = trim(eregi_replace(
                '^http/[0-9]+.[0-9]+([0-9]{3})[a-z ]*',
                "\\1", $str));
                if (eregi("^Content-Type: ", $str))
                    $res[contentType] = trim(eregi_replace(
                    "^Content-Type: ", "", $str));
            }
            fclose($sock);
            flush();
            return $res[code];
        }
    } else $res = "N/A";
    return $res;
}
?>

> Dmitry Seleznev, 2:5095/6

>>7.4. Как определить размер файла, если известен только его URL?
<?
    $hostname = "server2.ru"; // Имя сервера
    $filename = "/path_to_file/filename.ext"; // Файл, размер которого
    // надо узнать
    get_size($hostname, $filename);

    // А это сама функция узнавания размера
    function get_size($hostname, $filename)    {
        $end = false;
        $fp = fsockopen ($hostname, 80, &$errnr, &$errstr) or
            die("$errno:$errstr");
        fputs($fp,"HEAD ".$filename." HTTP/1.0\n\n");
        while (!$end) {
            $line = fgets($fp, 2048);
            if (trim($line) == "") {
                $end = true;
            } else {
                $str = explode(": ", $line);
                if ($str[0] == "Content-Length")
                    print "Size of ".$filename." file ".$str[1]." bytes";
            }
        }
        fclose($fp);
    }
?>

> Serge V. Tarasov

>>7.5. Как правильно перенаправить browser на нужный адрес?
Если следовать спецификациям HTTP/1.0 и HTTP/1.1, то pедиpект нужно делать
пpимеpно следующим обpазом:

<?
function my_redirect($url, $code = 302) {
if ($code == 303) {
preg_match('/^HTTP\/(\d)\.(\d)/', $_SERVER['SERVER_PROTOCOL'], $m);
if (intval($m[1])*10+intval($m[2]) < 11) { $code=302; }
}
if ($code == 303) {
Header($_SERVER['SERVER_PROTOCOL'].' 303 See Other');
} else {
Header($_SERVER['SERVER_PROTOCOL'].' 302 Found');
}
if (!strpos($url, '://')) { $url = 'http://'.$_SERVER['HTTP_HOST'].$url; }
Header('Location: '.$url);

?>

<html><head><title>Oops!</title></head><body><p><p>
Ваш бpаузеp не понимает HTTP redirect (status code: <?=$code?> ).<br>
Следуйте по <a href=" <?=$url?> ">этой ссылке</a>.
</body></html>
<?
}
?>

Пpимеpы использования
my_redirect('/index.html');
my_redirect('http://warez.dot.no/');
my_redirect('accepted.html', 303);

Пояснения
1. Функции можно пеpедавать в качестве пеpвого паpаметpа либо локальный
адpес (если pедиpект делается в пpеделах сайта), либо полный URL (если
pедиpект делается на дpугой хост).
2. По умолчанию pедиpект делается со status code 302; однако спецификация
HTTP/1.1 тpебует использования status code 303 в том случае, если pедиpект
делается скpиптом в качестве ответа на POST (RFC 2616, секция 10.3.4). Если
вы хоpошо поняли, о чём идёт pечь, то указывайте код 303 в качестве
втоpого (необязательного) паpаметpа пpи ответе на POST, как показано в
пpимеpе 3. Если не очень хоpошо поняли, не указывайте ничего -- всё будет
pаботать и так :)
3. Наличие небольшого гипеpтекстового довеска является обязательным
(RFC 2616, секция 10.3.3).
4. Само собой pазумеется, что скpипт не должен ничего выводить ДО вызова
этой функции.

> Dmitry Ban, 2:5020/1873.33

> Для перенаправления browser на нужный адрес (редирект) нужно
>воспользоваться конструкцией вида:
header("Location: " . $url);

Location должен задаваться абсолютным адресом, согласно RFC 2616
(http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.30):

"14.30 Location The Location response-header field is used to redirect the
recipient to a location other than the Request-URI for completion of the
request or identification of a new resource. For 201 (Created) responses,
the Location is that of the new resource which was created by the request.
For 3xx responses, the location SHOULD indicate the server's preferred URI
for automatic redirection to the resource. The field value consists of a
single absolute URI.

Location = "Location" ":" absoluteURI

An example is:
Location: http://www.w3.org/pub/WWW/People.html"

> Alexey Kolesnichenko

> Для перенаправления по относительному адресу:

header("Location: http://".$_SERVER['HTTP_HOST']
..dirname($_SERVER['PHP_SELF'])
.."/".$relative_url);

> anatoly techtonik

-----------------------------------------------------------------------------
>>>8. Безопасность
-----------------------------------------------------------------------------
>>8.1. Я хочу ограничить доступ к одной из страниц. Хочу, чтобы при попытке
>>открытия этой страницы браузер у клиента вывешивал окошко и предлагал
>>ввести логин?
Читать: http://www.php.net/manual/en/features.http-auth.php

> Vova Rusakevich, 2:454/23.501

>>8.2. Я - hosting provider, как мне организовать безопасность скриптов
>>виртуальных серверов, т.е. что бы юзер Вася не смог сделать fread() файла
>>юзера Пети?

Это делается при помощи диррективы PHP : safe_mode, и параметра open_basedir.
Пример:
<VirtualHost 195.206.40.162:*>
ServerName tit.irk.ru
LanguagePriority ru en
DocumentRoot /home/users/WWW
<Directory /home/users/WWW>
php_admin_value open_basedir /home/users/WWW
</Directory>
</VirtualHost>

В итоге, если "умный" юзер Вася пытается что-то сделать с файлами за
пределами его (/home/users/WWW) дирректории, то он получает:
Warning: open_basedir restriction in effect. File is in wrong directory.
in /home/users/WWW/ss.pht on line 3
Warning: fopen("/etc/passwd","r") - Operation not permitted in
/home/users/WWW/ss.pht on line 3

За более детальным конфигом с комментариями:
http://www.php4you.kiev.ua/docs/php_limit.html

> Vitaliy N. Kravchenko, kvn(@)phbme.ntu-kpi.kiev.ua

Что бы дать юзеру хранить/читать/писать в файлы вне www, но в пределах
доступности скрипта нужно исправить строку:
php_admin_value open_basedir /home/users

> Oleg Krasnov, 2:5062/17.77

-----------------------------------------------------------------------------
>>>9. Где взять...
-----------------------------------------------------------------------------
>>9.1. Документацию
>>9.1.1 Где взять документацию по PHP?
Документацию по PHP можно взять тут: http://www.php.net/docs.php.

> Andrey Saterenko

Однако для тех, у кого стоит windows, существует гораздо более удобный и
полезный вариант в .chm формате с комментариями пользователей.
http://weblabor.hu/php-doc-chm/

> anatoly techtonik

Русский мануал к PHP (авторский, не официальный перевод) версии 4.2.* в HTML
находится по адресу
http://pyramidin.narod.ru/dwnl.htm

> SeazoN aka Sergey Sazonenkov, 2:469/142.999

>>9.1.2. Информация по написанию модулей для php.
http://www.zend.com/
http://www.zend.com/apidoc/

> Vova Rusakevich, 2:454/23.501

>>9.1.3. Подскажите хороший сайт по php.

http://www.dklab.ru/ - Лаборатория dk
http://www.phpclub.net/ - PHPClub
http://php.spb.ru/ - PHP по-русски

-----------------------------------------------------------------------------
>>9.2. Скрипты
>>9.2.1. Где взять готовый скрипт гостевой, форума и т.п.?
Вот несколько ссылочек:
http://webscript.ru/
http://cgi.ru/
http://hotscripts.com/
http://cgi-fan.com/
http://www.phorum.org/
http://www.cgi-bin.ru/

>>9.2.2. Помимо гостевых, чатов и т.п. (хочется чего то..)

http://www.hotscripts.com/PHP/
http://sourceforge.net/

-----------------------------------------------------------------------------
>>9.3. Редакторы
>>9.3.1. Всё, что существует на сегодняшний момент, не считая Far, UltraEdit
>>и им подобных.
PHP Coder http://www.phpide.de/
PHPEdit http://www.phpedit.net/
PHP Expert Editor http://www.ankord.com/phpxedit.html
Turbo PHP http://www.turbophp.com/turbo/
QaDRAM http://www.qadram.com/
DzSoft PHP Editor http://www.dzsoft.com/dzphp.htm
Arisesoft Winsyntax http://www.winsyntax.com/

> Zubarev Andrey, oistets(a)bogatyr.kz

-----------------------------------------------------------------------------
>>9.4. Хостинг
>>9.4.1. Какие существуют халявные хостинги c поддержкой PHP?
Из наших:
http://www.webservis.ru
http://www.holm.ru
http://www.hut.ru
http://www.agava.ru
http://www.fatal.ru

>
> Эти, обычно, нареканий не вызывают
http://www.kombat.ru
http://www.zenon.ru

> Zubarev Andrey, oistets(a)bogatyr.kz

Секция 2 из 2 - Предыдущая - Следующая

Вернуться в раздел "Web-программирование" - Обсудить эту статью на Форуме
Главная - Поиск по сайту - О проекте - Форум - Обратная связь

© faqs.org.ru