Модераторы: Aliance, skyboy, MoLeX, ksnk

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Библиотека самых бесполезных кусков кода, или как не стоит писать на РНР 
:(
    Опции темы
smartov
Дата 25.8.2006, 11:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


свой собственный
****


Профиль
Группа: Экс. модератор
Сообщений: 4225
Регистрация: 2.2.2006
Где: NJ

Репутация: 2
Всего: 259



Vreden, у тебя похерилась кодировка. Ну и чтоли твои кракозябры раскодировать? Раскодировать не буду. Посему код со своими комментами.

Код

<?

function print_and_Die($messageHTML)
{
    echo $messageHTML;
    exit;
}

$login = $_POST['login'];
$parol = $_POST['parol'];
$parol_povtor = $_POST['parol_povtor'];

if (preg_match('/[^\w\d]+/', $login)) //non alphanumeric symbols in login
    print_and_Die("<html><body bgcolor='black' text='green'><p align='center'> Îøèáêà. <br> Âû èñïîëüçîâàëè çàïðåùåííûå ñèìâîëû â èìåíè ïåðñîíàæà. Ïîïðîáóéòå åùå ðàç. <br><a href='registr.html'> Åù¸ ðàç </></p></body></html>");

if (is_numeric($login[0])) //only numeric symbols in login
    print_and_Die("<html><body bgcolor='black' text='green'><p align='center'> Îøèáêà. <br> Èìÿ âàøåãî ïåðñîíàæà íà÷èíàåòñÿ ñ öèôðû. Ïîïðîáóéòå åùå ðàç. <br><a href='registr.html'> Åù¸ ðàç </></p></body></html>");

if ($parol != $parol_povtor) //passwords mismatch
    print_and_Die("<html><body bgcolor='black' text='green'><p align='center'> Îøèáêà. <br> Ââåäåííûå âàìè ïàðîëè íå ñîâïàäàþò. Ïîïðîáóéòå åùå ðàç. <br><a href='registr.html'> Åù¸ ðàç </></p></body></html>");

if (trim($login[0]) == "") //login is empty
    print_and_Die("<html><body bgcolor='black' text='green'><p align='center'> Îøèáêà. <br> Ââåäèòå ïîæàëóéñòà Âàø ëîãèí. <br><a href='registr.html'> Åù¸ ðàç </></p></body></html>");

if ($parol[0] == "") // password is empty
    print_and_Die("<html><body bgcolor='black' text='green'><p align='center'> Îøèáêà. <br> Ââåäèòå ïîæàëóéñòà Âàø ïàðîëü. <br><a href='registr.html'> Åù¸ ðàç </></p></body></html>");

if (strlen($login) < 3) //login length is less 3
    print_and_Die("<html><body bgcolor='black' text='green'><p align='center'> Îøèáêà. <br> Ëîãèí ñîñòîèò ìåíåå, ÷åì èç òðåõ ñèìâîëîâ. <br><a href='registr.html'> Åù¸ ðàç </></p></body></html>");

if (strlen($parol) < 8) //minimal passwd length = 8
    print_and_Die("<html><body bgcolor='black' text='green'><p align='center'> Îøèáêà. <br> Ïàðîëü ñîñòîèò ìåíåå, ÷åì èç âîñüìè ñèìâîëîâ. <br><a href='registr.html'> Åù¸ ðàç </></p></body></html>");

mysql_connect("localhost","root") or die(mysql_error());
mysql_select_db("test") or die (mysql_error());

$del = mysql_query('select * from `user` where  login="'.$login.'"') or die (mysql_error());
$del= mysql_fetch_array($del);

if ($del[1] == $login) //such user exists
    print_and_Die("<html><body bgcolor='black' text='green'><p align='center'> Îøèáêà. <br> Òàêîé ëîãèí óæå ñóùåñòâóåò. Ïðèäóìàéòå ïîæàëóéñòà äðóãîé. <br><a href='registr.html'> Åù¸ ðàç </></p></body></html>");

session_start();

//S_M_A_R_T_O_V COMMENT: SINCE PHP 4 THERE IS NO NEED IN session_register
//session_register("loginuser"); 
//session_register("paroluser");

//S_M_A_R_T_O_V COMMENT: STOP USING IDIOTIK REGISTER GLOBALS!!!!!!!!!!!!!!!!!!!!!!!!!
//$loginuser = $login;
//$paroluser = $parol;
//S_M_A_R_T_O_V COMMENT: ZACHEM HRANIT PAROL V SESSII??????

$_SESSION['loginuser'] = $login;
//$_SESSION['paroluser'] = $parol;
header("location: registr2.html");
?>

PM MAIL   Вверх
skyboy
Дата 25.8.2006, 11:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: нет
Всего: 260



блоки "<html><body>" и прочие части ты печатаешь в любом случае. так зачем тогда их в каждую ветвь if'a вставлять?
PM MAIL   Вверх
smartov
Дата 25.8.2006, 11:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


свой собственный
****


Профиль
Группа: Экс. модератор
Сообщений: 4225
Регистрация: 2.2.2006
Где: NJ

Репутация: 2
Всего: 259



skyboy, угу smile но дальше оптимизячить меня задолбало. Я б вообще все не так писал
PM MAIL   Вверх
Ignat
Дата 25.8.2006, 11:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Флудератор
****


Профиль
Группа: Экс. модератор
Сообщений: 4030
Регистрация: 19.4.2004
Где: غيليندزيك مدينة

Репутация: 2
Всего: 73



Лёх, к запросу:
Код

$del = mysql_query('SELECT `login` FROM `user` WHERE `login`="'.$login.'"') or die (mysql_error());






--------------------
Теперь при чем :P
PM   Вверх
smartov
Дата 25.8.2006, 11:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


свой собственный
****


Профиль
Группа: Экс. модератор
Сообщений: 4225
Регистрация: 2.2.2006
Где: NJ

Репутация: 2
Всего: 259



Ignat, дырка в секьюрити smile а что к запросу smile
PM MAIL   Вверх
Ignat
Дата 25.8.2006, 12:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Флудератор
****


Профиль
Группа: Экс. модератор
Сообщений: 4030
Регистрация: 19.4.2004
Где: غيليندزيك مدينة

Репутация: 2
Всего: 73



Цитата(smartov @  25.8.2006,  12:59 Найти цитируемый пост)
а что к запросу 

В смысле SQL тоже по правилам оформлять надо.

еще порефакторил, взял за основу код smartov
Код

<?php

/**
* There is no include config file. So defines is used.
*/
//! Mysql
DEFINE( 'MYSQL_HOST', 'localhost' );
DEFINE( 'MYSQL_USER', 'root' );
DEFINE( 'MYSQL_PASS', '' );
DEFINE( 'MYSQL_DB', 'test' );

//! Sequrity
DEFINE( 'MIN_PASS_LEN', 8 );
DEFINE( 'MIN_LOGIN_LEN', 3 )

//! Errors
DEFINE( 'ERR_SHORT_PASS', 1<<0 );
DEFINE( 'ERR_SHORT_LOGIN', 1<<1 );
DEFINE( 'ERR_NON_ALPHA', 1<<2 );
DEFINE( 'ERR_ONLY_NUM', 1<<3 );
DEFINE( 'ERR_PASS_MISSMATCH', 1<<4 );
DEFINE( 'ERR_EMPTY_LOGIN', 1<<5 );
DEFINE( 'ERR_PASS_EMPTY', 1<<6 );

$messages = array();
$messages[ERR_SHORT_PASS] = "I^?e`a'e^a`. <br /> Ia`?i^eu n~i^n~o`i^e`o` i`a*i'a*a*, ?a*i` e`c, a^i^n~ui`e` n~e`i`a^i^ei^a^. <br /><a href='registr.html'> A*u`? ?a`c,";
$messages[ERR_SHORT_LOGIN] = "I^?e`a'e^a`. <br /> Ei^a~e`i' n~i^n~o`i^e`o` i`a*i'a*a*, ?a*i` e`c, o`?a*o~ n~e`i`a^i^ei^a^. <br /><a href='registr.html'> A*u`? ?a`c,";
$messages[ERR_NON_ALPHA] = "I^?e`a'e^a`. <br /> A^u^ e`n~ii^euc,i^a^a`ee` c,a`i?a*u`a*i'i'u^a* n~e`i`a^i^eu^ a^ e`i`a*i'e` ia*?n~i^i'a`?a`. Ii^i?i^a'o'e'o`a* a*u`a* ?a`c,. <br /><a href='registr.html'> A*u`? ?a`c,";
$messages[ERR_ONLY_NUM] = "I^?e`a'e^a`. <br /> E`i`y a^a`?a*a~i^ ia*?n~i^i'a`?a` i'a`?e`i'a`a*o`n~y n~ oe`o^?u^. Ii^i?i^a'o'e'o`a* a*u`a* ?a`c,. <br /><a href='registr.html'> A*u`? ?a`c, ";
$messages[ERR_PASS_MISMATCH] = "I^?e`a'e^a`. <br /> A^a^a*aa*i'i'u^a* a^a`i`e` ia`?i^ee` i'a* n~i^a^ia`aa`?o`. Ii^i?i^a'o'e'o`a* a*u`a* ?a`c,. <br /><a href='registr.html'> A*u`? ?a`c,";
$messages[ERR_EMPTY_LOGIN] = "I^?e`a'e^a`. <br /> A^a^a*ae`o`a* ii^?a`eo'e'n~o`a` A^a`? ei^a~e`i'. <br /><a href='registr.html'> A*u`? ?a`c,";
$messages[ERR_PASS_EMPTY] = "I^?e`a'e^a`. <br /> O`a`e^i^e' ei^a~e`i' o'?a* n~o'u`a*n~o`a^o'a*o`. I?e`ao'i`a`e'o`a* ii^?a`eo'e'n~o`a` a?o'a~i^e'. <br /><a href='registr.html'> A*u`? ?a`c,";
$messages[ERR_LOGIN_EXIST] = 'Text lost by Ignat =)';

function print_error( $messageHtml )
{
    open_body();
    echo $messageHtml;
    close_body();
}

function open_body( )
{
    echo '<html><body bgcolor="black" text="green"><p align="center">';
}

function close_body( )
{
    echo '</p></body></html>';
}

function test_login_duplicate( $login )
{
    $con = mysql_connect( MYSQL_HOST, MYSQL_USER, MYSQL_PASS ) or die( mysql_error() );
    mysql_select_db( MYSQL_DB ) or die ( mysql_error() );
    $res = mysql_query( 'SELECT `login` FROM `user` WHERE `login`="'.$login.'"') or die (mysql_error());
    $num = mysql_num_rows( );
    mysql_free_result( $res );
    mysql_close( $con );
    return ( $num == 0 ) ? true : false;
}

$login = $_POST['login'];
$parol = $_POST['parol'];
$parol_povtor = $_POST['parol_povtor'];

$error = 0;
//! non alphanumeric symbols in login
if ( preg_match( '/[^\w\d]+/', $login ) ) 
    $error = ERR_NON_ALPHA;
 //only numeric symbols in login
if ( is_numeric( $login ) )
    $error |= ERR_ONLY_NUM;
//passwords mismatch
if ( $parol != $parol_povtor )
    $error |= ERR_PASS_MISMATCH;
 //login is empty
if ( trim( $login[0] ) == "" ) 
    $error |= ERR_EMPTY_LOGIN
// password is empty
if ( $parol[0] == "" ) 
    $error |= ERR_EMPTY_PASS;
//login length is less MIN_LOGIN_LEN
if ( strlen( $login ) < MIN_LOGIN_LEN ) 
    $error |= ERR_SHORT_LOGIN;
//minimal passwd length MIN_PASS_LEN
if ( strlen( $parol ) < MIN_PASS_LEN ) 
    $error |= ERR_SHORT_PASS;
//such user exists
if ( !test_login_duplicate($login) ) 
    $error |= ERR_LOGIN_EXIST;

if ( $error > 0 )
{
    foreach( $messages as $err_code => $mesage )
        if ( $error&$err_code )
            print_error( $message );

    exit;
}



session_start();
//S_M_A_R_T_O_V COMMENT: SINCE PHP 4 THERE IS NO NEED IN session_register
//session_register("loginuser"); 
//session_register("paroluser");
//S_M_A_R_T_O_V COMMENT: STOP USING IDIOTIK REGISTER GLOBALS!!!!!!!!!!!!!!!!!!!!!!!!!
//$loginuser = $login;
//$paroluser = $parol;
//S_M_A_R_T_O_V COMMENT: ZACHEM HRANIT PAROL V SESSII??????
$_SESSION['loginuser'] = $login;
//$_SESSION['paroluser'] = $parol;
header("location: registr2.html");
?>



--------------------
Теперь при чем :P
PM   Вверх
IZ@TOP
Дата 25.8.2006, 15:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Панда-бир!
****


Профиль
Группа: Участник
Сообщений: 4795
Регистрация: 3.2.2003
Где: Бамбуковый лес

Репутация: 1
Всего: 73



Я, если честно, предложил что то вроде этого для обработки данных:

Код

<?php
/**
 * Товарисчи, не пользуемся шорт тегами!
 */

class ValidateTypes {
    const typeNonEmptyString            = 1;
    const typeEmptyString               = 2;
    const typeNonEmptyInt               = 3;
    const typeEmptyInt                  = 4;
    const typeValidName                 = 5;
    const typeValidPassword             = 6;
    const typeValidMail                 = 7;
}

/**
 * Класс валидации данных и типов
 *
 */
abstract class _ValidateDataType {
    
    /**
     * Данные для валидации
     * 
     * @example array(
     *      'field_name1'   => 'mixvalue 1',
     *      'field_nameN'   => '...',
     * )
     *
     * @var array
     */
    protected $__validation_array;
    
    /**
     * Указание типов полей данных для последующей валидации
     *
     * @var array
     */
    protected $__validation_types;
    
    /**
     * Сообщения об ошибках для разных полей данных
     *
     * @example array(
     *      'field_name1'   => 'errormessage 1',
     *      'field_nameN'   => '...',
     * )
     * 
     * @var array
     */
    protected $__validation_errors;
    
    protected $__defined_errors;
    protected $__default_error              = 'Empty data %s';
    protected $__default_type               = 1;
    
    protected function set_errors(array $_validation_errors, $_merge) {
        if($_merge) {
            $this->__validation_errors  = array_merge($this->__validation_errors, $_validation_errors);
        } else {
            $this->__validation_errors  = $_validation_errors;
        }
        return true;
    }
    
    protected function set_array(array $_validation_array, $_merge = false) {
        if($_merge) {
            $this->__validation_array   = array_merge($this->__validation_array, $_validation_array);
        } else {
            $this->__validation_array   = $_validation_array;
        }
        return true;
    }
    
    protected function set_types(array $_validation_types, $_merge = false) {
        if($_merge) {
            $this->__validation_types   = array_merge($this->__validation_types, $_validation_types);
        } else {
            $this->__validation_types   = $_validation_types;
        }
        return true;
    }
    
    protected function __is_failed() {
        return 0 == sizeof($this->__validation_errors);
    }
    
    protected function check($_field) {
        $_checks = (isset($this->__validation_types[$_field])) ?
            $this->__validation_types[$_field] :
            $this->__default_type;
            
        switch ($type) {
            case ValidateTypes::typeEmptyInt : {
                break;
            }
            case ValidateTypes::typeEmptyString : {
                break;
            }
            case ValidateTypes::typeNonEmptyInt : {
                break;
            }
            case ValidateTypes::typeNonEmptyString : {
                break;
            }
            case ValidateTypes::typeValidMail : {
                break;
            }
            case ValidateTypes::typeValidName : {
                // проверяем логин
                break;
            }
            case ValidateTypes::typeValidPassword : {
                // Проверяем пароль
                break;
            }
        }
        
        return true;
    }
    
    protected function __set_error($_field) {
        $this->__defined_errors[] = sprintf(
            ((isset($this->__validation_errors[$_field])) ? 
                $this->__validation_errors[$_field] :
                $this->__default_error), $_field);
        
        return true;
    }
    
    public function get_defined_errors() {
        return $this->__defined_errors;
    }
    
    public function get_first_error() {
        return reset($this->__defined_errors);
    }
    
    public function get_last_error() {
        return end($this->__defined_errors);
    }
    
    public function validate() {
        foreach ($this->__validation_array as $_field => $_data) {
            if(false === $this->check($_field, $_data)) {
                $this->__set_error($_field);
            }
        }
        
        if($this->__is_failed()) {
            return false;
        }
        
        return true;
    }
}

class ValidateDataType extends _ValidateDataType {
    
    public function __construct(array $_validation_array = array(), array $_validation_types = array(), array $_validation_errors) {
        $this->set_array($_validation_array);
        $this->set_types($_validation_types);
        $this->set_errors($_validation_errors);
    }
    
    public function get_defined_errors() {
        echo "Error: " . implode("<br />Error: ", $this->__defined_errors);
    }
}

$validate   = new ValidateDataType(
    $_POST,
    array(
        'login' => array(
            ValidateTypes::typeValidName, 'min' => 3, 'max' => 10,
         ),
        'parol' => array(
            ValidateTypes::typeValidPassword, 'min' => 8, 'max'   => 30,
        )
    ),
    array(
        'login' => 'Неверный формат имени пользователя',
        'login' => 'Неверный формат пароля',
    )
);

if($validate->validate()) {
    $validate->display_errors();
    exit;
}



--------------------
Один из розовых плюшевых-всадников апокалипсиса... очень злой...

Семь кругов ада для новых элементов языка
Мои разрозненные мысли
PM MAIL WWW ICQ Skype GTalk   Вверх
Ignat
Дата 25.8.2006, 15:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Флудератор
****


Профиль
Группа: Экс. модератор
Сообщений: 4030
Регистрация: 19.4.2004
Где: غيليندزيك مدينة

Репутация: 2
Всего: 73



IZ@TOP, зачОт,  smile 
Вот только одно замечание по коду:
аргументы в объявлениях и вызовах функций и методов класса принято обрамлять пробелами (по крайней мере меня за это "били долго").
Т.е. не так:
Код

    protected function check($_field) {
        $_checks = (isset($this->__validation_types[$_field])) ?
            $this->__validation_types[$_field] :
            $this->__default_type;

а так:
Код

    protected function check( $_field ) {
        $_checks = ( isset( $this->__validation_types[$_field] ) ) ?
            $this->__validation_types[$_field] :
            $this->__default_type;




--------------------
Теперь при чем :P
PM   Вверх
IZ@TOP
Дата 25.8.2006, 16:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Панда-бир!
****


Профиль
Группа: Участник
Сообщений: 4795
Регистрация: 3.2.2003
Где: Бамбуковый лес

Репутация: 1
Всего: 73



Ignat, в каждой команде по своему))) Меня щас бьют за большие отступы)) Перучиваюсь по чуть-чуть. 

Конкурс для новичков! Найди в моем коде 1000 и одну ошибку! Ну не тысячу, хотябы пару, так как писалось все быстро и не как рабочий а как теоретический пример. В следующий раз вообще интерфейсы писать буду )

ООП РУЛЕЗ!


--------------------
Один из розовых плюшевых-всадников апокалипсиса... очень злой...

Семь кругов ада для новых элементов языка
Мои разрозненные мысли
PM MAIL WWW ICQ Skype GTalk   Вверх
smartov
Дата 25.8.2006, 18:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


свой собственный
****


Профиль
Группа: Экс. модератор
Сообщений: 4225
Регистрация: 2.2.2006
Где: NJ

Репутация: 2
Всего: 259



IZ@TOP, эк однако тебя штыркнуло smile
не хватает только
class HelloWorld.... smile
PM MAIL   Вверх
faost
Дата 25.8.2006, 18:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 114
Регистрация: 5.11.2004

Репутация: нет
Всего: 2



Цитата(Ignat @ 25.8.2006,  15:36)
аргументы в объявлениях и вызовах функций и методов класса принято обрамлять пробелами 

А где принято? Очень вдруг интересно стало, откуда такая уверенность "в правильности" такого подхода

Примерно тот же вопрос к IZ@TOP по поводу 
Код

/**
 * Товарисчи, не пользуемся шорт тегами!
 */


Это сообщение отредактировал(а) faost - 25.8.2006, 18:59
--------------------
Если у вас нет проблем, значит вы уже умерли
PM MAIL   Вверх
Ignat
Дата 25.8.2006, 19:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Флудератор
****


Профиль
Группа: Экс. модератор
Сообщений: 4030
Регистрация: 19.4.2004
Где: غيليندزيك مدينة

Репутация: 2
Всего: 73



Цитата(faost @  25.8.2006,  19:55 Найти цитируемый пост)
откуда такая уверенность "в правильности" такого подхода

Я не претендую на истину. Меня в последнее время на работе много натаскивали на оформление кода. И вот был такой пунктик.
Хотя надо было выразиться так "ИМХО лучше оформлять пробелами". Кстати, я действительно проникся этим.




--------------------
Теперь при чем :P
PM   Вверх
Muchenik
Дата 25.8.2006, 21:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 174
Регистрация: 27.10.2005

Репутация: нет
Всего: 5



Цитата

аргументы в объявлениях и вызовах функций и методов класса принято обрамлять пробелами 

Мне тоже не совсем понятно почему так. В таких случаях  использую стандарт pear:


Код

foo($bar, $baz, $quux);


Из стандартов кодирования PEAR:
Цитата

 Вызовы функций должны быть написаны без отступв между именем функции, открывающей скобкой и первым параметром. Отступы в виде пробела должны присутствовать после каждой запятой в перечислении параметров. Пробелов также не должно быть между последним параметром, закрывающей скобкой и точкой с запятой

PM MAIL ICQ   Вверх
smartov
Дата 26.8.2006, 10:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


свой собственный
****


Профиль
Группа: Экс. модератор
Сообщений: 4225
Регистрация: 2.2.2006
Где: NJ

Репутация: 2
Всего: 259



Я тоже в коде стараюсь использовать PEAR-стандарт.
PM MAIL   Вверх
Rock
Дата 28.8.2006, 18:48 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 264
Регистрация: 13.1.2005
Где: Краснодар

Репутация: нет
Всего: 1



Кстати, не плохая тема, ведь учится как раз надо на чужих ошибках smile
Токо вот было бы лучше, если бы укзав код, вы бы указывали и на недостатки, объяснить, почему это не так. 
Как сделал IZ@TOP в первом посте, оставил свои комменты к когду
А то получается так, что с кода: 
Код

if (unlink("../news_photos/smalls/".$filename_old) == TRUE) {
     unlink("../news_photos/smalls/".$filename_old);
 }

Все знающие смеются smile А новички только затылки чешут, и продолжают делать так, возможно только никому теперь этого не показывая ))
Иначе эту тему смело в Юмор можно, да и только... имхо
PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Избранное | Следующая тема »


 




[ Время генерации скрипта: 0.0885 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.