PHP: Основы PHP+MySQL на примере создания гостевой книги

Сегодня я опишу, пожалуй, лучшую задачу для новичков языка программирования PHP — Гостевая книга. На мой взгляд эта задача является наипростейшей, но при этом позволяет узнать все основные особенности работы с PHP и базой данных MySQL. Помимо этого, данная задача до бесконечности расширяема, что позволяет оттачивать новые технологии.

Описание и решение данной задачи будет написано сразу здесь, без проверок на работоспособность, поэтому, возможно, где-то есть опечатка. Сделано это не из-за моей лени, а опять таки из за дополнительной тренировки, при создании гостевой книги Вами. Так же представленное решение будет немного «кривовато», но об этом уже в конце данной статьи в разделе «Самостоятельная работа».

Если Вы совсем не знаете как работать с PHP, то для начала советую прочитать заметку PHP — с чего начать.

Мы будем разбирать создание самой примитивной гостевой книги, без дизайна и администрирования. Другими словами мы ограничимся входом в книгу, регистрацией ну и оставлением сообщений.
Из самой задачи становится понятно, что мы можем вполне ограничится тремя файлами php, для реализации данной задачи. Конечно задачку регистрации можно разбить на две: форма регистрации и добавления данных в базу, однако делать мы этого не будем. Аналогичные рассуждения допустимы и для процедуры оставления комментариев. Таким образом создаем три файла: index.php, registration.php, book.php.

По названиям файлов, можно сразу понять, за что они будут отвечать: index.php — страница входа, registration.php — страница регистрации, book.php — страница гостевой книги.

Самое простое в нашем случае это страница входа. Так как страница отвечает за ввод пары логина и пароля — на ней должна присутствовать форма для отправки этих данных на страницу book.php. А так же ссылка на страницу с регистрацией. Имеем:

<html>
  <head>
  <title>Вход в гостевую книгу</title>
  </head>
  <body>
  <form action="book.php" method="post">
  Логин: <input type="text" name="login" /><br/>
  Пароль: <input type="password" name="password" /><br/>
  <input type="submit" value="Вход" /><br/>
  <a href="registration.php">Регистрация</a>
  </form>
  </body>
</html>

Немного отойдя от темы, для тех кто не вкусе что означает код выше. Здесь мы имеем голый HTML. Ключевым моментом является тег form который принимает два параметра action, который отвечает за адрес страницы, который откроется после подтверждения ввода данных, и параметр method, который отвечает каким способом данные формы будут отправляться на указанную страницу (см. POST и GET простыми словами). Внутри тега form указываются поля для ввода (input, select), которые обязательно должны иметь атрибут name. Именно по значению данного атрибута можно будет получить введенные пользователем данные на странице указанной в параметре формы action. Обязательно внутри формы должен находится input с типом submit, который по своей сути является кнопкой, по нажатию на которую и произойдет отправка данных на страницу action.

Продолжим… Теперь нам нужно создать страницу с регистрацией нового пользователя. Стоит сразу продумать, что именно мы хотим иметь. Я решил, что для простой гостевой книги будет вполне достаточно иметь пользователей с уникальными логинами, а так же знать адрес их Web сайта (если он есть). Раз мы определились с тем что мы хотим знать о пользователе, значит мы можем начать проектировать нашу базу данных.

Заходим в phpMyAdmin. Создадим там базу с именем gb. В данной базе создадим таблицу Users со следующими полями:

login    varchar(50)  unique //логин пользователя, уникальное поле
password varchar(150) //пароль 
www      varchar(255) //адрес сайта

А раз мы уже зашли в редактор базы, то можно сразу и подумать о том как мы будем хранить сообщения. В нашем случае вполне подойдет знать кто и когда оставил сообщение, ну и собственно текст нашего сообщения. Так же для удобство стоит пронумеровать наши сообщения. С этим мы определились, значит можно смело создавать еще одну таблицу Messages со следующей структурой:

id   int ai(auto_increment) primary_key //номер сообщения, счетчик, который сам будет увеличиваться
mes  text //текст сообщения
who  varchar(50) //логин того, кто оставил сообщение
when timestamp default(current) //время оставления сообщения, по умолчанию текущая дата и время

С базой данных разобрались. Теперь переходим к файлу registration.php. Подведя итог вышеизложенному имеем:

<html>
  <head><title>Регистрация</title></head>
  <body>
  
  <?php if ($_POST) //Если на данную страницу идут данные POST методом
  {
    $good = true; 
    //Проверим заполнил ли пользователь обязательные поля логин и пароль
    if (empty($_POST["login"]) || !empty($_POST["password"]))
    {
      echo "Поля логин и пароль обязательные!";
      $good = false;
    }
    //Проверим правильно ли пользователь ввел пароль
    if ($_POST["password"] != $_POST["repassword"])
    {
      echo "Пароли не совпадают!";
      $good = false;
    }
    if ($good) // Если пользователь все ввел верно
    {
      //Подсоеденяемся к базе данных и выберем созданную базу gb
      //Указаны настройки по умолчанию
      $link = mysql_connect("localhost", "root", "");
      if ($link)
      {
        if(mysql_select_db("gb", $link))
        {     
          //Наш запрос на вставку данных о пльзователе
          $SQL = "INSERT INTO `Users` (`login`, `password`, `www`) VALUES ('".$_POST["login"]."', '".$_POST["password"]."', 'http://".$_POST["site"]."')";
          //Выполняем запрос
          $result = mysql_query($SQL, $link);
          if ($result) // Если запрос выполнен
          {
            echo "Спасибо за регистрацию!";
          }
          else
          {
            echo "Ошибка при добавлении в базу! Такой пользователь уже зарегистрирован!";  
          }
        }
        else
        {
          echo "Не могу выбрать базу данных!";
        }
      }
      else
      {
        echo "Не могу присоедениться к серверу бд!";
      }
    }
    //Закроем соединение с базой
    mysql_close($link);
  }
  else
  {
  ?>
    <form action="registration.php" method="post">
    Логин: <input type="text" name="login" /><br/>
    Пароль: <input type="password" name="password" /><br/>
    Пароль еще раз: <input type="repassword" name="password" /><br/>
    WWW: http://<input type="text" name="site" /><br/>
    <input type="sumbit" value="Зарегистрироваться" /><br/>
    </form>
  <?php
  } 
  ?>
  <br/><a href="index.php">На главную</a>
  </body>
</html>

Немного о коде. Как Вы уже заметили, здесь присутствует PHP. Описывать форму я уже не буду, но как мы видим, здесь данные формы посылаются на ту же страницу, где расположена данная форма. Другими словами файл registration.php шлет данные сам на себя. Так делать никто не запрещает, однако использовать это можно не всегда, так как это сильно портит читабельность кода. Однако с другой стороны это наглядно демонстрирует возможности языка PHP. По сути наша страница разделена на два случая. Первый случай это когда на страницу шлются данные POST запросом, второй случай, когда на страницу никакого POST запроса не послано. Во втором случаем мы покажем форму для регистрации, а первом же начнем выполнять проверки присланных данных. Как видно данные шлются в виде ассоциативного массива (т.е. массива, индексами которого являются строки). Причем индексы совпадают с названиями полей input, указанными в форме отправки данных. Т.е. если мы пишем

<input type="text" name="vasa-peta" />

то у нас, при отправке этих данных POST запросом, будет переменная

$_POST["vasa-peta"]

Так же стоит заметить, что никаких проверок на повтор логина мы не делаем. Данная проверка будет осуществляться на уровне базы данных, так как поле логин помечено как уникальное.

Теперь последнее. Осталось сделать саму гостевую книгу. Немного рассуждений. Так как гостевая книга работает по логину и паролю, то первое что нам придется делать — проверять введенный логин и пароль на наличие в базе. Так как мы решили добавлять сообщения так же в файле book.php, то очевидно следом должна осуществляться процедура добавления сообщения. Ну и в самом конце отображение всех сообщений. (если сделать добавление сообщение, после их отображения, то добавленное сообщение отобразится только после перезагрузки страницы). Имеем:

<?php
//Страница открывается только если слать запрос
if (!$_POST)  exit();
//Проверим логин и пароль
if (empty($_POST["login"]) || !empty($_POST["password"]))
{
  die("Поля логин и пароль обязательные!");
}
$link = mysql_connect("localhost", "root", "");
if ($link)
{
  if(mysql_select_db("gb", $link))
  {     
    //Ищем в базе нашего пользователя
    $SQL = "SELECT * FROM `Users` WHERE `login` =  '".$_POST["login"]."' AND `password` = '".$_POST["password"]."'";
    $result = mysql_query($SQL, $link);
    if (!$result || mysql_num_rows($result) == 0)
    {
      mysql_close($link);
      die("Пользователь не найден!");
    }
  }
  else
  {
    mysql_close($link);
    die("Не могу выбрать базу данных!");
  }
}
else
{
  die("Не могу присоедениться к серверу бд!");
}
?>
<html>
  <head><title>Гостевая книга</title></head>
  <body>
  
  <?php
  //Если есть переменная act с действием добавления комментария
  if (isset($_POST["act"]) && $_POST["act"] == "addcomment")
  {
    $SQL = "INSERT INTO `Messages` (`mes`, `who`) VALUES ('".$_POST["newmes"]."', '".$_POST["login"]."')";
    $result = mysql_query($SQL, $link);
    if ($result)
    {
      echo "Ваше сообщение добавлено!<hr/>";
    }
    else
    {
      echo "Ваше сообщение не добавлено!<hr/>";
    }
  } 
  ?>
  <form action="book.php" method="post">
  <input type="hidden" value="<?php echo $_POST["login"]; ?>" name="login" />
  <input type="hidden" value="<?php echo $_POST["password"]; ?>" name="password" />
  <input type="hidden" value="addcomment" name="act" />
  <textarea name="newmes"></textarea>
  <input type="submit" value="Добвить сообщение" />
  </form>
  <hr/>
  <?php
  //Запрос на выборку всех сообщений
  $SQL = "SELECT * FROM `Messages`";
  $result = mysql_query($SQL, $link);
  if ($result) //Если запрос выполнен
  {
    //Пока есть строки в результате запроса
    while ($row = mysql_fetch_assoc($result))
    {
      //Выводим сообщение
      echo "Сообщение ".$row["id"]." от ".$row["when"].", оставил пользователь: ".$row["who"]."<br/>";
      echo "Текст: ".$row["mes"]."<hr/>";
    }
  }
  mysql_close($link);
  ?>
  </body>
</html>

Вот по сути и все. Если код 100% рабочий, хорошо. Если нет, то советую Вам постараться самостоятельно исправить ошибки. Теперь обещанный раздел.

Самостоятельная работа
Как уже говорилось в начале, данное решение «кривое». Если Вы еще не поняли почему, то я сейчас поясню. Как вы могли заметить в файле book.php в форме добавления комментария присутсвуют несколько скрытых полей, при этом два из них — это введенный пользователем логин и пароль. Не хорошо, не правда ли? Попробуйте исправить данный недочет использую сессии (Как работать с сессиями в PHP).
Постарайтесь ответить на вопрос, чем отличаюься функции empty/isset и exit/die?
Измените запрос выборки сообщений из базы так, чтобы при при выводе сообщений отображался web сайт автора сообщения.
Если вы заметили, то пароль пользователей в базе данных храниться в открытом виде, а это очень не хорошо. Отредактируйте код так, чтобы в базе хранился хэш пароля пользователя (например MD5 или SHA1).

Запись опубликована в рубрике PHP с метками , , , , , , , , , . Добавьте в закладки постоянную ссылку.