Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Ответ 002 на задачу N 21
 
 автор: SoftTime   (25.05.2007 в 13:58)   письмо автору
 
 

Ответ 002 на задачу N 21.
С условиями задачи можно ознакомится по ссылке.
Вот моё решение ))) Надеюсь, что задание понял правильно и ничего не забыл...

<?php
mysql_connect
("localhost""root"""); // Подключаемся к БД
mysql_select_db("guests"); // Выбираем нужную нам БД
//Проверяем, пусты ли два ГЕТ-параметра и если да, то...
if(empty($_GET['name']) AND empty($_GET['razdel']))
{
//Проверяем, нажата или нет кнопка с названием enter и если нет, то...
if(!isset($_POST['enter']))
{
//Начинается форма для апгрейда\создания записи в таблице
?>
<form method="post">
<input name="guestname" type="text" value="" <? echo $text_disabled?>> - Ваше имя<BR>
<input name="enter" type="submit" value="Зайти">
</form>
<?
//Смотрим, если ГЕт-переменная не пуста, то выводим имя в приветствие, если же пуста, то имя будет ГОСТЬ
if(!empty($_GET['yourname']))
{
  
$yourname $_GET['yourname'];
}
else
{
    
$yourname "ГОСТЬ";
}
// Выводим ПРИВЕТСТВИЕ
echo "Привет, ".$yourname."! Вы знаете, что в Вашем имени ".strlen($yourname)." символов? <BR>
           Нас уже посетили: <BR>"
;
//Переменная, содержащая в себе выполняемый запрос к таблице  guests
$visits_query mysql_query("SELECT * FROM guests");
$i=0;
echo 
"<table border=1>";
echo 
"<tr>
<td>№</td>
<td>Гость</td>
<td>визит</td>
<td>x</td>
</tr>"
;
//Создаём массив
while($va mysql_fetch_array($visits_query))
{
// Увеличиваем значение переменной на единицу
$i++;
echo 
"<tr>
<td>"
.$i."</td>
<td><a href='?name="
.$va['guestname']."'>".$va['guestname']."</a></td>
<td>"
.$va['visits']."</td>
<td><a href='?razdel=del&guestname="
.$va['guestname']."'>del</a></td>
</tr>"
;
}
echo 
"</table>";
echo 
"<BR><BR>
"
;
//Форма поиска юзера
?>
<form  method="GET">
<input name="name" type="text" value=""> - найти гостя по <b>ТОЧНОМУ</b> имени<BR>
<input type="submit" value="Искать">
</form>
<?
}
else
{
  
//Переменная с запросов для поиска юзера
  
$prov_enter_users_query mysql_query("SELECT * FROM guests WHERE guestname='".$_POST['guestname']."'");
  
//Есть ли юзер с таким именем уже в таблице, если да, то...
  
if(mysql_num_rows($prov_enter_users_query) > 0)
  {
    
//Обновить число его визитов на один
    
mysql_query("UPDATE guests SET visits=visits+1 WHERE guestname='".$_POST['guestname']."'");
    
//Обновить страницу
      
echo "<meta http-equiv='refresh' content='0; url=index.php?yourname=".$_POST['guestname']."'>";
  }
  else
  {
    
// а если нет, то посмотреть длину имени, если больше 255, то...
    
if(strlen($_POST['guestname']) > 255)
    {
      
// вывести ошибку
        
echo "Error! Имя слишком длинное...";
        
//Обновить страницу
           
echo "<meta http-equiv='refresh' content='1; url=index.php'>";
    }
    else
    {
      
// а если нет, то создать еще одну запись с именем юзера и числом заходов равным 1
        
mysql_query("INSERT INTO guests
        (`guestname`, `visits`)
        VALUES
        ('"
.$_POST['guestname']."', 1)");
        
//Обновить страницу
          
echo "<meta http-equiv='refresh' content='0; url=index.php?yourname=".$_POST['guestname']."'>";
      }
    }
}
}
elseif(!empty(
$_GET['name']))
{
  
//Переменная с запросов для поиска юзера
  
$name_prov mysql_query("SELECT * FROM guests WHERE guestname='".$_GET['name']."'");
  if(
mysql_num_rows($name_prov) > 0)
  {
    
//Если такой юзер найден, то вывести его имя и число визитов
    
$na mysql_fetch_array($name_prov);
    echo 
$na['guestname']." - имя <BR>
    "
.$na['visits']." - число визитов ";
  }
  else
  {
    
// Если же нет, то вывести сообщение с сожалением :)
    
echo "К сожалению такой пользователь ен анйден :( Мне очень жаль... новы главное не растраивайтесь, всё образумится... возможно чуть попозже такой пользователь объявится, вы с ним пообщаетесь и всё будет хорошо... Но не надо себя обнадёживать, этого может и не случиться :(";
  }
}
elseif(!empty(
$_GET['razdel']))
{
  
//Если ГЕТ-параметр razdel не пуст, то посмотреть, пуст ли ГЕТ-параметр guestname
  
if(empty($_GET['guestname']))
  {
    
// если да, то вывести ошибку
      
echo "Вы не указали логин гостя которого надо удалить из БД";
  }
  else
  {
    
// если нет, то в переменную засунуть запрос с поиском юзера по имени
    
$login_prov_query mysql_query("SELECT * FROM guests WHERE guestname='".$_GET['guestname']."'");
    
// если такой есть, то...
    
if(mysql_num_rows($login_prov_query) > 0)
    {
      
//Удалить его из таблицы и обновить страницу
        
mysql_query("DELETE FROM guests WHERE guestname='".$_GET['guestname']."'");
        echo 
"<meta http-equiv='refresh' content='0; url=index.php'>";
    }
    else
    {
      
// Если же нет, то вывести сообщение
        
echo "Гость с таким именем не найден!";
    }
  }
}
?>


http://www.softtime.ru/info/task.php?id_article=110

   
 
 автор: cheops   (01.06.2007 в 12:09)   письмо автору
 
   для: SoftTime   (25.05.2007 в 13:58)
 

1) 139 строк, читабельность не плохая, комментарии присуствуют.

2) При создании динамических запросов не обрабатываются кавычки - это приводит к тому, что возможна SQL-инъекция http://www.softtime.ru/article/index.php?id_article=81. Кроме того, пользователи вида "i don't know" войти уже не смогут. Все тектовые строки перед помещением в SQL-запрос следует обрабатывать при помощи конструкции
<?php
  
if (!get_magic_quotes_gpc())
  {
     
$_POST['guestname'] = mysql_escape_string($_POST['guestname']); 
   }
?>

А собственно одна из главных особенностей этого задания - корректная вставка текста в СУБД.

3) Нет обработки ошибок SQL-запросов, запросы являются динамическими и ошибки могут возникать. Да и просто может быть выбрана неправильная база данных.

4) Привязка к названию файла (index.php) - плохо.

5) Перед удалением пользователя не спрашивает подтверждение - плохо.

   
 
 автор: Trianon   (01.06.2007 в 18:31)   письмо автору
 
   для: SoftTime   (25.05.2007 в 13:58)
 

Скрипт работает нестабильно.
Причиной этого, насколько я мог понять, является построение с применением meta refresh, такой механизм очень чувствителен к настройкам кеширования.
Во всяком случае у меня скрипт внезапно без определенной причины вообще переставал реагировать на ввод имен, ранее в нем вводившихся.
Более точно определить причину я не успел.
Кстати отсутствие отступов в верхней части скрипта не способствует тому, чтобы оперативно въехать в его логику.

Немного скриншотов процесса проверки см. в аттаче

   
 
 автор: sms-send   (01.06.2007 в 19:53)   письмо автору
 
   для: Trianon   (01.06.2007 в 18:31)
 

>Немного скриншотов процесса проверки см. в аттаче

аттачи то будут?

   
 
 автор: Trianon   (01.06.2007 в 20:54)   письмо автору
 
   для: sms-send   (01.06.2007 в 19:53)
 

Не берут у меня архивы.
Глядите здесь.

   
 
 автор: DEM   (02.06.2007 в 00:30)   письмо автору
 
   для: SoftTime   (25.05.2007 в 13:58)
 

Спасибо за критику! ПРиму к сведению, в принципе уже некоторые скрипты изменил (например некоторые функции в новой CMS). В следующий раз приу всё это к сведению, как говорится попытка - не пытка )))

   
 
 автор: Trianon   (02.06.2007 в 00:32)   письмо автору
 
   для: DEM   (02.06.2007 в 00:30)
 

Вам никто не мешает сделать еще одну попытку и в этот раз. :)

   
 
 автор: DEM   (02.06.2007 в 00:38)   письмо автору
 
   для: Trianon   (02.06.2007 в 00:32)
 

А разве уже не прекращёно принимание сркиптов? Тем более зная ошибки, их можно исправить и всё будет подходить под то, что нужно (просто прочитать ХЕОПСА и ВАШИ комментарии)

   
 
 автор: DEM   (04.06.2007 в 22:50)   письмо автору
 
   для: SoftTime   (25.05.2007 в 13:58)
 


<?php
ob_start
(); //Вклчаем возможность пользоваться header() где угодно.
//Функция безопасности :) $str - строчка которую будем хирургировать )))
function bez($str)
{
  
$str htmlspecialchars($strENT_QUOTES);
  
$str trim($str);
  
$str stripslashes($str);
  
$str strip_tags($str)
  
$str str_replace("'""&quot;"$str);
  
$str str_replace('"'"&quot;"$str);
  
$str str_replace('&'"&amp;"$str);
  
$str nl2br($str);
  if (!
get_magic_quotes_gpc())
  {
    
$str =  mysql_escape_string($str);
  }
  return 
$str;
}
mysql_connect("localhost""root""") OR dir("Невозможно найти сервер MySQL"); // Подключаемся к БД
mysql_select_db("guests") OR dir("Невозможность подключиться к БД"); // Выбираем нужную нам БД
//Исправляем переменные, что бы были, как надо :)
$_GET['name'] = bez($_GET['name']);
$_GET['razdel'] = bez($_GET['razdel']);
$_GET['yourname'] = bez($_GET['yourname']);

//Проверяем, пусты ли два ГЕТ-параметра и если да, то...
if(empty($_GET['name']) AND empty($_GET['razdel']))
{
//Проверяем, нажата или нет кнопка с названием enter и если нет, то...
if(!isset($_POST['enter']))
{
//Начинается форма для апгрейда\создания записи в таблице
?>
<form method="post">
<input name="guestname" type="text" value="" <? echo $text_disabled?>> - Ваше имя<BR>
<input name="enter" type="submit" value="Зайти">
</form>
<?
//Смотрим, если ГЕт-переменная не пуста, то выводим имя в приветствие, если же пуста, то имя будет ГОСТЬ
if(!empty($_GET['yourname']))
{
  
$yourname $_GET['yourname'];
}
else
{
    
$yourname "ГОСТЬ";
}
// Выводим ПРИВЕТСТВИЕ
echo "Привет, ".$yourname."! Вы знаете, что в Вашем имени ".strlen($yourname)." символов? <BR>
           Нас уже посетили: <BR>"
;
//Переменная, содержащая в себе выполняемый запрос к таблице  guests
$visits_query mysql_query("SELECT * FROM guests");
$i=0;
echo 
"<table border=1>";
echo 
"<tr>
<td>№</td>
<td>Гость</td>
<td>визит</td>
<td>x</td>
</tr>"
;
//Создаём массив
while($va mysql_fetch_array($visits_query))
{
// Увеличиваем значение переменной на единицу
$i++;
echo 
"<tr>
<td>"
.$i."</td>
<td><a href='?name="
.$va['guestname']."'>".$va['guestname']."</a></td>
<td>"
.$va['visits']."</td>
<td><a href='?razdel=del&guestname="
.$va['guestname']."'>del</a></td>
</tr>"
;
}
echo 
"</table>";
echo 
"<BR><BR>
"
;
//Форма поиска юзера
?>
<form  method="GET">
<input name="name" type="text" value=""> - найти гостя по <b>ТОЧНОМУ</b> имени<BR>
<input type="submit" value="Искать">
</form>
<?
}
else
{
  
$g_name bez($_POST['guestname']); // Изменяем имя пользователя (введёное) под нужное
  //Переменная с запросов для поиска юзера
  
$prov_enter_users_query mysql_query("SELECT * FROM guests WHERE guestname='".$g_name."'");
  
//Есть ли юзер с таким именем уже в таблице, если да, то...
  
if(mysql_num_rows($prov_enter_users_query) > 0)
  {
    
//Обновить число его визитов на один
    
mysql_query("UPDATE guests SET visits=visits+1 WHERE guestname='".$g_name."'");
    
//Обновить страницу
    
header("?yourname=".$g_name);
  }
  else
  {
    
// а если нет, то посмотреть длину имени, если больше 255, то...
    
if(strlen($g_name) > 255)
    {
      
// вывести ошибку
        
echo "Error! Имя слишком длинное...";
        
//Обновить страницу
         
header($_SERVER['PHP_SELF']);
    }
    else
    {
      
// а если нет, то создать еще одну запись с именем юзера и числом заходов равным 1
        
mysql_query("INSERT INTO guests
        (`guestname`, `visits`)
        VALUES
        ('"
.$g_name."', 1)");
        
//Обновить страницу
        
header("?yourname=".$g_name);
      }
    }
}
}
elseif(!empty(
$_GET['name']))
{
  
//Переменная с запросов для поиска юзера
  
$name_prov mysql_query("SELECT * FROM guests WHERE guestname='".$_GET['name']."'");
  if(
mysql_num_rows($name_prov) > 0)
  {
    
//Если такой юзер найден, то вывести его имя и число визитов
    
$na mysql_fetch_array($name_prov);
    echo 
$na['guestname']." - имя <BR>
    "
.$na['visits']." - число визитов ";
  }
  else
  {
    
// Если же нет, то вывести сообщение с сожалением :)
    
echo "К сожалению такой пользователь ен анйден :( Мне очень жаль... новы главное не растраивайтесь, всё образумится... возможно чуть попозже такой пользователь объявится, вы с ним пообщаетесь и всё будет хорошо... Но не надо себя обнадёживать, этого может и не случиться :(";
  }
}
elseif(!empty(
$_GET['razdel']))
{
  
//Если ГЕТ-параметр razdel не пуст, то посмотреть, пуст ли ГЕТ-параметр guestname
  
if(empty($_GET['guestname']))
  {
    
// если да, то вывести ошибку
      
echo "Вы не указали логин гостя которого надо удалить из БД";
  }
  else
  {
    
// если нет, то в переменную засунуть запрос с поиском юзера по имени
    
$login_prov_query mysql_query("SELECT * FROM guests WHERE guestname='".$_GET['guestname']."'");
    
// если такой есть, то...
    
if(mysql_num_rows($login_prov_query) > 0)
    {
      
//Удалить его из таблицы и обновить страницу
        
mysql_query("DELETE FROM guests WHERE guestname='".$_GET['guestname']."'");
        
header($_SERVER['PHP_SELF']);
    }
    else
    {
      
// Если же нет, то вывести сообщение
        
echo "Гость с таким именем не найден!";
    }
  }
}
?>

   
 
 автор: sms-send   (04.06.2007 в 23:05)   письмо автору
 
   для: DEM   (04.06.2007 в 22:50)
 

Вы явно переборщили с защитой:

<?php
function bez($str)
{
  
$str htmlspecialchars($strENT_QUOTES); // это явно не для базы
  
$str trim($str); // имя с пробелом на конце или в начале уже не прокатит, да и фик с ним
  
$str stripslashes($str); // вот это уже интересно, а если имя будет "my\'name"?
  
$str strip_tags($str); // хочу имя <sms-send>
  
$str str_replace("'""&quot;"$str);
  
$str str_replace('"'"&quot;"$str);
  
$str str_replace('&'"&amp;"$str); // после htmlspecialchars это уже не актуально
  
$str nl2br($str);
  if (!
get_magic_quotes_gpc())
  {
    
$str =  mysql_escape_string($str); // обработка для базы и для вывода должна идти отдельно
  
}
  return 
$str;
}
?>


что это за заголовок, догадываюсь, Location, наверно должен быть:

<?php
 header
("?yourname=".$g_name);
?>

   
 
 автор: DEM   (04.06.2007 в 23:47)   письмо автору
 
   для: sms-send   (04.06.2007 в 23:05)
 

Э???? Странно, что мне не выдало ошибку... мдя ((( ВОт исправленнй вариант (ксати, спасибо):

<?php
ob_start
(); //Вклчаем возможность пользоваться header() где угодно.
//Функция безопасности :) $str - строчка которую будем хирургировать )))
function bez($str)
{
  
$str htmlspecialchars($strENT_QUOTES);
  
$str trim($str);
  
$str str_replace(">""&gt;;"$str);
  
$str str_replace("<""&lt;;"$str);
  
$str str_replace("'""&quot;"$str);
  
$str str_replace('"'"&quot;"$str);
  
$str str_replace('&'"&amp;"$str);
  if (!
get_magic_quotes_gpc())
  {
    
$str =  mysql_escape_string($str);
  }
  return 
$str;
}
mysql_connect("localhost""root""") OR die("Невозможно найти сервер MySQL"); // Подключаемся к БД
mysql_select_db("guests") OR die("Невозможность подключиться к БД"); // Выбираем нужную нам БД
//Исправляем переменные, что бы были, как надо :)
$_GET['name'] = bez($_GET['name']);
$_GET['razdel'] = bez($_GET['razdel']);
$_GET['yourname'] = bez($_GET['yourname']);

//Проверяем, пусты ли два ГЕТ-параметра и если да, то...
if(empty($_GET['name']) AND empty($_GET['razdel']))
{
//Проверяем, нажата или нет кнопка с названием enter и если нет, то...
if(!isset($_POST['enter']))
{
//Начинается форма для апгрейда\создания записи в таблице
?>
<form method="post">
<input name="guestname" type="text" value="" <? echo $text_disabled?>> - Ваше имя<BR>
<input name="enter" type="submit" value="Зайти">
</form>
<?
//Смотрим, если ГЕт-переменная не пуста, то выводим имя в приветствие, если же пуста, то имя будет ГОСТЬ
if(!empty($_GET['yourname']))
{
  
$yourname $_GET['yourname'];
}
else
{
    
$yourname "ГОСТЬ";
}
// Выводим ПРИВЕТСТВИЕ
echo "Привет, ".$yourname."! Вы знаете, что в Вашем имени ".strlen($yourname)." символов? <BR>
           Нас уже посетили: <BR>"
;
//Переменная, содержащая в себе выполняемый запрос к таблице  guests
$visits_query mysql_query("SELECT * FROM guests");
$i=0;
echo 
"<table border=1>";
echo 
"<tr>
<td>№</td>
<td>Гость</td>
<td>визит</td>
<td>x</td>
</tr>"
;
//Создаём массив
while($va mysql_fetch_array($visits_query))
{
// Увеличиваем значение переменной на единицу
$i++;
echo 
"<tr>
<td>"
.$i."</td>
<td><a href='?name="
.$va['guestname']."'>".$va['guestname']."</a></td>
<td>"
.$va['visits']."</td>
<td><a href='?razdel=del&guestname="
.$va['guestname']."'>del</a></td>
</tr>"
;
}
echo 
"</table>";
echo 
"<BR><BR>
"
;
//Форма поиска юзера
?>
<form  method="GET">
<input name="name" type="text" value=""> - найти гостя по <b>ТОЧНОМУ</b> имени<BR>
<input type="submit" value="Искать">
</form>
<?
}
else
{
  
$g_name bez($_POST['guestname']); // Изменяем имя пользователя (введёное) под нужное
  //Переменная с запросов для поиска юзера
  
$prov_enter_users_query mysql_query("SELECT * FROM guests WHERE guestname='".$g_name."'");
  
//Есть ли юзер с таким именем уже в таблице, если да, то...
  
if(mysql_num_rows($prov_enter_users_query) > 0)
  {
    
//Обновить число его визитов на один
    
mysql_query("UPDATE guests SET visits=visits+1 WHERE guestname='".$g_name."'");
    
//Обновить страницу
    
header("Location: ?yourname=".$g_name);
  }
  else
  {
    
// а если нет, то посмотреть длину имени, если больше 255, то...
    
if(strlen($g_name) > 255)
    {
      
// вывести ошибку
        
echo "Error! Имя слишком длинное...";
        
//Обновить страницу
         
header("Location: ".$_SERVER['PHP_SELF']);
    }
    else
    {
      
// а если нет, то создать еще одну запись с именем юзера и числом заходов равным 1
        
mysql_query("INSERT INTO guests
        (`guestname`, `visits`)
        VALUES
        ('"
.$g_name."', 1)");
        
//Обновить страницу
        
header("Location: ?yourname=".$g_name);
      }
    }
}
}
elseif(!empty(
$_GET['name']))
{
  
//Переменная с запросов для поиска юзера
  
$name_prov mysql_query("SELECT * FROM guests WHERE guestname='".$_GET['name']."'");
  if(
mysql_num_rows($name_prov) > 0)
  {
    
//Если такой юзер найден, то вывести его имя и число визитов
    
$na mysql_fetch_array($name_prov);
    echo 
$na['guestname']." - имя <BR>
    "
.$na['visits']." - число визитов ";
  }
  else
  {
    
// Если же нет, то вывести сообщение с сожалением :)
    
echo "К сожалению такой пользователь ен анйден :( Мне очень жаль... новы главное не растраивайтесь, всё образумится... возможно чуть попозже такой пользователь объявится, вы с ним пообщаетесь и всё будет хорошо... Но не надо себя обнадёживать, этого может и не случиться :(";
  }
}
elseif(!empty(
$_GET['razdel']))
{
  
//Если ГЕТ-параметр razdel не пуст, то посмотреть, пуст ли ГЕТ-параметр guestname
  
if(empty($_GET['guestname']))
  {
    
// если да, то вывести ошибку
      
echo "Вы не указали логин гостя которого надо удалить из БД";
  }
  else
  {
    
// если нет, то в переменную засунуть запрос с поиском юзера по имени
    
$login_prov_query mysql_query("SELECT * FROM guests WHERE guestname='".$_GET['guestname']."'");
    
// если такой есть, то...
    
if(mysql_num_rows($login_prov_query) > 0)
    {
      
//Удалить его из таблицы и обновить страницу
        
mysql_query("DELETE FROM guests WHERE guestname='".$_GET['guestname']."'");
        
header("Location: ".$_SERVER['PHP_SELF']);
    }
    else
    {
      
// Если же нет, то вывести сообщение
        
echo "Гость с таким именем не найден!";
    }
  }
}
?>

   
 
 автор: Trianon   (05.06.2007 в 14:17)   письмо автору
 
   для: DEM   (04.06.2007 в 23:47)
 

мне показалось, что в скрипте ничего не изменилось...

Всё о же дикое количество нотайсов,
(хотя намек в скриншотах на то, что это скажется
на результате, трудно было не заметить).
Казалось бы ну что сложного добавить одну строку - ан нет.

Скрипт всё также некорректно отображает символы в таблице.
например имена & и &amp; он выводит одинаково - одним амперсендом.
И точно также глотает символы в имени total %25 of sales (в js-алерте).
Так что по главному требованию увы - незачет.

Скрипт устойчив к побочным эффектам (F5, go back, go forward).

Скрипт все также не обрабатывает ошибки БД.

Потом я перестал гонять скрипт на тестах, а решил посмотреть его код.
Самое начало - вот эта крамола "функция безопасности" поставила всё на места.
Автор всё еще считает, что безопасность - это такая штука,
которую можно упихать в одну функцию.
Грустно. :(

   
 
 автор: DEM   (05.06.2007 в 18:39)   письмо автору
 
   для: Trianon   (05.06.2007 в 14:17)
 

Это старая привычка :( Всё никак не могу отвыкнуть от неё... Просто вообще, всегда путаюсь, где какую надо исопльзовать... Раньше использовал htmlspecialchar(); и striptegs();, но вот потом стал делать так и никак не могу отвыкнуть :(


ЗЫ. Но я рад, если честно, что мой сркипт получился корявеньким :) Теперь есть смысл дальше учить РНР...

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования