Доброго времени суток дорогой читатель Блога RS! Сегодня, как я и обещал, мы напишем установщик для нашей CMS. В следующем же посте я Вам предоставлю скрипт блога и инструкцию по установки на локальный сервер. Хочу отметить один момент, я опять, при разработки кода, забыл ввести редактор мета тегов. Каждый раз про них забываю, а ведь такая важная вещь! Я сегодня собирался исправить эту свою оплошность, но после того как увидел сколько придется внести исправлений, решил внедрять новые строчки кода, по мере улучшения кода нашего блога. Сегодня мы сделаем первые шаги к этому, изменим структуру таблиц в базе данных, то есть добавим колонки где будут храниться наши мета теги, плюс к этому мы выведем мета теги на главной и контактной странице.
Что из себя представляет установщик? Эта некие формы, при заполнение которых мы изменим нашу информацию в БД и в определенных файлах нашей CMS. Если быть точнее то мы, сначала, с помощью введенной в форму информации соберем файл подключения к базе данных, после произведем подключение к ней, и создадим там нужные нам таблицы, плюс напишем стартовый пост на блоге, и создадим аккаунт администратора. На этом работа установщика закончится
По сути все это пустая трата времени, ибо намного проще записать в базу данных все в ручную, но вот что-то уж хочется как то до автоматизма довести эту процедуру
Первое, что нам понадобится, это собрать файл подключения к БД. В php это будет выглядеть примерно так: Откроем файл, запишем туда строки, и закроем этот файл. Реализовывать будем с помощью функции fopen. Почитайте про нее на php.su, лучше чем там я не поясню
После нам необходимо создать таблицы в базе данных. Реализуется это с помощью SQL запроса CREATE TABLE. Далее мы запишем в созданные таблицы стартовый пост, и создадим аккаунт администратора, разумеется реализуется это с помощью SQL запроса INSERT INTO. Давайте все по порядку
Установщик нам предложит два раза заполнить две разных формы. Первая форма будет содержать информацию для подключения к БД. То есть нам необходимо узнать у пользователя имя базы данных, сервер, доменное имя, логин от базы и пароль. Приступим к реализации.
Создадим html код страницы в новом файле который я назвал installer.php и поместил в корень нашего блога:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<!-- ГОЛОВА -->
<head>
<title>Установка RS-BLOG</title>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
<!-- СТИЛИ -->
<link rel="stylesheet" href="style.css" type="text/css">
<!-- СТИЛИ -->
</head>
<!-- ГОЛОВА -->
<!-- ТЕЛО -->
<body>
<!-- ВЕРХНЯЯ БЕЛАЯ ПОЛОСКА -->
<div class="top_bg"><img class="logo" src="img/logo.png" border="0px"></div>
<!-- ВЕРХНЯЯ БЕЛАЯ ПОЛОСКА -->
<!-- ТАБЛИЦА -->
<table class="table" width="780px" height="700px" cellpadding="0" cellspacing="0" border="0">
<tr>
<td class="left" width="25px"></td>
<td class="center" valign="top">
<table width="730px" height="500px" cellpadding="0" cellspacing="0" border="0" align="center">
<tr>
<!--ЛЕВЫЙ БЛОК-->
<td valign="top">
<p align="center" style="font-size:17px;">Добро пожаловать на установку CMS RS-BLOG!</p>
<!-- ШАГ 1 -->
<? if($step == 1){ ?>
html отрывок первого шага
<? } ?>
<!-- ШАГ 1 -->
<!-- ШАГ 2 -->
<? if($step == 2){ ?>
html отрывок второго шага
<? } ?>
<!-- ШАГ 2 -->
<!-- ШАГ 3 -->
<? if($step == 3){ ?>
html отрывок третьего шага
<? } ?>
<!-- ШАГ 3 -->
</td>
<!--ЛЕВЫЙ БЛОК-->
</tr>
</table>
</td>
<td class="right" width="25px"></td>
</tr>
<tr>
<td class="left_bottom" width="25px" height="25px"></td>
<td class="bottom"></td>
<td class="right_bottom" width="25px" height="25px"></td>
</tr>
</table>
<!-- ТАБЛИЦА -->
<!-- УЗОР В ПРАВОМ НИЖНЕМ УГЛУ -->
<div class="img_right_bottom"></div>
<!-- УЗОР В ПРАВОМ НИЖНЕМ УГЛУ -->
</body>
<!-- ТЕЛО -->
</html>
Можете не вникать в содержание html кода. Он скопирован из главного пользовательского шаблона нашего блога. Обратите внимание на вот эти строчки
<!-- ШАГ 1 -->
<? if($step == 1){ ?>
html отрывок первого шага
<? } ?>
<!-- ШАГ 1 -->
<!-- ШАГ 2 -->
<? if($step == 2){ ?>
html отрывок второго шага
<? } ?>
<!-- ШАГ 2 -->
<!-- ШАГ 3 -->
<? if($step == 3){ ?>
html отрывок третьего шага
<? } ?>
<!-- ШАГ 3 -->
Именно с ними нам придется работать. Обратите внимание на условие if($step == 1){} Это условие, а именно эта переменная будет отвечать за вывод шагов. Объявляться переменная будет с помощью GET запроса
Давайте создадим форму для первого шага
<p style="margin-top:120px;" align="center">Шаг 1 - Подключение к БД</p>
<form action="installer.php" method="post" name="conf_DB">
<table width="310px" cellpadding="5" cellspacing="0" border="0" align="center">
<tr>
<td width="160px">Введите имя БД</td>
<td width="150px"><input class="input" style="width:150px;" type="text" name="nameDB" /></td>
</tr>
<tr>
<td width="160px">Введите имя сервера</td>
<td width="150px"><input class="input" style="width:150px;" type="text" name="nameSERVER" value="localhost" /></td>
</tr>
<tr>
<td width="160px">Доменное имя</td>
<td width="150px"><input class="input" style="width:150px;" type="text" name="server_root" value="http://имя.ru/" /></td>
</tr>
<tr>
<td width="160px">Логин БД</td>
<td width="150px"><input class="input" style="width:150px;" type="text" name="nameUSER" /></td>
</tr>
<tr>
<td width="160px">Пароль БД</td>
<td width="150px"><input class="input" style="width:150px;" type="password" name="passUSER" /></td>
</tr>
<tr>
<td colspan="2" align="center"><input class="sub" type="submit" value="Далее" /></td>
</tr>
</table>
</form>
Обычная форма, как всегда прошу обратить внимание на атрибут action. Мы ссылаемся на тот же файл где расположена наша форма. ( Прошу прощения за, как Вам кажется лишние пробелы, от края в коде. Эти пробелы помогут Вам при копирование визуально определить где какой кусочек кода находится )
Я надеюсь Вы догадались, что эту форму необходимо вставить вместо вот этой строчки
html отрывок первого шага
Теперь объявим в самом вверху переменную $step
<?
if(isset($_GET['step']))$step = $_GET['step']; else $step = 1;
?>
Сейчас, если запустить наш файл, то мы будем лицезреть вот такой вид:
Первым делом определим, был ли послан запрос из формы ( Дальнейший код пишется в самом верху после определение переменной $step )
if(isset($_POST['nameDB']))$nameDB = $_POST['nameDB'];
if(isset($_POST['nameSERVER']))$nameSERVER = $_POST['nameSERVER'];
if(isset($_POST['nameUSER']))$nameUSER = $_POST['nameUSER'];
if(isset($_POST['passUSER']))$passUSER = $_POST['passUSER'];
if(isset($_POST['server_root']))$server_root = $_POST['server_root'];
После создается условие с помощью которого мы проверяем существуют ли эти переменные
if(isset($nameDB) & isset($nameSERVER) & isset($nameUSER) & isset($passUSER) & isset($server_root))
{
Код обработчика
}
Вот тут идет самое интересное, мы в переменную помещаем код, который запишем в файл db.php
$dbNEW = "<?php
\$nameDB = \"".$nameDB."\";//Название БД
\$nameSERVER = \"".$nameSERVER."\";//Сервер
\$nameUSER = \"".$nameUSER."\";//Имя пользователя БД
\$passUSER = \"".$passUSER."\";//Пароль пользователя БД
mysql_select_db(\$nameDB, mysql_connect(\$nameSERVER,\$nameUSER,\$passUSER));
if(isset(\$_GET[\"server_root\"])){\$server_root = \$_GET[\"server_root\"];unset(\$server_root);}
if(isset(\$_POST[\"server_root\"])){\$server_root = \$_POST[\"server_root\"];unset(\$server_root);}
\$server_root = \"".$server_root."\";
?>";
ВНИМАНИЕ: Тут необходимо внимательно просмотреть код. Вы должны понять, что в переменной $dbNEW содержится не какой то скрипт, который будет запускаться прям в файле установщика ( installer.php ), а по сути обычный текст, который мы поместим в файл подключение к БД ( db.php ), и именно там ( в db.php ) этот текст будет работать не как текст, а как скрипт. Надеюсь я Вас не запутал
Далее пишем следующий кусочек кода
$DBfileUser = fopen("moduls/db.php", "w+");
fwrite($DBfileUser,$dbNEW);
fclose($DBfileUser);
$DBfileAdmin = fopen("admin/moduls/db.php", "w+");
fwrite($DBfileAdmin,$dbNEW);
fclose($DBfileAdmin);
Именно эти строчки открывают файл, и записывают туда содержание переменной $dbNEW! Как Вы могли заметить, мы редактируем два файла. Одни находится в пользовательской части блога, другой находится в папке admin. При заполнение формы мы получим примерно вот такой результат:
Далее мы подключаемся в базе данных
//ПОДКЛЮЧЕНИЕ К БАЗЕ ДАННЫХ (БД)
include("moduls/db.php");
//ПОДКЛЮЧЕНИЕ К БАЗЕ ДАННЫХ (БД)
И начинаем создавать SQL запросы на создание таблиц в БД. Код довольно длинный, но по сути однообразный
$blog = "CREATE TABLE IF NOT EXISTS blog (
id int(10) NOT NULL AUTO_INCREMENT,
text text NOT NULL,
title varchar(255) NOT NULL,
meta_d varchar(255) NOT NULL,
meta_k varchar(255) NOT NULL,
author varchar(255) NOT NULL,
date_b varchar(255) NOT NULL,
cat int(10) NOT NULL,
PRIMARY KEY (id)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=1 ;";
$comm = "CREATE TABLE IF NOT EXISTS comm (
id int(10) NOT NULL AUTO_INCREMENT,
author varchar(255) NOT NULL,
text text NOT NULL,
date_comm varchar(255) NOT NULL,
blog int(10) NOT NULL,
PRIMARY KEY (id)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=1 ;";
$menu = "CREATE TABLE IF NOT EXISTS menu (
id int(10) NOT NULL AUTO_INCREMENT,
name varchar(255) NOT NULL,
href varchar(255) NOT NULL,
position int(3) NOT NULL,
PRIMARY KEY (id)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=1 ;";
$mess_admin = "CREATE TABLE IF NOT EXISTS mess_admin (
id int(10) NOT NULL AUTO_INCREMENT,
login varchar(255) NOT NULL,
them varchar(255) NOT NULL,
date_g varchar(255) NOT NULL,
email varchar(255) NOT NULL,
text text NOT NULL,
PRIMARY KEY (id)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=1 ;";
$user = "CREATE TABLE IF NOT EXISTS user (
id int(10) NOT NULL AUTO_INCREMENT,
login varchar(255) NOT NULL,
pass varchar(255) NOT NULL,
PRIMARY KEY (id)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=1 ;";
$mainPage = "CREATE TABLE IF NOT EXISTS page (
id int( 1 ) NOT NULL AUTO_INCREMENT ,
title varchar(255) NOT NULL ,
meta_d text NOT NULL ,
meta_k text NOT NULL ,
PRIMARY KEY (id)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=1 ;";
mysql_query($blog);
mysql_query($comm);
mysql_query($menu);
mysql_query($mess_admin);
mysql_query($user);
mysql_query($mainPage);
Давайте я поясню, откуда беруться эти запросы. Точнее откуда я их взял. При создание таблиц в phpMyAdmin прописывается sql запрос.
На последнем изображение виден sql запрос. Я по сути просто его скопировал в php код.
Так вот, мы создаем запросы в отдельных переменных, и при помощи mysql_query обрабатываем эти запросы, а именно создаем шесть таблиц в БД.
Обратите внимание, что таблица blog отличается от той таблицы которую мы создавали в посте "Пишем модуль Мини новости для нашей CMS" отличие лишь в том что мы добавляем еще две колонки, под мета теги.
Сейчас в рабочем варианте блога у нас только пять таблиц. А в установщики создаем шесть, почему? Потому, что в таблице page у нас будет храниться информация о сайте. Если короче, то мы именно с этих двух изменений в таблицах, мы начали реализовывать мета теги у нас на блоге!
На по следок, к обработчику первого шага, мы добавим запись первого поста в таблицу blog. Вот код
$title = "Добро пожаловать в CMS RS-BLOG";
$author = "RS-BLOG";
$txt = "Добро пожаловать администратор. Если Вы видите это сообщение, значит скрипт блога полностью настроен и готов к работе. Этот скрипт был создан исключительно для учебных целей. И это первая версия, она самая простая и пока не имеет должной защиты от взлома
<BR>
<BR>[end]
<BR>
<BR>Этот скрипт был выложен мною ( автором скрипта <a href=\"http://rio-shaman.ru/\">http://rio-shaman.ru/</a> ) с целью показать результат первых работ над блогом. В общем следите за новостями на моем блоге ( <a href=\"http://rio-shaman.ru/\">http://rio-shaman.ru/</a> ) и мы с Вами улучшим этот скрипт!
";
$date_day = date("d");//Определяем день
$date_month = date("m");//Определяем месяц
$date_year = date("Y");//Определяем год
$date_time = date("H:i");//Определяем часы и минуты
$date_cont = $date_day."/".$date_month."/".$date_year." ".$date_time;//Склеим все переменные в одну
//получим дату для записи в формате день/месяц/год часы:минуты
$add_post = mysql_query("INSERT INTO blog (title,author,text,date_b,cat)
VALUES ('$title','$author','$txt','$date_cont','0')");
$add_main_menu = mysql_query("INSERT INTO menu (name,href,position)
VALUES ('Главная','index.php','1')");
$add_contact_menu = mysql_query("INSERT INTO menu (name,href,position)
VALUES ('Контакты','index.php?contact=1','2')");
header("location: installer.php?step=2");
exit;
Тут ничего сложного нет. Добавили первый пост в базу данных, и создали два пункта меню. После чего перенесли администратора на страницу...
header("location: installer.php?step=2");
exit;
...второго шага.
На всякий случай поясню Вам куда вставляется весь этот код ( от редактирование файла db.php до переноса администратора на страницу второго шага )
if(isset($nameDB) & isset($nameSERVER) & isset($nameUSER) & isset($passUSER) & isset($server_root))
{
Код обработчика
}
Вставляется он вместо строчки: Код обработчика
Форма приблизительно такая же, естественно заменил атрибуты name и атрибут action. Обратите на эти атрибуты особое внимание
<p style="margin-top:120px;" align="center">Шаг 2 - Сбор данных</p>
<form action="installer.php?step=2" method="post" name="conf_DB">
<table width="410px" cellpadding="5" cellspacing="0" border="0" align="center">
<tr>
<td width="160px">Название сайта</td>
<td width="250px"><input class="input" style="width:150px;" type="text" name="titleSITE" /></td>
</tr>
<tr>
<td width="160px" valign="top">Описание сайта</td>
<td width="250px"><textarea class="input" style="width:250px;height:60px;" name="discSITE"></textarea></td>
</tr>
<tr>
<td width="160px">Ключевые слова</td>
<td width="250px"><input class="input" style="width:250px;" type="text" name="keySITE" /></td>
</tr>
<tr>
<td width="160px">Логин админ.</td>
<td width="250px"><input class="input" style="width:150px;" type="text" name="nameADMIN" value="admin" /></td>
</tr>
<tr>
<td width="160px">Пароль админ.</td>
<td width="250px"><input class="input" style="width:150px;" type="password" name="passADMIN" /></td>
</tr>
<tr>
<td colspan="2" align="center"><input class="sub" type="submit" value="Далее" /></td>
</tr>
</table>
</form>
Вставляется этот html код вместо
html отрывок второго шага
Лицезрим вот такой результат
Сразу после обработчика первого шага, пишем следующий код:
//Сохраняем данных присланные из второй формы
if(isset($_POST['titleSITE']))$titleSITE = $_POST['titleSITE'];
if(isset($_POST['discSITE']))$discSITE = $_POST['discSITE'];
if(isset($_POST['keySITE']))$keySITE = $_POST['keySITE'];
if(isset($_POST['nameADMIN']))$nameADMIN = $_POST['nameADMIN'];
if(isset($_POST['passADMIN']))$passADMIN = $_POST['passADMIN'];
//Сохраняем данных присланные из второй формы
//Если был послан запрос из второй формы
if(isset($titleSITE) & isset($discSITE) & isset($keySITE) & isset($nameADMIN) & isset($passADMIN))
{
//ПОДКЛЮЧЕНИЕ К БАЗЕ ДАННЫХ (БД)
include("moduls/db.php");
//ПОДКЛЮЧЕНИЕ К БАЗЕ ДАННЫХ (БД)
$passADMIN = md5($passADMIN);//Зашифровываем пароль через функцию md5
$confIndex = mysql_query("INSERT INTO page (title,meta_d,meta_k) VALUES ('$titleSITE','$discSITE','$keySITE')");//Создаем запись в таблице page. Этим самым мы определим мета теги сайта
$addADMIN = mysql_query("INSERT INTO user (login,pass) VALUES ('$nameADMIN','$passADMIN')");//Создаем аккаунт администратора
header("location: installer.php?step=3");//Пересылаем пользователя на третий шаг
exit;
}
Я за комментировал почти каждую строчку. В этом шаге ничего сложного, и нового нет. Мы все проходили при разработки блога с нуля.
Вот код
<p style="margin-top:120px;font-size:16px;" align="center">Установка прошла успешно!</p>
<p style="color:red;font-size:15px;" align="center">Удалите файл installer.php из корня сайта</p>
<p align="center"><a href="index.php">На главную</a></p>
Он вставляется вместо: html отрывок третьего шага.
Назначение этого кусочка кода, просто оповестить администратора о том что процесс установки окончен.
За сегодня мы с Вами создали установщик для наше CMS. Пост получился огромный, поэтому вывод мета тегов мы оставим на потом...
В следующем посте, как я и обещал, я выложу скрипт, и распишу как его поставить, правда теперь с автоматической установкой, это сделать будет не сложно Так, что не пропускайте новые посты, и подпишитесь на RSS ленту!
Если есть какие вопросы, отзывы, или просто есть, что сказать, говорите! С удовольствием почитаю/помогу!
Удачи Вам, на сегодня у меня все!
Исходник |
Я в своей CMS поступил по другому.
Сделал инсталлер в виде одного файла, который уже вытягивает все что надо с сервера.
Сервер же тоже небольшой скрипт, который готовит для клиента файлы прямо из SVN, структуру БД и генерит конфиги.
Все настройки задаются на сервере, чтобы не тащить лишний функционал на клиента.
Причем описанным способом происходит автоматической обновление этой самой CMS.
Просто и со вкусом :)
Я, например, если начну писать что-то подобное, то это получится учебник по WEB-разработке:)
Поэтому решил писать статьи на более отстраненные темы :)
Есть небольшое замечание к безопасности.
Рекомендую посмотреть в сторону защиты от SQL инъекций:
http://php.net/manual/ru/security.database.sql-injection.php
header("location: installer.php?errorinstal=1");//выводим ошибку
выводится 1 ошибка. Делал все так как у вас написано.
Т.е. я сейчас использую два файла всего installer.php и db.php
Ошибка подключения с базой данных. Сначала ссылалось на 6 строку из файла db.php там где
mysql_select_db($nameDB, mysql_connect($nameSERVER,$nameUSER,$passUSER));
а сейчас на эту первую ошибку ссылается.
В тестировании я использую денвер и сторонний хостинг везде проблема таже
Получается что таблица не создается что ли
$DBfileUser = fopen("moduls/db.php", "w+");
fwrite($DBfileUser,$dbNEW);
fclose($DBfileUser);
$DBfileAdmin = fopen("admin/moduls/db.php", "w+");
fwrite($DBfileAdmin,$dbNEW);
fclose($DBfileAdmin);
Ось Ubuntu 12.10...
строки:
mysql_query("set character_set_client ='cp1251'");
mysql_query("set character_set_results ='cp1251'");
mysql_query("set collation_connection ='cp1251_general_ci'");
но при их вставки, и входе на installer.php то пишет ошибка сервера, пробовал закомментировать строки но не получаеться, помогите Rio-shaman))) у меня одна надежда только на вас)
но у меня проблема :( я вбил в переменную несколько строчек, и при переходе на страницу установки, он пишет Ошибка сервера вот демо: niuncms.vrozetke.com
Скачайте посмотрите что не то я сделал: http://rghost.ru/42921934
http://rio-shaman.ru/download/download_2122172788.rar
Теперь ошибки нет, но не знаю, будет ли инсталятор работать
но я его переделал с дизайном, и при установки, сделал первую страницу это Лицензионное соглашение
и после установки захожу на сайт а он пустой!
заглядываю в phpMyAdmin а база пустая :( скачайте посмотрите что я пропустил добавить:
http://rghost.ru/42927512
последний раз) больше вас тревожить не буду, так-же рекомендую в строчку URL сайта добавить:
http://<?php echo $_SERVER['SERVER_NAME']; ?>/
как так добавляет автоматически URL адрес веб-сайта :)