PHP и MySQL - пишем свою CMS
Часть 1. Запись в таблицы базы данных MySQL
По сути своей CMS - это инструмент для записи в базу данных всей информации о сайте. Все это должно содержаться в таблицах, и у администратора сайта должен быть удобный способ для ввода информации в таблицы, ее изменения или удаления.
Если вы не писали программ на языке PHP с поддержкой MySQL, то лучше всего начать работу не на удаленном хосте, а на локальном. Скачайте с сайта http://www.denwer.ru/ дистрибутив "Денвер", установите его у себя на компьютере, и можете приступать к делу!
Прежде всего нам нужно выбрать подходящий механизм для работы. Записи, которые мы вносим в таблицы, должны находиться на экране в виде, доступном для их редактирования. В языке HTML для этой цели существуют формы. О работе с формами написано огромное количество книг и статей, поэтому на этом мы останавливаться не будем, а перейдем сразу к простому примеру.
Запустим локальный хост и создадим с помощью phpMyAdmin базу данных с именем simple_cms, а в ней - таблицу pages с двумя полями title и content. Для этого войдите в раздел SQL на панели phpMyAdmin и выполните такой запрос:
CREATE TABLE `pages` ( `title` varchar(100) NOT NULL default '', `content` text NOT NULL ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
и phpMyAdmin построит вам эту таблицу.
Маленькое отступление:
если вы знакомы с базами данных хотя бы на уровне Microsoft Access, то вы помните, что каждое поле таблицы имеет ряд свойств. В данном случае мы присвоили полю content свойство text. Казалось бы, логично, ведь оно и предназначено для хранения текстов. Но следует помнить, что размер этого поля ограничен, поэтому, если вы хотите сохранить в нем текст "Войны и мира", то лучше определить его как longtext.
Таблица базы данных - pages
title | content |
---|
Чтобы управлять такой таблицей из админки, нам понадобится форма, состоящая из простого текстового поля (input type="text") для ввода заголовка, текстовой области (textarea) для ввода содержимого и кнопка "Отправить" (input type="submit").
Примерно так может выглядеть в нашей админке панель управления содержимым страниц.
Введите заголовок страницы | Введите текст |
Поместим эту форму в файл page.php
page.php
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Моя первая CMS</title> </head> <? include ('config.php'); ?> <body> <form action="admin.php" method="post"> <table border="1" align="center"> <tr> <td>Введите заголовок страницы</td> <td>Введите текст</td> </tr> <tr> <td valign="top"><input name="my_title" type="text" size="50" /></td> <td valign="top"><textarea name="my_text" cols="60" rows="30" > </textarea></td> </tr> </table> <div align="center"> <input name="send" type="submit" value="Отправить" /> </div> </form> </body> </html>
Создадим файл config.php, который будет осуществлять подключение к базе данных.
config.php
<? $dblocation = "localhost"; $dbuser = "root"; $dbpasswd = ""; $dbname="simple_cms"; //Подключение к базе данных $dbcnx = @mysql_connect($dblocation,$dbuser,$dbpasswd); if (!$dbcnx) // Если дескриптор равен 0 соединение не установлено { echo("<p>В настоящий момент сервер базы данных не доступен, поэтому корректное отображение страницы невозможно.</p>"); exit(); } if (!@mysql_select_db($dbname, $dbcnx)) { echo( "<p>В настоящий момент база данных не доступна, поэтому корректное отображение страницы невозможно.</p>" ); exit(); } ?>
Теперь, когда у нас появилось подключение к базе данных и скрипт для ввода в нее нужной информации, остается организовать отправку туда содержимого текстового поля с именем my_title и текстовой области my_text. С этой целью мы определили в форме метод POST для передачи данных файлу admin.php - <form action="page.php" method="post">.
Когда администратор внесет в поля формы информацию и нажмет кнопку "Отправить", этот метод присвоит переменной $_POST['my_title'] значение текстового поля my_title, а переменной $_POST['my_text'] - значение текстовой области my_text.
Чтобы удостовериться в этом, добавим небольшой код в начало файла page.php:
<? include ('config.php'); <body> <? print $_POST['my_title'].'<br />'.$_POST['my_text'];?>
Запустим файл page.php. Если в программе нет ошибок, то вы увидите ваш заголовок и текст в окне броузера.
Прекрасно! Осталось только организовать запись этой информации в нашу базу данных. Для этого нам придется обратиться к языку запросов SQL, а точнее - к MySQL.
Чтобы записать новые данные в таблицу базы данных, которая благодаря функции
$dbcnx = @mysql_connect($dblocation,$dbuser,$dbpasswd);
уже подключена к работе, нам следует использовать оператор INSERT языка MySQL. Чтобы не загромождать код страницы, вставьте этот фрагмент в файл page.php вместо кода вывода на печать:
if ($send) $sql = mysql_query("INSERT into pages (title, content) values ('".$_POST['my_title']."', '".$_POST['my_text']."');");
То есть, если от кнопки "Отправить" методом POST был передан $send (см. name этой кнопки!), то должен выполниться данный запрос (функция mysql_query), и в таблицу базы данных будет записано содержимое полей формы.
Запись эта поначалу кажется трудной для чтения, и в ней можно просто запутаться во многочисленных простых и двойных кавычках. Поэтому рассмотрим ее в "чистом виде".
Параметром функции mysql_query(); является сам SQL-запрос, который можно представить в виде:
INSERT into pages (title, content) values ('значение_переменной_1', 'значение_переменной_2');
Так оно, вроде, понятнее ...
Теперь откройте phpMyAdmin и убедитесь, что записи внесены в поля таблицы. Но это всего лишь полдела. Нам нужно научиться "вытаскивать" из таблиц необходимые данные, чтобы работать с ними в админке, а главное - показывать их на сайте.
В окончательном виде файл page.php должен выглядеть так:
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Моя первая CMS</title> </head> <? include ('config.php'); if (@$send) $sql = mysql_query("INSERT into pages (title, content) values ('".$_POST['my_title']."', '".$_POST['my_text']."');"); ?> <body> <form action="page.php" method="post"> <table border="1" align="center"> <tr> <td align="center">Введите заголовок страницы</td> <td align="center">Введите текст</td> </tr> <tr> <td valign="top"><input name="my_title" type="text" size="50" /></td> <td valign="top"><textarea name="my_text" cols="80" rows="30" > </textarea></td> </tr> <tr> <td colspan="2" align="center"><input name="send" type="submit" value="Отправить" /></td> </tr> </table> </form> </body> </html>
Об этом - в следующей части.
Часть 2. Чтение из таблиц базы данных MySQL
Создадим в нашей админке перечень всех заголовков страниц, хранящихся в таблице pages. И организуем работу этого списка так, чтобы пользователь, щелкнув мышкой, получил доступ к содержимому страницы.
Для чтения записей из таблицы воспользуемся следующей конструкцией:
$sql = mysql_query("SELECT*FROM pages"); while($record = mysql_fetch_array($sql)) { $title = $record['title']; }
Если в таблице находятся уже несколько записей, то в "чистом" виде конструкция выдаст нам только последнюю из них, ведь значение переменной $title все время обновляются в цикле while. Но мы применим маленькую хитрость. В том же цикле будем выводить их на экран все записи, одну за другой.
Для этого нарисуем таблицу, и часть ее поместим внутрь цикла:
<table border="1" align="center"> <? $sql = mysql_query("SELECT*FROM pages"); while($record = mysql_fetch_array($sql)) { print '<tr><td>'.$record['title'].'</td> <td>Редактировать</td></tr>'; } ?> </table>
Теперь каждая прочитанная запись будет вноситься в ячейку, а ряды таблицы - "размножаться" по мере чтения последующих записей.
Рядом с ячейкой, куда мы поместили заголовки страниц находится еще одная ячейка. Я просто написал в ней слово Редактировать, а можно было какую-нибудь красивую пиктограммку поставить - неважно. Важно другое: эта запись (или картинка) должна привести администратора в раздел админки, где находится редактор текстов.
Здесь я хочу сделать маленькое отступление. В современных CMS используются WYSIWYG-редакторы (от сокращения What You See Is What You Get). В нашей SMS "Столица" их целых три - на выбор администратора, какой удобнее. Лично мне более по душе FCKEditor, хотя и у него есть свои глюки. Когда вы будете писать не учебную, а действующую админку, вам нужно будет скачать бесплатно распространяемые скрипты редактора и подключить их к админке. А пока что воспользуемся самым примитивным "редактором" - текстовой областью формы.
Для этого создадим файл editor.php со следующим кодом.
editor.php
<? include ('config.php'); ?> <html> <body> <table border="1" align="center"> <? $sql = mysql_query("SELECT*FROM pages"); while($record = mysql_fetch_array($sql)) { print '<tr><td>'.$record['title'].'</td><td><a href="editor.php?page_title='.$record['title'].'" >Редактировать</a></td></tr>'; } ?> </table> <? $sql = mysql_query("select * FROM pages where title='".$page_title."';"); while($record = mysql_fetch_array($sql)) { $content=$record['content']; } ?> <form action="editor.php" method="post"> <table width="100%" align="center"> <tr> <td align="center"><textarea name="text_edit" cols="80" rows="15"><? print $content; ?></textarea></td> </tr> <tr> <td align="center"><input name="save" type="submit" value="Сохранить"></td> </tr> </table> </form> </body> </html>
Разберем основные конструкции этого скрипта.
В каждой из рядов верхней таблицы появляется заголовок страницы, прочитанный из базы данных. Справа от него, в соседней клетке - слово Редактировать. Оно залинковано на ту же страницу editor.php и передает ей значение переменной $page_title, которое равно заголовку страницы в этом ряду (я выделил этот фрагмент кода красным цветом):
print '<tr><td>'.$record['title'].'</td><td><a href="editor.php?page_title='.$record['title']. '">Редактировать</a></td></tr>';
Когда пользователь нажимает на такой линк, он возвращается на ту же самую страницу, но уже с определенным значением переменной $page_title.
Следующий фрагмент кода ищет в базе данных таблицу pages, а в ней - значение поля content для которого поле title совпадает со значением переменной $page_title.
$sql = mysql_query("select * FROM pages where title='".$page_title."';"); while($record = mysql_fetch_array($sql)) { $content=$record['content']; }
Найдя такое поле, он передает его содержимое переменной $content, которая и распечатывает его в текстовой области.
<? print $content; ?>
Теперь у нас появляется возможность редактировать этот текст. А вот как вернуть исправленный вариант этого текста в базу данных - об этом в следующей части.
Часть 3. Редактирование записей из таблиц базы данных MySQL
Добавим в начало файла editor.php следующие фрагменты кода (выделено красным):
<? session_start(); include ('config.php'); ?>
А в самом конце этого файла допишем:
<? $_SESSION['id']= $page_title; ?>
Этот прием называется сессии. О том, как работают сессии можно прочесть в многочисленных учебниках по PHP, здесь же я хочу отметить, что сессия нам понадобится для того, чтобы в переменной запомнить страницу, которую мы редактируем. Хотя мы и нажали на кнопку Редактировать, и получили значение переменной $page_title (заголовок редактируемой страницы), после того, как мы внесем изменения и нажмем на кнопку Сохранить, страница editor.php перезагрузится, и значение $page_title будет потеряно. Вот поэтому мы и сохраним его в $_SESSION['id'].
А когда форма отправит методом POST на перезагруженную страницу editor.php значение переменной $text_edit (такое имя мы дали текстовой области), то нам удасться запустить следующий код:
if($save) $sql =mysql_query ("UPDATE pages SET content = '".$text_edit."' WHERE title='".$_SESSION['id']."';");
где save - это имя кнопки Сохранить.
Надеюсь, вы поняли, зачем нам понадобилась переменная $_SESSION['id'].
Полный скрипт файла editor.php будет выглядеть так:
<? session_start(); include ('config.php'); ?> <html> <body> <table border="1" align="center"> <? $sql = mysql_query("SELECT*FROM pages"); while($record = mysql_fetch_array($sql)) { print '<tr><td>'.$record['title'].'</td><td><a href="editor.php?page_title='.$record['title']. '">Редактировать</a></td></tr>'; } ?> </table> <? $sql = mysql_query("select * FROM pages where title='".$page_title."';"); while($record = mysql_fetch_array($sql)) { $content=$record['content']; } if($save) $sql =mysql_query ("UPDATE pages SET content = '".$text_edit."' WHERE title='".$_SESSION['id']."';"); ?> <form action="editor.php" method="post"> <table width="100%" align="center"> <tr> <td align="center"><textarea name="text_edit" cols="80" rows="15"><? print $content; ?></textarea></td> </tr> <tr> <td align="center"><input name="save" type="submit" value="Сохранить"></td> </tr> </table> </form> </body> </html> <? $_SESSION['id']= $page_title; ?>
Конечно, было бы красивее, чтобы отредактированный текст оставался в окне текстовой области и после нажатия кнопки Сохранить. Но я уверен, что вы без особого труда сможете дописать нужный фрагмент кода.
А в следующей части мы поговорим о том, как удалить из базы данных ненужные записи.
Часть 4. Удаление записей из таблиц базы данных MySQL
Добавим еще одну ячейку к таблице файла editor.php :
<table border="1" align="center"> <? $sql = mysql_query("SELECT*FROM pages"); while($record = mysql_fetch_array($sql)) { print '<tr><td>'.$record['title'].'</td> <td><a href="editor.php?page_title='.$record['title']. '">Редактировать</a></td> <td><a href="editor.php?page_title='.$record['title'].'&delete=y">Удалить</a></td> </tr>'; } ?> </table>
Совершенно неважно, какое значение мы передадим переменной $delete, можете написать &delete=1 или &delete=abcd, а важно то, что теперь можно написать условие, с помощью которого мы удалим выбранную запись:
if($delete) $sql =mysql_query ("DELETE FROM pages WHERE title='".$_SESSION['id']."';");
В окончательном виде наш файл editor.php выглядит так:
<? session_start(); include ('config.php'); ?> <html> <body> <table border="1" align="center"> <? $sql = mysql_query("SELECT*FROM pages"); while($record = mysql_fetch_array($sql)) { print '<tr><td>'.$record['title'].'</td> <td><a href="editor.php?page_title='.$record['title']. '">Редактировать</a></td> <td><a href="editor.php?page_title='.$record['title'].'&delete=y">Удалить</a></td> </tr>'; } ?> </table> <? $sql = mysql_query("select * FROM pages where title='".$page_title."';"); while($record = mysql_fetch_array($sql)) { $content=$record['content']; } if($save) $sql =mysql_query ("UPDATE pages SET content = '".$text_edit."' WHERE title='".$_SESSION['id']."';"); if($delete) $sql =mysql_query ("DELETE FROM pages WHERE title='".$_SESSION['id']."';"); ?> <form action="editor.php" method="post"> <table width="100%" align="center"> <tr> <td align="center"><textarea name="text_edit" cols="80" rows="15"><? print $content; ?></textarea></td> </tr> <tr> <td align="center"><input name="save" type="submit" value="Сохранить"></td> </tr> </table> </form> </body> </html> <? $_SESSION['id']= $page_title; ?>
Вот, пожалуй, и все, что я хотел рассказать о принципах работы админки. Конечно же, в настоящей CMS все отдельные модули (а у нас их пока три: page.php, editor.php и служебный файл config.php) работают под управлением главного файла index.php, который единоразово подключает все модули к базе данных и по желанию пользователя может присоединять к себе модуль создания страниц, модуль редактирования, а также массу других модулей (модуль меню сайта, модуль управления гостевой книгой, баннерами и т.п.). Важно только понимать, что любые модули, любые действия в админке основаны на четырех главных операторах языка SQL:
- INSERT - вставить запись в базу данных;
- SELECT - выбрать записи из базы данных;
- UPDATE - изменить запись;
- DELETE - удалить запись.
Так что ничего сверхсложного нет в том, чтобы написать свою собственную админку. Любые CMS, даже такие гиганты как Joomla, работают на одном и том же принципе.
А уж подключить к админке сам сайт - это вообще проще простого, после того, как вы написали скрипт самой админки.
Успехов вам!
Оставить комментарий
Комментарии
Самое то что надо!
К файлу admin.php .... а какое содержимое у этого файла?
Я видимо невнимательно прочитала... но понять, что в обработчике не смогла...
добавьте в config.php
mysql_query ("set character_set_client='cp1251'");
mysql_query ("set character_set_results='cp1251'");
mysql_query ("set collation_connection='cp1251_general_ci'");
Эти строчки нужны только если mysql сервер не настроен правильно.
добавьте в config.php
mysql_query ("set character_set_client='cp1251'");
mysql_query ("set character_set_results='cp1251'");
mysql_query ("set collation_connection='cp1251_general_ci'");
Надеюсь помог .
С уважением Владимир.
Видео на youtube по схожим и по этой теме.
Ищите TheDizain
сайт vvv-dizain
Всем удачи
Для того чтобы данный код работал в денвере надо именить кое что в файле php.ini
заходим на диске где установлен денвер в папку
Ищем пункт DATA HANDLIING
и меняем register_globals = off на register_globals = On.
Сохраняем и получаем заветные надписи в поле редактирования.
Видео выложу на youtobe
Ищите пользователя TheDizain
или на сайте vvv-dizain точка ру
Всем Удачи
Видео по работе админки.
автор молодец.
если пробл. с сессией сохраните файлы через notpad без bom
И кто тестирует в денвере и слабо с ним знаком у вас работать не будет editor.php
ЗАЛЕЙТЕ ФАЙЛЫ НА САЙТ В ОТДЕЛЬНУЮ ПАПКУ И БУДЕТ ВАМ СЧАСТЬЕ.
ПРИМЕР НА САЙТЕ www.vvv-dizain.ru был с нюансами по скрипту.
удачи
П.С. Админ, перестань курить и сделай нормальную картинку подтверждения букв при регистрации,а не психоделическо-абстракционную. Еще бы загадку загадал на древнеславянком...
(@$send) - всегда пустой, подскажите где копать.
Пока использую такую проверку:
if ($_POST['send']) ... - так работает
много искал как создать свой движок и ток тут нашол как его зделать.
respekt+5 автору)
Желающие подробнее ознакомиться с ее работой могут зайти на мой сайт, работающий с моей же админкой (адрес в начале статьи) и оттуда написать мне на мейл.
Главная мысль в начале - "По сути своей CMS - это инструмент для записи в базу данных всей информации о сайте."
Сейчас пишу свою CMC, именно с разделением административной панели и панели вывода информации. Как правило все CMS-ки это одно хитропереплетенное целое - это не правильно.
А кому нравится дрючить Joomly, полный вперед. Классная CMS не спорю. Тока зачем пихать ее на коммерческий проект, вы что клиенту будете жомлу ставить?(там одна база из 45 таблиц с базовыми возможностями, по большей части, для коммерческих проектов, ненужными).
меня убило другое--- tirasbiz, тебе решать что ль как и кому работать с SQl ??? (Если выбился из чайников, молчал бы или к статье путного добавил бы что нить).
так к CMS по приведённому примеру (Если её ваше можно назвать CMS) получиться весьма слабая.
Эта статья скорее предназначена для изучения взаимодействия PHP и MySQL
Но тем не менее статья довольно таки неплохая
За статью огромное спасибо
Для новичков самый раз
но должен заметить возникли не большие глюки.
например..
выдавало ошибки о переменных $save и $delete :( ...
решается проблема просто - ставится знак @ перед пременной.. if(@$save).
также глюк ... нельзя удалить запись.., не выбрав её для редактирования :(
Решил проблему,
добавил кнопку УДАЛИТЬ, ... и всё заработало..
<input name="delete" type="submit" value="Удалить">
и добавил обновления странички... если была команда DELETE
if(@$delete) {
$sql =mysql_query ("DELETE FROM info WHERE id='".$_SESSION['id']."';");
echo "<META HTTP-EQUIV=Refresh content=0;URL=editor.php >";
}
Автор, спасибо за познавательную статью.... для начинающих то что надо..
Санкс!
Вы глять пред-предыдущую статью - эта статья ее продолжение
Автар не хотел писать CMS - он на самом простом примере хотел показать, что такое CM2
2 Jackkum Эта статья не для такого заума как ты)
Лучше изучить структуру компонентов и модулей уже готовых CMS, например joomla, и писать новые компоненты и модули для них.
Joomla очень мощный движок, написание своих модулей для нее очень хорошая практика. Гибкость, многоязычность, использование шаблонов и др., всё это есть в jooml-е.
Автору этой статьи я бы посоветовал написать статьи о структуре готового движка, напримере той же jooml-ы, напиши о классах работы с БД, настройки модулей с помощью XML файлов. В общем, думаю на эту тему можно написать целую книгу.
Для человека, знакомого с PlSQL, FireBird достаточно просто описаны процедуры перехода на язык PHP & MySQL. Жду продолжения ... изобразить нечто подобное DbGrid для работы с полями записи.
Должна быть серьезная теоритическая подготовка к проектированию реальных CMS. У Автора ее, судя по всему, нет.
Вообще, минимальные требования к CMS:
- модульность и масштабируемость
- шаблонизация
- система обновлений (самообновляемость)
- юзери, роли
Чайникам, которые не знают как работать с SQL нефиг вообще делать в области строительства CMS.
> Важно только понимать, что любые модули, любые действия в админке основаны на четырех главных операторах языка SQL...
Вообще убило.
Низачот.