[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Звёзды
Unlikely
Решил сделать рейтинг для постов. Подумав пришёл к такому способу.

Создать таблицу:
id - int(11)
post - varchar(255)
total_score - int(11)
votes - int(11)
ip - varchar(255)

Далее
Нужно как то посылать и прибавлять цифру 1 or 2 or 3 or 4 or 5. Что то не могу придумать как отправлять пост тыком на ссылку... или, может форму сделать с 5 кнопками и отслеживать которая была нажата? Или 5 форм? тут у меня трудности... посоветуйте что нибудь пожалуйста?

Далее
Как прибавить 1 я знаю ++ smile.gif А как прибавить 5?

Далее
В ip я собираюсь добавлять адреса всех проголосовавших через пробел. И не могу придумать как потом сделать проверку...

Помогите кто чем может smile.gif



Спустя 35 минут, 39 секунд (11.06.2010 - 20:35) FatCat написал(а):
Цитата (Unlikely @ 11.06.2010 - 21:00)
А как прибавить 5?

+= 5


Цитата (Unlikely @ 11.06.2010 - 21:00)
В ip я собираюсь добавлять адреса всех проголосовавших через пробел.

Не много же их добавится.
ИМХО, лучше отдельную таблицу, в которой будут сопоставляться проголосовавшие айпишники айдишникам поста.

Спустя 23 минуты, 40 секунд (11.06.2010 - 20:59) Unlikely написал(а):
Цитата (FatCat @ 11.06.2010 - 17:35)
Не много же их добавится.
ИМХО, лучше отдельную таблицу, в которой будут сопоставляться проголосовавшие айпишники айдишникам поста.

Не понимаю в чём суть...

А, блин. Понял smile.gif
Ну можно на текст заменить.

Спустя 52 минуты, 4 секунды (11.06.2010 - 21:51) FatCat написал(а):
Конструкция
WHERE id = 999 AND ip LIKE '%127.0.0.1%'
работает намного медленней, чем
WHERE id = 999 AND ip = '127.0.0.1'

Спустя 38 минут, 7 секунд (11.06.2010 - 22:29) Unlikely написал(а):
FatCat
Я хотел немного иначе делать.
Вытягивать все ip, и уже в переменной искать ip пользователя.

Думаю что ещё с одной таблицей будет лучше smile.gif Спасибо.

Спустя 10 минут, 9 секунд (11.06.2010 - 22:39) Unlikely написал(а):
Только придётся делать всегда 2 запроса... insert в ip и update в rating

Спустя 11 минут, 27 секунд (11.06.2010 - 22:51) FatCat написал(а):
Представь, что какому-то сообщению проголосуют тысячи...
Плох тот форум, который не готов стать миллионником. wink.gif
Селект и апдейт текстового поля, в котором через пробел тысячи айпишником съест на пару порядков больше ресурсов, чем два простых запроса.

Спустя 37 минут, 51 секунда (11.06.2010 - 23:29) Unlikely написал(а):
FatCat
Убедили меня окончательно smile.gif

Спустя 1 час, 48 минут, 42 секунды (12.06.2010 - 01:17) Unlikely написал(а):
Начал потихоньку писать.

Таблица posts_rating:
id - int(11)
post - int(11)
total_score - int(11)
votes - int(11)

Таблица posts_rating_ip:
id - int(11)
post - int(11)
ip - varchar(15)

Сделал простой вывод оценки show_rating.php:
<?php

$id = $_SESSION['post_id'];
$rating_res = mysql_query("SELECT `total_score`, `votes` FROM `posts_rating` WHERE `post` = '$id'", $connection);

if(mysql_num_rows($rating_res) > 0) {
$rating_row = mysql_fetch_assoc($rating_res);

printf("Rating: %.1f", $rating_row['total_score'] / $rating_row['votes']);
}

?>


Начал писать скрипт добавления оценок и остановился после открытия php тегов. Никак не могу придумать как посылать в него оценку, но думаю через get не стоит этого делать. Подскажите что нибудь?

Спустя 1 час, 45 минут, 13 секунд (12.06.2010 - 03:03) FatCat написал(а):
Не вижу причин, почему не гетом. unsure.gif
<input type="radio" ...> - если минимальный дизайн.
Да хоть картинки без тега <form>, просто в гиперлинке жестко прописать параметр.

Спустя 4 часа, 11 минут, 42 секунды (12.06.2010 - 07:14) Unlikely написал(а):
FatCat
Просто как то не по душе когда видать передаваемые данные smile.gif

Вот что получилось
<?php session_start();

if($_GET['score'] == 1 or $_GET['score'] == 2 or $_GET['score'] == 3 or $_GET['score'] == 4 or $_GET['score'] == 5) {
$id = $_SESSION['post_id'];
$ip = getenv("REMOTE_ADDR");
$score = $_GET['score'];

require('../config/config.php');
require('../config/db_connect.php');

$ip_res = mysql_query("SELECT `id` FROM `posts_rating_ip` WHERE `post` = '$id' AND `ip` = '$ip'", $connection);

if(mysql_num_rows($ip_res) > 0) {
header("Location: {$_SERVER['HTTP_REFERER']}");
}

else {
$id_res = mysql_query("SELECT `post`, `total_score`, `votes` FROM `posts_rating` WHERE `post` = '$id'", $connection);

if(mysql_num_rows($id_res) == 1) {
$up_rating = mysql_fetch_assoc($id_res);
$up_rating['total_score']+=$score;
$up_rating['votes']++;

mysql_query("UPDATE `$DB_NAME`.`posts_rating` SET `total_score` = '{$up_rating['total_score']}', `votes` = '{$up_rating['votes']}' WHERE `posts_rating`.`post` = '$id';", $connection);
mysql_query("INSERT INTO `$DB_NAME`.`posts_rating_ip` (`post`, `ip`) VALUES ('$id', '$ip')", $connection);

header("Location: {$_SERVER['HTTP_REFERER']}");
}

else {
mysql_query("INSERT INTO `$DB_NAME`.`posts_rating` (`post`, `total_score`, `votes`) VALUES ('$id', '$score', '1')", $connection);
mysql_query("INSERT INTO `$DB_NAME`.`posts_rating_ip` (`post`, `ip`) VALUES ('$id', '$ip')", $connection);

header("Location: {$_SERVER['HTTP_REFERER']}");
}
}
}


else {
header("Location: {$_SERVER['HTTP_REFERER']}");
}

?>


Кажется всё правильно работает.
Может быть можно как нибудь улучшить?

Спустя 5 часов, 30 минут, 24 секунды (12.06.2010 - 12:45) FatCat написал(а):
Цитата (Unlikely @ 12.06.2010 - 08:14)
Может быть можно как нибудь улучшить?

1. sql сама умеет считать.
2. Не люблю фигурные скобки. biggrin.gif

____________________________

 mysql_query("UPDATE `$DB_NAME`.`posts_rating` SET `total_score` =  total_score`+ ".$score.", `votes` = `votes`+1 WHERE `posts_rating`.`post` = ".$id, $connection);

Спустя 1 час, 14 минут (12.06.2010 - 13:59) Unlikely написал(а):
FatCat
Здорово, а я и не знал smile.gif

А на счёт скобок я думаю что работает шустрей чем конкатенация. Или нет?

Вот ещё про эту заявку спросить хотел
mysql_query("SELECT `id` FROM `posts_rating_ip` WHERE `post` = '$id' AND `ip` = '$ip'", $connection);


Беру id и сравниваю. Думал добавить count() но что то не получилось разобраться как это работает.

Спустя 3 часа, 12 минут, 33 секунды (12.06.2010 - 17:11) FatCat написал(а):
Цитата (Unlikely @ 12.06.2010 - 14:59)
на счёт скобок я думаю что работает шустрей чем конкатенация.

Говорят что быстрее. Но это такая мелочь... Если не внутри огромного цикла, то ей можно пренебречь.


Цитата (Unlikely @ 12.06.2010 - 14:59)
Думал добавить count() но что то не получилось разобраться

GROUP BY `поле_по_которому_группируем`

Спустя 23 часа, 16 минут, 52 секунды (13.06.2010 - 16:28) Unlikely написал(а):
FatCat
Всё равно не пойму. В phpmyadmin ввёл запрос, получил вывод count(id)=1. И как получать этот результат? $row['count(id)'] не получится же

Спустя 46 минут, 35 секунд (13.06.2010 - 17:15) waldicom написал(а):
Цитата (Unlikely @ 13.06.2010 - 15:28)
И как получать этот результат? $row['count(id)'] не получится же

SELECT count(id) AS amount ...

$row['amount'] 

Спустя 17 часов, 2 минуты, 58 секунд (14.06.2010 - 10:18) tomash написал(а):
SELECT count(id) AS cnt FROM.....

$row['cnt']

Спустя 1 час, 11 минут, 8 секунд (14.06.2010 - 11:29) twin написал(а):
Цитата
Может быть можно как нибудь улучшить?

Можно.
1. Вот это слишком длинно:
    if($_GET['score'] == 1 or $_GET['score'] == 2 or $_GET['score'] == 3 or $_GET['score'] == 4 or $_GET['score'] == 5)

так проще
    if($_GET['score'] >= 1 && $_GET['score'] <= 5)


3. Тут хотябы собачку надо
    $id = @$_SESSION['post_id'];

Кстати говоря, $_GET['score'] тоже не факт, что есть.
2. Вот это вообще не нужно
$ip = getenv("REMOTE_ADDR");

хотя бы так:
    $ip = $_SERVER['REMOTE_ADDR'];


4. А вот и инициализация...
$score = $_GET['score'];

Только теперь не совсем уместная. Вобщем этот блок вот так выглядит корректнее.
    $score = @$_GET['score'];

if($score >= 1 && $score <= 5) {
$id = @$_SESSION['post_id'];
$ip = $_SERVER['REMOTE_ADDR'];


5. Дальше. Запрос
$ip_res = mysql_query("SELECT `id` FROM `posts_rating_ip` WHERE `post` = '$id' AND `ip` = '$ip'", $connection);
уязвим. Во первых, совсем не ясно, откуда в сессию берется 'post_id', а это неуютно. Осмелюсь предположить, что это всеж-таки целочисленное значение.
Во вторых - гораздо серьёзнее. IP попадает в запрос непроверенным. А сие - дыра.
И просто совет - не пиши запросы в одну строчку.

И так, сначала проверить - IP это или нет
Самый простой способ:
        $ip = long2ip(ip2long($_SERVER['REMOTE_ADDR']));


Кстати, конкатенация работает в полтора раза быстрее, чем в кавычках. Это так, к слову.

     $ip_res = mysql_query("SELECT `id` FROM `posts_rating_ip` 
WHERE `ip` = '
$ip'
AND `post` = "
. (int)$id,
$connection);


6. После редиректа скрипт желательно остановить. Для кого ему стараться...
        if(mysql_num_rows($ip_res) > 0) {
header("Location: http://" . $_SERVER['HTTP_REFERER']);
exit();
}


7. Ну а вот тут и понятно, что за коунт.
Вот так нужно делать:
    $ip_res = mysql_query("SELECT COUNT(*) AS `cnt` 
FROM `posts_rating_ip`
WHERE `ip` = '
$ip'
AND `post` = "
. (int)$id,
$connection);

if(mysql_result($ip_res, 0) > 0) {
header("Location: http://" . $_SERVER['HTTP_REFERER']);
exit();
}


Ну дальше FatCat показал. Да и повторяться не буду))

Еще стиль какой-то странный у тебя. Хотя это дело вкуса.

Спустя 5 часов, 3 минуты, 47 секунд (14.06.2010 - 16:33) Unlikely написал(а):
twin
Спасибо. Я просто ещё начинающий, всех тонкостей не знаю smile.gif
Вот так получилось:
<?php

if(isset($_GET['score'])) {
$score = $_GET['score'];

if($score >= 1 && $score <= 5) {
session_start();
$id = $_SESSION['post_id'];
$ip = long2ip(ip2long($_SERVER['REMOTE_ADDR']));

require('../config/config.php');
require('../config/db_connect.php');

$ip_res = mysql_query("SELECT COUNT(*) AS `cnt`
FROM `posts_rating_ip`
WHERE `ip` = '
$ip'
AND `post` = "
. (int)$id,
$connection);

if(mysql_result($ip_res, 0) > 0) {
header('Location: ' . $_SERVER['HTTP_REFERER']);
exit();
}

else {
$id_res = mysql_query("SELECT `post`, `total_score`, `votes`
FROM `posts_rating`
WHERE `post` = "
. (int)$id,
$connection);

if(mysql_num_rows($id_res) == 1) {
mysql_query("UPDATE `$DB_NAME`.`posts_rating`
SET `total_score` = `total_score`+
$score, `votes` = `votes`+1
WHERE `posts_rating`.`post` = '
$id'",
$connection);

mysql_query("INSERT INTO `$DB_NAME`.`posts_rating_ip` (`post`, `ip`)
VALUES ('
$id', '$ip')",
$connection);

header('Location: ' . $_SERVER['HTTP_REFERER']);
exit();
}

else {
mysql_query("INSERT INTO `$DB_NAME`.`posts_rating` (`post`, `total_score`, `votes`)
VALUES ('
$id', '$score', '1')",
$connection);

mysql_query("INSERT INTO `$DB_NAME`.`posts_rating_ip` (`post`, `ip`)
VALUES ('
$id', '$ip')",
$connection);

header('Location: ' . $_SERVER['HTTP_REFERER']);
exit();
}
}
}


else {
header('Location: ' . $_SERVER['HTTP_REFERER']);
exit();
}
}


?>


id берётся так:
    if(!$_GET) {
...
}

elseif(isset($_GET['posts'])) {
$single_post_result = mysql_query("SELECT `id`, `title`, `description`, `keywords`, `full_text`, $DATE_FORMAT
FROM `posts`
WHERE `id` = '"
.(int) $_GET['posts']."'
AND `visible` = '1'
LIMIT 0 , 1"
,
$connection);
if(mysql_num_rows($single_post_result) > 0) {
$_SESSION['post_id'] = $_GET['posts'];

}

else {
header("Location: $SITE_URL");
}

Спустя 23 минуты, 45 секунд (14.06.2010 - 16:56) twin написал(а):
Ну вполне прилично. Для полного счастья еще посмотри, что такое
ON DUPLICATE KEY UPDATE
и будет еще компактнее.

Спустя 24 минуты, 46 секунд (14.06.2010 - 17:21) Unlikely написал(а):
twin
Ну я так понимаю это как
printf("Оценка: %.1f<br />", $rating_row['total_score'] / $rating_row['votes']);

?

Спустя 1 час, 7 минут, 59 секунд (14.06.2010 - 18:29) twin написал(а):
Нет. Я имел ввиду оператор SQL

Спустя 8 минут, 58 секунд (14.06.2010 - 18:38) Unlikely написал(а):
twin
Да, я понял. Принцип имею в виду такой же.

Спустя 13 часов, 25 минут, 9 секунд (15.06.2010 - 08:03) Unlikely написал(а):
Блин, отправка оценки ссылками через get совсем не подходит. После какого нибудь бота в дб каша какая то.

Спустя 6 минут, 17 секунд (15.06.2010 - 08:10) twin написал(а):
Бот тоже человек. smile.gif Ему тоже проголосовать охота.

Вообще голосовалки лучше делать аяксом. Красиво и боты лезть не будут.

Спустя 1 час, 36 минут, 11 секунд (15.06.2010 - 09:46) Unlikely написал(а):
twin
Ага, и по всей видимости ему очень нравится голосовать smile.gif
А ajax не хочу, там много кода. Красота мне сильно ненужна smile.gif

Вот сделал пока такую форму
<form method="post" action=""><p>
<input
name="score" type="image" src="star.gif" value="1" />
<input
name="score" type="image" src="star.gif" value="2" />
<input
name="score" type="image" src="star.gif" value="3" />
<input
name="score" type="image" src="star.gif" value="4" />
<input
name="score" type="image" src="star.gif" value="5" />
</p></form>

Спустя 9 минут, 18 секунд (15.06.2010 - 09:55) twin написал(а):
Сие работать не станет.

Спустя 9 минут, 32 секунды (15.06.2010 - 10:05) Unlikely написал(а):
twin
Отправляется значение картинки на которую ткнул и координаты, куда ткнул.

Chrome, SeaMonkey нормально отправили. IE6 ничего не отправляет.

Спустя 13 минут, 31 секунда (15.06.2010 - 10:18) Unlikely написал(а):
Думаю надо js прикрутить что бы при онклике создавалось поле со значением инпута на который ткнул.

Спустя 24 минуты, 11 секунд (15.06.2010 - 10:42) twin написал(а):
Цитата
Думаю надо js прикрутить

Вооот. Еще чуть чуть - и аякс получится. Практически все готово для этого.

Спустя 5 минут, 54 секунды (15.06.2010 - 10:48) Unlikely написал(а):
twin
Не, ничего не получится. Не работает так в ие... По боку ему hidden sad.gif

Спустя 25 минут, 22 секунды (15.06.2010 - 11:13) twin написал(а):
Ну почему не получится... Берешь класс, kirik написал. Классный класс. smile.gif
И прилепляешь его. Красиво и надежно.

Если сложно - чуть позже покажу как.

Спустя 57 минут, 34 секунды (15.06.2010 - 12:11) Unlikely написал(а):
twin
Ну да, сложно.

Я так понял, нужно подключить класс. Потом в js описать куда и что отправляться будет.
А вот как прикрутить это к моей форме, не знаю. Нужно же посылать то или то...

Спустя 1 час, 21 минута, 9 секунд (15.06.2010 - 13:32) FatCat написал(а):
Цитата (Unlikely @ 15.06.2010 - 09:03)
Блин, отправка оценки ссылками через get совсем не подходит. После какого нибудь бота в дб каша какая то.

<img src="star.gif" border="0" style="cursor:hand" alt="1" onclick="javascript:location=location+'?score=1'">

rolleyes.gif

Спустя 1 час, 10 минут, 17 секунд (15.06.2010 - 14:42) twin написал(а):
Я вот чего подумал. Это псевдоаякс называется. Вот главный файл
<script>
var
trigg = true;
function Score(num)
{
if(trigg)
{
document.getElementById('ind').innerHTML = 'Голосование...';
document.getElementById('star'+num).src = 'star.php?score='+num+'&r='+Math.random();
setTimeout('Thanks()', 1000);
trigg = false;
}
}

function Thanks()
{
document.getElementById('ind').innerHTML = 'Спасибо за оценку';
}
</script>
<div
id="ind"></div>
<img
id="star1" src="star.php" border="0" style="cursor:pointer" alt="1" onclick="Score(1)" />
<img
id="star2" src="star.php" border="0" style="cursor:pointer" alt="2" onclick="Score(2)" />
<img
id="star3" src="star.php" border="0" style="cursor:pointer" alt="3" onclick="Score(3)" />
<img
id="star4" src="star.php" border="0" style="cursor:pointer" alt="4" onclick="Score(4)" />
<img
id="star5" src="star.php" border="0" style="cursor:pointer" alt="5" onclick="Score(5)" />


А вот файл star.php

<?php

header("Content-type: image/png");

if(isset($_GET['score'])) {

// ТУТ ВЕСЬ ТВОЙ КОД
//############################


echo base64_decode('iVBORw0KGgoAAAANSUhEUgAAABQAAAATCAYAAACQjC21AAAACXBIWXMAAA7DAAAOwwHHb6hkAAACgUlEQVR4nJ1U22oaURTd4yXipbHS1ihtFA1IyVMD3sDe3kuhfWr60n5Cv6D9gfYX+p7XPooUQVBfRA0KRbwQUOM1CWpETbx07cERR2mVHBjmnD17r7P2Wpsh2mJVKpUf7Xb73Ta5W61ardYHYGWbXMWmhHK5/E2tVuvG4/HjZrP5YVO+sCnh8vKyg9dup9Oh2WxWdzqd1jszvLi4+AJ2u9L5+vraUigUPt0ZUKlUfl2NjUaj7/+rUUmbcDhscLlcb7Va7SuVSnWIkEOhUDxAm7KCnZ0dM5j3BEEoTyaTs0ajUYEcEWgdPz4+Lgpw8DdAXiJRtXobg/EDVtTr9ej29pZMJhODyvKm0yldXV2RRqNJCMVi0Xhzc1MYDAYP9/b2SK/XywoYsN/vE1wmMCadTrcAYaNyuRzl83lyu92nPp/vmegyg6Igi7F4wolcxOBgLhYy2FxTcZ/JZEQQZg55KBAIpL1e7xHnCEtMtMlkMgsnnVIMDpPNZiPoJZ655WAwSN1ud9HB/v5+GtodSeeFyygagKkL7P5AC7JYLORwOAhyLIpZR47zwzlWq1UGJmO4xFQJgcfS+fz8nEqlktiu3W6ner2+yDUajc89Hk90uX7NWYzEaxafV7VapXQ6LTpoMBjEVllfNm7e1Ru8ZIBrg43ZeiHplc1mZYzwjYbDoWjG/OxdrV8DxIi4eVQSiQS1Wi0xhnZnMGjCe3ZZGiPo+3QjINpw8Uhg8kVDIPwpnD6ECffNZvMJwKfMnkHxNq/VrwYA1o3H4/cODg7OMBKfARZZ/h4KhYyYz5+Y2fe4XIELLX6/v7GKs1ipVApeVD/+M2G+IpHIo2g0+isWi8n+5H8BhMdL9Oq2DWsAAAAASUVORK5CYII=');

}else{

echo base64_decode('iVBORw0KGgoAAAANSUhEUgAAABQAAAATCAYAAACQjC21AAAACXBIWXMAAA7DAAAOwwHHb6hkAAACu0lEQVR4nK2U30tTYRjHv2fnbGdbm7pwljqV0jViGUIlFEI/QAgC7yIouo6EAu8UbyqC6A8IQQjCqxRv6qaLqJuGaZSaZJmmmHPLtmpOj2c7P9/eM93c2YGU6oXDec/L83zO932e7/sCuxjSy8rLZPZEy25idzVIxD1F3jc9+S+wbKSmg0w0EDJSRsjkgdad4m07BfD+ml7Y90AWVEix+O1/ApKF0+3gywuq5HXpvDiEk3+v0MZ1ly5pBH9UyeUniQfw+A8jhNCFFnDuEHQ1BEU8R9/mBK+nnXxomIC78o0uZWPpsbGV7zN4l4pj5dQAYgwZ9d9D5aGr8FbXAkyJHAlQs0BqAUpiGbqkgq/eD/gai4II9dUatK+TYF1sP4faM3eE18OtaobUljfwYKqPAmWUbbMDrIPG67TVadh5At3r34YpG9CWxhGb0BGfAuqOoT/QpV3LSSLRiy5hdPixkCAdRj7vocx6FzhfVS4RmV80iCpxeKBqPKKRHzmISjfA0v82trF9NTe1ToNV2COZDjuSkdkBVVYu5dcMgf6gDQyjb1ZABsYHATFVVFMH+toG0VnoY37ChKdlv0+5Qhg84px0Z/UUdsRHVWwbQVyl63VARQCwu3JyTDCTwoLSIbAIhyVaa9b4Xv80h8RHGQz1Q1UQWI0WBcsI1vXgi8kFpUAKC+VhazNLWHwlQ0gCznJaytRmfZ3eLTV2GBeGCWgxtiZJTbnJxjdER0WkihQZlpRpj2RxK1ZHc2m+BajEl5oN/82/yCId07bqAIE+K3moJFCYQucaLFea9eg5vKHk20X8nBOhZKEZhbdrCEpuHKTQG9Q9SaPb1JpgWSvQ0pTMU4x9fo5W2uXhfccDPc6zy6YaRbvgyvpwXc2g18ZiL6egovE+0hZh+ZF8iGfySGDHe884+/N30T17y6zyN1+AFvUCJVshAAAAAElFTkSuQmCC');

}


Попробуй. Можно сначала без своего кода, чтобы принцип понять.

PS. Курсор hand помоему только в осле работает...

Спустя 11 минут, 45 секунд (15.06.2010 - 14:54) Unlikely написал(а):
FatCat
Тоже вариант. Проверил, работает хорошо. Спасибо smile.gif
Ну да, {cursor: pointer;} надо.

twin
Не понял про псевдоаякс... То есть тот класс не надо уже подключать?


Разобрался.
А как картинки менять? smile.gif

Спустя 3 часа, 57 минут, 41 секунда (15.06.2010 - 18:52) twin написал(а):
Ну как вариант, вместо
echo base64_decode('iVBORw0KGgoA......

поставить
echo file_get_contents('goldstar.png');

ну и саму картинку соответственно нарисовать.

Спустя 13 минут (15.06.2010 - 19:05) Unlikely написал(а):
twin
Окей. Спасибо большое за помощь smile.gif

Всем спасибо smile.gif
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.