Сен 20, 2016 - Уроки php    No Comments

§4. PHP и MySQL - пишем свою CMS

Как написать свою CMS на базе PHP и MySQL? Как сделать собственную административную панель (админку) на php?

Наверное, многие могли задаваться подобными вопросами, но сложности в изучении и скудный материал в сети Интернет вряд ли содействовал в этом. Скудный, спросите вы, несмотря на обилие копипастов? Да, отвечу я, ибо на десятках сайтах копирующих тупо копирующих статьи со сторонних источников, распространяются одни и те же ошибки, которые становятся серьезнейшим камнем преткновения для начинающих изучать PHP. Многочисленные высоколобые форумчане зачастую не могут разобраться в наипростейших кодах, что приходится самому разбираться во всем.

В очередной раз я нашел тому подтверждение, когда решил начать освоение языка PHP и работы с базами данных MySQL с создания простейшей админки и небольшого сайтика, дабы на реальном движке отточить свое мастерство. Каково же было мое удивление, когда ни один из приведенных в сети кодов не заработал. Мне понадобился целый день, чтобы самому решить те простейшие задачи, на которые я так и не нашел ответа в сети.

Итак, в этой статье я представляю работающий код простой админки и шаблона, позволяющего создавать и редактировать статьи, используя php.

Часть 1. Запись в таблицы базы данных MySQL

По сути своей CMS - это инструмент для записи в базу данных всей информации о сайте. Все это должно содержаться в таблицах, и у администратора сайта должен быть удобный способ для ввода информации в таблицы, ее изменения или удаления.

Для начала создадим с помощью phpMyAdmin базу данных, а в ней - таблицу 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.

Чтобы управлять такой таблицей из админки, нам понадобится форма, состоящая из простого текстового поля (input type="text") для ввода заголовка, текстовой области (textarea) для ввода содержимого и кнопка "Отправить" (input type="submit").

cms_admin

Форма добавления страницы

 

Поместим эту форму в файл 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="page.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 для передачи данных файлу page.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>

Теперь каждая прочитанная запись будет вноситься в ячейку, а ряды таблицы - "размножаться" по мере чтения последующих записей.

Рядом с ячейкой, куда мы поместили заголовки страниц находится еще одная ячейка. Я просто написал в ней слово Редактировать, а можно было какую-нибудь красивую пиктограммку поставить - неважно. Важно другое: эта запись (или картинка) должна привести администратора в раздел админки, где находится редактор текстов.

Теперь настала пора воспользоваться самым примитивным "редактором" - текстовой областью формы.

Редактор статей

Редактор статей

 

Для этого создадим файл editor.php со следующим кодом.

editor.php

<? include ('config.php'); ?>
<html>
<body>
<table border="1" align="center">
<? 
if(isset($_GET['page_title'])) 
$page_title=$_GET['page_title'];
$sql = mysql_query("SELECT*FROM pages");
 while($record = mysql_fetch_array($sql))
 { 
 print '<tr><td>'.$record['title'].'</td>
 <td>'.$record['content'].'</td>
 <td><a href="editor.php?page_title='.$record['title'].'">Редактировать</a></td>
 <td><a href="editor.php?page_title='.$_SESSION['id'].'&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'];
 }
?>
<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;  
?>

Этот прием называется сессии. Сессия понадобится для того, чтобы в переменной запомнить страницу, которую мы редактируем. Хотя мы и нажали на кнопку Редактировать, и получили значение переменной $page_title (заголовок редактируемой страницы), после того, как мы внесем изменения и нажмем на кнопку Сохранить, страница editor.php перезагрузится, и значение $page_title будет потеряно. Вот поэтому мы и сохраним его в $_SESSION['id'].

А когда форма отправит методом POST на перезагруженную страницу editor.php значение переменной $text_edit (такое имя мы дали текстовой области), то нам удасться запустить следующий код:

if (isset($_POST['save']))
$my_text = strval($_POST['text_edit']);
 $sql =mysql_query ("UPDATE pages SET content = '".$my_text."' WHERE title='".$_SESSION['id']."';"); 

где save - это имя кнопки Сохранить.

Надеюсь, вы поняли, зачем нам понадобилась переменная $_SESSION['id'].

Полный скрипт файла editor.php будет выглядеть так:

<?
header('Content-Type: text/html; charset=utf-8');
session_start();
include ('config.php'); 
?>
<html>
<body>
<table border="1" align="center">
<? 
if(isset($_GET['page_title'])) 
$page_title=$_GET['page_title'];
$sql = mysql_query("SELECT*FROM pages");
 while($record = mysql_fetch_array($sql))
 { 
 print '<tr><td>'.$record['title'].'</td>
 <td>'.$record['content'].'</td>
 </tr>';
 }
?>
</table>
<?

$sql = mysql_query("select * FROM pages where title='".$page_title."';");
 while($record = mysql_fetch_array($sql))
 {
 $content=$record['content'];
 }
if (isset($_POST['save']))
$my_text = strval($_POST['text_edit']);
 $sql =mysql_query ("UPDATE pages SET content = '".$my_text."' 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 :

  <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>';

Совершенно неважно, какое значение мы передадим переменной $delete, можете написать &delete=1 или &delete=abcd, а важно то, что теперь можно написать условие, с помощью которого мы удалим выбранную запись:

if($delete)
   $sql =mysql_query ("DELETE FROM pages WHERE title='".$_SESSION['id']."';");

В окончательном виде наш файл editor.php выглядит так:


Внимание! Однако данный код у меня ни в какую не хотел работать. Поэтому мне пришлось немного изменить код. В editor.php:

  1.  Я убрал следующую конструкцию:
     <td><a href="editor.php?page_title='.$_SESSION['id'].'&delete=y">Удалить</a></td>

    чтобы нечаянно не удалить нужную страницу;

  2. Добавил функцию удаления страницы в случае, если нажата кнопка "delete"

if (isset($_POST['delete']))
$title = strval($_SESSION['id']);
$sql =mysql_query ("DELETE FROM pages WHERE title='".$title."';");

В окончательном виде наш файл editor.php выглядит так:

<?
header('Content-Type: text/html; charset=utf-8');
session_start();
include ('config.php');
?>
<html>
<body>
<table border="1" align="center">
<?
if(isset($_GET['page_title']))
$page_title=$_GET['page_title'];
$sql = mysql_query("SELECT*FROM pages");
while($record = mysql_fetch_array($sql))
{
print '<tr><td>'.$record['title'].'</td>
<td>'.$record['content'].'</td>
<td><a href="admin_main.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 (isset($_POST['save']))
$my_text = strval($_POST['text_edit']);
$sql =mysql_query ("UPDATE pages SET content = '".$my_text."' WHERE title='".$_SESSION['id']."';");
if (isset($_POST['delete']))
$title = strval($_SESSION['id']);
$sql =mysql_query ("DELETE FROM pages WHERE title='".$title."';");
?>
<form action="admin_main.php" method="post">
<table width="70%" 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="Сохранить изменения"> <input name="delete" 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, работают на одном и том же принципе.

А уж подключить к админке сам сайт - это вообще проще простого, после того, как вы написали скрипт самой админки.

Успехов вам!

По материалам из разных источников с собственными исправлениями.

Comments are closed.