ShopForBux.com
Обучение

Современный функциональный букс - SFB (бесплатно)

96 30
user avatar
Пользователь
На сайте 15 лет
Сообщений : 91
Репутация : 0
8 лет назад #11069
Ага! Думали тут халява? А нет... Придётся поработать )))

Итак, как же создать современный функциональный букс? Назовём его SFB ))) прям как название нашего сайта. Данное пособие  рассчитано на людей имеющих хоть малейшие познания в php или просто умеющие пользоваться полученной информацией и желающих открыть \\\"свой\\\" букс, а не просто поиграться в админа. Сразу предупрежу некоторые моменты будем брать из уже готовых решений что находятся на просторах интернета чтобы сократить время разработки.

Системные требования: Виртуальный сервер, PHP 7.0.28 и выше, MYSQL 5.7.21 и выше, с полным доступом к настройкам сервера.  Это обязательно, так как мы создадим современный функциональный букс!

Предупреждаю любителей потролить - я не профи программист, так что приму ваши предложения, пожелания и критику.

Ссылка на демо: тут

Ссылка на загрузку скрипта: (в процессе)

Нужен дизайнер! Задача: нарисовать дизайн для букса. Кто занимается этим пишите в лс.
user avatar
Пользователь
На сайте 8 лет
Сообщений : 36
Репутация : 0
8 лет назад #11070
В чем прикол? Ты типо начинаешь делать новый букс?
user avatar
Пользователь
На сайте 15 лет
Сообщений : 91
Репутация : 0
8 лет назад #11071
Программу для создания скрипта я буду использовать NetBeans, но а вы можете использовать то чем возможно уже пользуетесь для программирования. Установить эту программу и узнать как пользоваться можно отсюда.

Создаём сервер на своём компьютере или покупаем виртуальный сервер. Создаём домен. Как? Ищем в яндексе... описывать этот процесс не буду так как мы же учимся, а уметь пользоваться поиском должен каждый, но если возникнут вопросы пишите будем разбирать.

Итак у нас готов сервер и установлена программа для программирования.

Начинаем...

Создадим структуру папок:

/config/  - настройки сайта, базы данных и т.д.

/engine/ - основные файла для работы скрипта

/css/  - стили, шрифты для html

/js/ - javascript файлы

/img/ - картинки

/pages/ - страницы сайта

Создаём первый наш файл index.php в корне сайта и в нём напишем:

<?php echo \\\'Привет! Это современный функциональный букс ).\\\';

Открываем наш сайт в браузере и любуемся тем что у нас получилось...

Создаём второй файл .htaccess так же в корне сайта открываем его и пишем следующее:

#указываем кодировку файлов по умолчанию UTF-8
AddDefaultCharset UTF-8
#запрещаем показ файлов каталога без индексного файла
Options -Indexes
#включаем расширение mod_rewrite
RewriteEngine On
#определяем первое условие при котором происходит перенаправление на файл index.php - если директория не существует
RewriteCond %{REQUEST_FILENAME} !-d
#определяем второе условие при котором происходит перенаправление на файл index.php - если файл не существует
RewriteCond %{REQUEST_FILENAME} !-f
#файл на который перенаправляем при вышеперечисленных условиях
RewriteRule ^(.*)$ /index.php [L]

В этом файле мы прописали правила обработки запросов к нашему сайту. Все запросы если директория не существует или файл не найден будет обрабатывать наш главный файл index.php. Для чего это пока опустим. Узнаете позже когда начнём создавать страницы нашего сайта...
user avatar
Пользователь
На сайте 14 лет
Сообщений : 42
Репутация : 0
8 лет назад #11072
На сколько же Вас хватит?)

Я полтора дня без перерыва код алекса переделываю, без БД и ничего не документируя... А тут... Хорошо если за год управитесь)))
user avatar
Пользователь
На сайте 15 лет
Сообщений : 91
Репутация : 0
8 лет назад #11073
Шаблон сайта.

В корне создадим файл template.php. Шаблон я сделаю в генераторе на сайте тут чтобы не тратить время.  Создаём шаблон на сайте, скачиваем архив и распаковываем. У нас получились два файла index.html и style.css. Открываем файл index.html в редакторе и копируем всё в файл template.php. Файл style.css загружаем на сервер в папку /css/.

В файле template.php правим путь к файлу стилей:

href=\\\"/css/style.css\\\" rel=\\\"stylesheet\\\">

Далее открываем наш index.php удаляем ранее написанное и пишем:

<?php

include(\\\'template.php\\\');

Открываем наш сайт в браузере и любуемся полученным результатом )
user avatar
Пользователь
На сайте 14 лет
Сообщений : 343
Репутация : 0
8 лет назад #11044
Вернул старый редактор, который поддерживает кучу возможностей для оформления сообщения.

Вот тут тег \\\"\\\", если надо будет:

\\\"\\\"
user avatar
Пользователь
На сайте 14 лет
Сообщений : 287
Репутация : 0
8 лет назад #11045
Не советовал бы слушать человека, который джаваскрипту говорит джава.
user avatar
Пользователь
На сайте 15 лет
Сообщений : 91
Репутация : 0
8 лет назад #11046
Главное меню. Первые страницы.

Меню для сайта выбираем здесь ну или создаём своё... как? ищем в поисковиках...

Открываем наш файл шаблона template.php и заменяем содержимое тега
class=\\\"menu-main\\\">
  href=\\\"/\\\" class=\\\"current\\\">Главная
  href=\\\"/login\\\">Авторизация
  href=\\\"/register\\\">Регистрация


Добавляем стили в файл /css/style.css

/* Главное меню */
.menu-main {
list-style: none;
margin: 0px 0 5px;
padding: 5px 0 5px;
text-align: center;
}
.menu-main li {display: inline-block;}

.menu-main li:after {
content: \\\"|\\\";
color: #606060;
display: inline-block;
vertical-align:top;
}
.menu-main li:last-child:after {content: none;}

.menu-main a {
text-decoration: none;
letter-spacing: 2px;
position: relative;
padding-bottom: 0px;
margin: 0 34px 0 30px;
font-size: 12px;
text-transform: uppercase;
display: inline-block;
transition: color .2s;
}

.menu-main a, .menu-main a:visited {color: #9d999d;}

.menu-main a.current, .menu-main a:hover{color: #feb386;}

.menu-main a:before, .menu-main a:after {
content: \\\"\\\";
position: absolute;
height: 4px;
top: auto;
right: 50%;
bottom: -5px;
left: 50%;
background: #feb386;
transition: .8s;
}

.menu-main a:hover:before, .menu-main .current:before {left: 0;}

.menu-main a:hover:after, .menu-main .current:after {right: 0;}

@media (max-width: 550px) {
.menu-main {padding-top: 0;}
.menu-main li {display: block;}
.menu-main li:after {content: none;}
.menu-main a {padding: 5px 0 20px; margin: 0 0px;}
}

В папке /pages/ создаём  файлы register.php - здесь у нас будет регистрация пользователей, login.php - авторизация, index.php - главная страница сайта и 404.php - страница для показа посетителям если страницы не существует.

Содержимое файла /pages/register.php

<?php

echo \\\'регистрация\\\';

Содержимое файла /pages/login.php


<?php

echo \\\'регистрация\\\';

Содержимое файла /pages/index.php

<?php

echo \\\'главная страница\\\';

Содержимое файла /pages/404.php

<?php

echo \\\'страница не найдена\\\';

Далее нам нужно сделать наше меню рабочим, чтобы при клике по меню у нас открывались наши страницы. В меню у нас прописаны пути / - главная страница, /register - регистрация, /login - авторизация. Так как у нас таких директорий кроме главной не существует, то эти запросы будет обрабатывать наш файл index.php.

Открываем файл index.php и меняем содержимое:

<?php
//парсим строку запроса браузера
$url = parse_url($_SERVER[\\\'REQUEST_URI\\\']);
//получаем путь, удаляем крайние слеши, получаем страницу которую запрашивает пользователь
$page = trim($url[\\\'path\\\'], \\\'/\\\');
//если пустая строка запроса или запрашивается index.php показываем пользователю главную страницу
if ($page == \\\'\\\' || $page == \\\'index.php\\\') { $page = \\\'index\\\'; }
//включаем буферизацию вывода т.е. весь результат выполнения программы что будет ниже будет помещён в буфер
ob_start();
//проверяем существует ли у нас запрашиваемая пользователем страница в папке /pages/
if (file_exists(\\\'pages/\\\'.$page.\\\'.php\\\'))
{
   //подключаем запрашиваемую страницу
   include(\\\'pages/\\\'.$page.\\\'.php\\\');
}
else
{
   //если не существует выдаём заголовок браузеру 404
   header($_SERVER[\\\'SERVER_PROTOCOL\\\'] . \\\' 404 Not Found\\\', true);
   //подключаем нашу страницу ошибки
   include(\\\'pages/404.php\\\');
}
//в переменную $content помещаем наш буфер
$content = ob_get_clean();
//подключаем шаблон сайта
include(\\\'template.php\\\');

Открываем файл template.php и заменяем содержимое тега 

<?php echo $content; ?>

Переменная $content у нас была объявлена в файле index.php и содержит данные запрашиваемой страницы.

Заходим на наш сайт в браузере и любуемся тем что у нас получилось... При клике по страницам у нас показывает то что нам нужно. Если ввести в строку запроса не существующую страницу у нас покажет нашу страницу 404.

Ну вроде всё хорошо, но мы ведь делаем современный функциональный букс, поэтому сделаем загрузку наших страниц с помощью ajax запросов. Об этом узнаем на следующем уроке.

Продолжение следует...
user avatar
Пользователь
На сайте 14 лет
Сообщений : 42
Репутация : 0
8 лет назад #11047
Правильней будет
вместо
if ($page == \\\'\\\' || $page == \\\'index.php\\\') { $page = \\\'index\\\'; }
вот это написать
if (empty($page) OR $page == \\\'index.php\\\')
$page = \\\'index\\\';
user avatar
Пользователь
На сайте 14 лет
Сообщений : 42
Репутация : 0
8 лет назад #11048
include(\\\'pages/\\\'.$page.\\\'.php\\\');

не верно написано. точнее уязвимость есть. Если не ошибаюсь, то вместо page можно передать:

index.php\\\');eval(base64_decode($_GET[\\\"r\\\"]));

И у меня будет возможность исполнять любой код. Если так делаете, то проверяйте состоит ли ваша строка только из латинских символов
user avatar
Пользователь
На сайте 13 лет
Сообщений : 1859
Репутация : 0
8 лет назад #11049
А мне если честно нравится тема. Я за свободную и честную конкуренцию. И я только за новых участников, это повышает качество продукта на рынке и снижает его стоимость, увеличивая качество сервиса.
user avatar
Пользователь
На сайте 14 лет
Сообщений : 42
Репутация : 0
8 лет назад #11050

Цитата: ZKolyaNZ от 04.04.2018, 00:30

https://php.ru/manual/function.file-exists.html

лучше подключить проверку перед загрузкой

Цитата: Scrin от 03.04.2018, 23:48

index.php\\\');eval(base64_decode($_GET[\\\"r\\\"]));

А ты точно уверен, что оно работает ?)
Если мне память не отшибает, тут используется роутинг PHP, то есть перекодирование некоторых символов, они и дадут ошибку в итоге...

Я совсем не уверен) Но подключение такое - это не есть хорошо
user avatar
Пользователь
На сайте 15 лет
Сообщений : 91
Репутация : 0
8 лет назад #11051

Цитата: Scrin от 03.04.2018, 23:48

include(\\\'pages/\\\'.$page.\\\'.php\\\');

не верно написано. точнее уязвимость есть. Если не ошибаюсь, то вместо page можно передать:

index.php\\\');eval(base64_decode($_GET[\\\"r\\\"]));

И у меня будет возможность исполнять любой код. Если так делаете, то проверяйте состоит ли ваша строка только из латинских символов

Хм.. Демо сайта в первом посте... Покажите как это будет выглядеть...
user avatar
Пользователь
На сайте 15 лет
Сообщений : 91
Репутация : 0
8 лет назад #11052

Цитата: ZKolyaNZ от 04.04.2018, 00:30

https://php.ru/manual/function.file-exists.html

лучше подключить проверку перед загрузкой

Цитата: Scrin от 03.04.2018, 23:48

index.php\\\');eval(base64_decode($_GET[\\\"r\\\"]));

А ты точно уверен, что оно работает ?)
Если мне память не отшибает, тут используется роутинг PHP, то есть перекодирование некоторых символов, они и дадут ошибку в итоге...

Проверка эта есть...
user avatar
Пользователь
На сайте 15 лет
Сообщений : 91
Репутация : 0
8 лет назад #11053
Продолжаем...

Оказывается наши страницы можно посмотреть если ввести прямой путь к файлам в браузере... Избавляемся от этого.

В файл index.php в самом начале добавим:

//объявляем константу содержащую серверный путь к файлам скрипта, будем добавлять проверку существования этой константы в наших файлах от прямого доступа из браузера
define(\\\'SFB_DIR\\\', $_SERVER[\\\'DOCUMENT_ROOT\\\']);

Во всех остальных файлах *****.php добавим проверку также в самом начале:

if (!defined(\\\'SFB_DIR\\\')) { exit(header($_SERVER[\\\'SERVER_PROTOCOL\\\'] . \\\' 404 Not Found\\\', true)); }

Если константа не объявлена то прекращаем работу скрипта и выдаём заголовок 404 браузеру.

Теперь при попытке ввести в строку браузера пути к нашим файлам браузер ничего не покажет.

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

Начинаем делать переход по страницам и все действия пользователя на сайте через ajax запросы, т.е. без перегрузки всей страницы.

Скачиваем последнюю версию jquery здесь - для удобной работы с javascript

Скачиваем последнюю версию jqueryUI здесь - сборка плагинов и виджетов для оформления страницы

Скачиваем плагин для jquery BlockUI здесь - для блокировки страницы во время ajax запроса

Скачиваем плагин для jquery Toast здесь - для всплывающих уведомлений

Распаковываем архивы если необходимо и загружаем файлы js в папку /js/ а файлы css в папку /css/.

Открываем файл шаблона template.php и добавляем в тег

href=\\\"/css/jquery-ui.min.css\\\" rel=\\\"stylesheet\\\">
href=\\\"/css/jquery.toast.min.css\\\" rel=\\\"stylesheet\\\">
\\\"/js/jquery-3.3.1.min.js\\\">
\\\"/js/jquery-ui.min.js\\\">
\\\"/js/jquery.toast.min.js\\\">

\\\"/js/jquery.blockUI.js\\\">

В папке /js/ создаём файл jquery.sfb.js - это будет главный наш файл с функциями.

Открываем файл шаблона template.php и добавляем в тег

\\\"/js/jquery.sfb.js\\\">

Продолжение следует...
user avatar
Пользователь
На сайте 14 лет
Сообщений : 42
Репутация : 0
8 лет назад #11054

Цитата: serega393 от 04.04.2018, 12:43


Цитата: Scrin от 03.04.2018, 23:48

 

Хм.. Демо сайта в первом посте... Покажите как это будет выглядеть...

Я программист и я знаю, как защитить сайт, а не как взломать его
Могу дать статью (аж 2008 года), где об этом много написано
http://xaker.name/threads/13504/
Погуглив можно найти свежий материал. Но суть в том, что это элементарная вещь, о которой говорили очень давно
user avatar
Пользователь
На сайте 15 лет
Сообщений : 91
Репутация : 0
8 лет назад #11055
Посмотрите внимательно логику  моего приложения... И почитайте внимательно ту статью которую вы предоставили в качестве примера.
user avatar
Пользователь
На сайте 14 лет
Сообщений : 42
Репутация : 0
8 лет назад #11056

Цитата: serega393 от 04.04.2018, 17:19

Посмотрите внимательно логику  моего приложения... И почитайте внимательно ту статью которую вы предоставили в качестве примера.

Окей
Подскажите версию php, тогда возможно получится всё практическим путём доказать
user avatar
Пользователь
На сайте 15 лет
Сообщений : 91
Репутация : 0
8 лет назад #11057
Продолжаем...

Создадим скрипт обработки клика по ссылкам и по кнопкам отправки форм. Открываем файл /js/jquery.sfb.js и добавляем следующий код:

//функция обработки всех запросов со страницы
//elem = элемент страницы
function sfbRequest(elem)
{
//получаем путь запроса из атрибута href элемента и если атрибут отсутствует путь берем из строки запроса браузера
if ($(elem).is(\\\"[href]\\\")) { path = $(elem).attr(\\\"href\\\"); } else { path = location; }

//проверяем наличие специального атрибута элемента и получаем данные
var atr = $(elem).data(\\\"sfb\\\") ? $(elem).data(\\\"sfb\\\") : \\\"\\\";
//парсим путь и получем путь и get параметры если присутствуют
var url = parseUrl(path);
//получаем данные формы если она существует
var post = $(\\\"form[name=\\\"+$(elem).attr(\\\"id\\\")+\\\"]\\\").serialize();
//делаем запрос
$.ajax({type: \\\"POST\\\", dataType: \\\"json\\\", url: \\\"/index.php\\\", data: {page:url[\\\"path\\\"], get:url[\\\"get\\\"], post:post},
//функция выпоняемая перед выполнением запроса
beforeSend: function () { $.blockUI({message: \\\"Подождите идёт загрузка...\\\", overlayCSS: {backgroundColor: \\\"#000\\\", opacity: 0.5}}); },
//функция выполняемая после удачного выполнения запроса
success: function (result)
{
//если получены данные в результате запроса
if (result)
{
//выполняем javascript полученный в результате запроса (если javascript при выполнении ловит ошибку выводим сообщение)
if (result[\\\"data\\\"]) { try { eval(result[\\\"data\\\"]); } catch (err) { showMessage(\\\"Ошибка\\\", \\\"Что то пошло не так... Попробуйте обновить страницу...\\\", 10000, \\\"error\\\", false, \\\"top-left\\\"); } }
//если существует атрибут элемента page
if (atr.page)
{
//пишем страницу в историю браузера
history.pushState(\\\"\\\", \\\"\\\", path);
   //меняем адресную строку браузера
history.replaceState(\\\"\\\", \\\"\\\", path);
}
}
},
//функция выполняемая в случае неудачного завершения запроса
error: function () { $.unblockUI(); showMessage(\\\"Ошибка\\\", \\\"Что то пошло не так... Попробуйте обновить страницу...\\\", 10000, \\\"error\\\", false, \\\"top-left\\\"); },
//функция выполняемая после завершения запроса
complete: function () { $.unblockUI(); }});

return false;
}

 

//вешаем обработчик \\\"клик\\\" на все ссылки имеющие класс sfb-link
$(document).on(\\\"click\\\", \\\".sfb-link\\\", function() { sfbRequest($(this)); return false; });

//парсинг url в результате которого получаем путь и get параметры
function parseUrl(path) { var url = []; var rx = new RegExp(\\\"^(([^:/\\\\\\\\?#]+):)?(//(([^:/\\\\\\\\?#]*)(?::([^/\\\\\\\\?#]*))?))?([^\\\\\\\\?#]*)(\\\\\\\\?([^#]*))?(#(.*))?$\\\"); var parts = rx.exec(href); url[\\\"path\\\"] = parts[7]; url[\\\"get\\\"] = parts[9]; return url; }

//сообщение (заголовок, текст, скрыть после времени, иконка, заменять предыдущее сообщение, позиция в окне браузера)
function showMessage(title, text, hide, icon, stack, position)
{
$.toast({ heading: title, text: text, hideAfter: hide, icon: icon, stack: stack, position: position });
}

Открываем файл template.php.

Добавляем к нашим ссылкам в главном меню class=\\\"sfb-link\\\" и атрибут data-sfb=\\\'{\\\"page\\\":1}\\\'. Атрибутом data-sfb мы обозначили что это ссылка на страницу и надо поменять адресную строку браузера. При клике у нас срабатывает блокировка страницы с помощью плагина jquery blockUI пока запрос не завершится. Это сделано для того чтобы пользователь дождался ответа прежде чем нажать что нибудь другое. Код имеет комментарии если что не понятно пишите будем разбирать.

Теперь нужно нам обработать  ajax запросы в нашем файле index.php открываем его и добавим следующий код

//если ajax запрос
if (isset($_SERVER[\\\'HTTP_X_REQUESTED_WITH\\\']))
{
//если реферер не передан завершаем работу
if (!isset($_SERVER[\\\'HTTP_REFERER\\\'])) { exit(header($_SERVER[\\\'SERVER_PROTOCOL\\\'] . \\\' 404 Not Found\\\', true)); }
//если реферер не соответствует нашему домену завершаем работу
if (!mb_strpos($_SERVER[\\\'HTTP_REFERER\\\'], $_SERVER[\\\'HTTP_HOST\\\'])) { exit(header($_SERVER[\\\'SERVER_PROTOCOL\\\'] . \\\' 404 Not Found\\\', true)); }
//запрашиваемая страница
$page = isset($_POST[\\\'page\\\']) ? $_POST[\\\'page\\\'] : \\\'\\\';
//парсим post данные в массив
if (isset($_POST[\\\'get\\\'])) { parse_str($_POST[\\\'get\\\'], $get); }
//парсим get данные в массив
if (isset($_POST[\\\'get\\\'])) { parse_str($_POST[\\\'post\\\'], $post); }
//если пустая строка запроса или запрашивается index.php показываем пользователю главную страницу
if ($page == \\\'\\\' || $page == \\\'/\\\') { $page = \\\'index\\\'; }
//удаляем крайние слеши, получаем страницу которую запрашивает пользователь
$page = trim($page, \\\'/\\\');
//проверяем существует ли у нас запрашиваемая пользователем страница в папке /pages/
if (file_exists(SFB_DIR.\\\'/pages/\\\'.$page.\\\'.php\\\'))
{
//включаем буферизацию вывода т.е. весь результат выполнения программы что будет ниже будет помещён в буфер
ob_start();
//подключаем запрашиваемую страницу
include(SFB_DIR.\\\'/pages/\\\'.$page.\\\'.php\\\');
//в переменную $content помещаем на буфер
$content = ob_get_clean();
//завершаем работу и отдаём данные в json формате (javascript который добавляет в элемент c ID sfb-content полученный результат выполнения скрипта)
exit(json_encode([\\\'data\\\' => \\\'$(\\\"#sfb-content\\\").html(\\\"\\\'.$content.\\\'\\\");\\\']));
}
else
{
exit(json_encode([\\\'data\\\' => \\\'window.location.replace(\\\"/404\\\");\\\']));
}
}
else
{
//включаем буферизацию вывода т.е. весь результат выполнения программы что будет ниже будет помещён в буфер
ob_start();
//проверяем существует ли у нас запрашиваемая пользователем страница в папке /pages/
if (file_exists(SFB_DIR.\\\'/pages/\\\'.$page.\\\'.php\\\'))
{
//подключаем запрашиваемую страницу
include(SFB_DIR.\\\'/pages/\\\'.$page.\\\'.php\\\');
}
else
{
//если не существует выдаём заголовок браузеру 404
header($_SERVER[\\\'SERVER_PROTOCOL\\\'] . \\\' 404 Not Found\\\', true);
//подключаем нашу страницу ошибки
include(SFB_DIR.\\\'/pages/404.php\\\');
}
//в переменную $content помещаем на буфер
$content = ob_get_clean();
//подключаем шаблон сайта
include(SFB_DIR.\\\'/template.php\\\');
}

заменив этот

//включаем буферизацию вывода т.е. весь результат выполнения программы что будет ниже будет помещён в буфер
ob_start();
//проверяем существует ли у нас запрашиваемая пользователем страница в папке /pages/
if (file_exists(SFB_DIR.\\\'/pages/\\\'.$page.\\\'.php\\\'))
{
//подключаем запрашиваемую страницу
include(SFB_DIR.\\\'/pages/\\\'.$page.\\\'.php\\\');
}
else
{
//если не существует выдаём заголовок браузеру 404
header($_SERVER[\\\'SERVER_PROTOCOL\\\'] . \\\' 404 Not Found\\\', true);
//подключаем нашу страницу ошибки
include(SFB_DIR.\\\'/pages/404.php\\\');
}
//в переменную $content помещаем на буфер
$content = ob_get_clean();
//подключаем шаблон сайта
include(SFB_DIR.\\\'/template.php\\\');

Добавляем в файле template.php к элементу id=\\\"sfb-content\\\".

Открываем в браузере и любуемся нашим сайтом )))

 
user avatar
Пользователь
На сайте 13 лет
Сообщений : 1859
Репутация : 0
8 лет назад #11068
Прикинем в моем скрипте 293 файла, в 90% файлов от 1000 строчек кода, в нескольких файлах от 5000 строчек кода, в одном файле двигателя свыше 15000 строчек програмного кода.

В среднем множим 300 * 1500 = 450 000 строчек кода, к этому еще планировка и концепкия дизайна, его отрисовка, и реализация. Вы в день примерно публикуете в среднем до 500 строчек кода. И того 450 000 / 500 = 900... тоесть с такой скоростью вы будете постить тут полноценый скрипт 900 дней, почти три года. Ну что же я желаю Вам удачи)
Автор темы
author avatar
serega393
Пользователь
На сайте 15 лет
Сообщений 91
Тем 2
Репутация 0
Похожие темы
Теги темы
Автор не добавил тегов для этой темы
Ответить
Написал(а):