X

Пример создания простого приложения на php и mysql 2018

Всем привет! Я очень давно не писал новых статей, но по просьбе одного из читателей решил написать статью в которой разберу создание простого чата на PHP и MySQL. Этот пост совсем не о том, как сделать рюшки/плюшки, чтоб было визуально красиво. Этот пост о том, как использовать PHP с MySQL, а точнее как из PHP сохранить данные в базу MySQL..

Для тех, кто попал сюда впервые я расскажу, что 5 лет назад уже писал подобную статью "Open Server, создание домена, базы данных и простого приложения на php" и если часть про установку и настройку OpenServer-а все еще актуальная, то вот функции по работе с базой данных совсем устарели.

Функции семейства mysql_*, однако начиная с версии PHP 5.5.0 объявлены устаревшими и были удалены полностью в версии 7.0. Именно, поэтому пример из старой статьи утратил свою актуальность. На смену функциям mysql_* пришли функции mysqli_* (i-на конце), при этом большинство функций можно использовать без особых изменений, т.е.: было mysql_connnect стало mysqli_connect. Да, конечно, кое-что поменялось, но не так глобально, чтобы зная принцип работы старых функций нельзя было разобраться в новых.

На сегодняшний момент, есть два варианта работать с базой данных - это функции mysqli_* и функции PDO. Первые используем когда знаем что база данных у нас MySQL и не будет меняться, второй, когда предполагаем, что база данных может поменяться, например, вместо MySQL будет PostgreSQL.

Т.к. для новичков писать запросы довольно сложно (нужно знать язык SQL и его особенности), то в этой статье будем использовать обертку над функциями, которая позволяет нам упростить жизнь, что очень полезно когда у Вас и так переизбыток информации. Будем использовать Idiorm (сайт, github, документация). Эта библиотека позволит Вам выполнить 95% Ваших задач по работе с базой данных.

Что же мы будем делать? Давайте, пойдем по тому же пути, что и в старой статье и сделаем самый простой чат.

Для продолжения работы, нам понадобится настроенный веб-сервер, например, можно установить тот же OpenServer по шагам из старой статьи.

Далее, создаем в PhpMyAdmin базу данных и таблицу chat с такими полями (как это сделать написано тут):

id [INT, PRIMARY]
name [VARCHAR(32)]
message [VARCHAR(255)]
created_at [INT]

MySQL команда

CREATE TABLE `chat` (
  `id` int unsigned NOT NULL AUTO_INCREMENT PRIMARY KEY,
  `name` varchar(32) NOT NULL,
  `message` varchar(255) NOT NULL,
  `created_at` int unsigned NOT NULL
) ENGINE='InnoDB';

Далее скачиваем в нашу рабочую папку файл idiorm.php c github-a: https://raw.githubusercontent.com/j4mie/idiorm/master/idiorm.php

Теперь создаем файл нашего чата, пусть будет chat.php, и подключаем в нем idiorm

<?php
include 'idiorm.php';

Теперь добавляем ниже подключение к нашей базе данных, тут нужно заменить my_database, database_user и database_password на Ваши данные (в моем случае это будет sandbox и mysql/mysql).

<?php
include 'idiorm.php';

ORM::configure('mysql:host=localhost;dbname=my_database'); // название бд
ORM::configure('username', 'database_user'); // имя пользователя для доступа к бд
ORM::configure('password', 'database_pass'); // пароль для доступа к бд

// устанавливаем кодировку
ORM::configure('driver_options', array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8'));

Вот и все, можно приступать к написанию чата, добавляем форму ввода сообщения

<?php
include 'idiorm.php';
ORM::configure('mysql:host=localhost;dbname=sandbox'); // название бд 
ORM::configure('username', 'mysql'); // имя пользователя для доступа к бд
ORM::configure('password', 'mysql'); // пароль для доступа к бд 

// устанавливаем кодировку 
ORM::configure('driver_options', array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8'));

?>
<!doctype html>
<html>
<head>
    <title>Chat</title>
    <style>
        .form-group {margin:5px 0;}
        .form-group .form-control {display:block; margin-bottom:5px;}
    </style>
</head>
<body>
    <form action="?" method="post">
        <div class="form-group">
            <label for="name" class="form-control">Имя</label>
            <input type="text" name="name" class="form-control" value="">
        </div>
        <br>
        <div class="form-group">
            <label for="message" class="form-control">Сообщение</label>
            <input type="text" name="message" value="" class="form-control">
            <input type="submit" value="Отправить" class="form-control">
        </div>
    </form>
</body>
</html>

Форма для ввода есть, теперь научим ее оставлять имя, после отправки формы.

<?php
include 'idiorm.php';
ORM::configure('mysql:host=localhost;dbname=sandbox'); // название бд 
ORM::configure('username', 'mysql'); // имя пользователя для доступа к бд
ORM::configure('password', 'mysql'); // пароль для доступа к бд 

// устанавливаем кодировку 
ORM::configure('driver_options', array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8'));

// вытягиваем переменную из массива $_REQUEST, если такая существует, 
// иначе возвращаем значение $default
function getRequestVar($var, $default=null) {
    return isset($_REQUEST[$var]) 
           ? trim($_REQUEST[$var])
           : $default
    ;
}

// Экранируем вывод
function esc($str){
    return htmlspecialchars($str, ENT_QUOTES | ENT_IGNORE);
}

?>
<!doctype html>
<html>
<head>
    <title>Chat</title>
    <style>
        .form-group {margin:5px 0;}
        .form-group .form-control {display:block; margin-bottom:5px;}
    </style>
</head>
<body>
    <form action="?" method="post">
        <div class="form-group">
            <label for="name" class="form-control">Имя</label>
            <input type="text" name="name" class="form-control" value="<?=esc(getRequestVar('name'))?>">
        </div>
        <br>
        <div class="form-group">
            <label for="message" class="form-control">Сообщение</label>
            <input type="text" name="message" value="" class="form-control">
            <input type="submit" value="Отправить" class="form-control">
        </div>
    </form>
</body>
</html>

Теперь, ловим данные из формы и сохраняем новую запись в базу данных.

<?php
include 'idiorm.php';
ORM::configure('mysql:host=localhost;dbname=sandbox'); // название бд 
ORM::configure('username', 'mysql'); // имя пользователя для доступа к бд
ORM::configure('password', 'mysql'); // пароль для доступа к бд 

// устанавливаем кодировку 
ORM::configure('driver_options', array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8'));

// вытягиваем переменную из массива $_REQUEST, если такая существует, 
// иначе возвращаем значение $default
function getRequestVar($var, $default=null) {
    return isset($_REQUEST[$var]) 
           ? trim($_REQUEST[$var])
           : $default
    ;
}

// Экранируем вывод
function esc($str){
    return htmlspecialchars($str, ENT_QUOTES | ENT_IGNORE);
}

if (getRequestVar('name') && getRequestVar('message')) { // Если пришло имя и сообщение
    $record  = ORM::for_table('chat')->create(); // создаем объект, таблицы chat
    $record->name = getRequestVar('name'); // записываем в него значение, в поле name
    $record->message = getRequestVar('message'); // записываем в него значение, в поле message
    $record->created_at = time(); // записываем в него время, в поле created_at
    $record->save(); // сохраняем новую запись в базу данных
    header('Location:?name='.urlencode(getRequestVar('name')));
}

?>
<!doctype html>
<html>
<head>
    <title>Chat</title>
    <style>
        .form-group {margin:5px 0;}
        .form-group .form-control {display:block; margin-bottom:5px;}
    </style>
</head>
<body>
    <form action="?" method="post">
        <div class="form-group">
            <label for="name" class="form-control">Имя</label>
            <input type="text" name="name" class="form-control" value="<?=esc(getRequestVar('name'))?>">
        </div>
        <br>
        <div class="form-group">
            <label for="message" class="form-control">Сообщение</label>
            <input type="text" name="message" value="" class="form-control">
            <input type="submit" value="Отправить" class="form-control">
        </div>
    </form>
</body>
</html>

Осталось вывести сообщения в обратном порядке по времени, это и добавляем

<?php
include 'idiorm.php';
ORM::configure('mysql:host=localhost;dbname=sandbox'); // название бд 
ORM::configure('username', 'mysql'); // имя пользователя для доступа к бд
ORM::configure('password', 'mysql'); // пароль для доступа к бд 

// устанавливаем кодировку 
ORM::configure('driver_options', array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8'));

// вытягиваем переменную из массива $_REQUEST, если такая существует, 
// иначе возвращаем значение $default
function getRequestVar($var, $default=null) {
    return isset($_REQUEST[$var]) 
           ? trim($_REQUEST[$var])
           : $default
    ;
}

// Экранируем вывод
function esc($str){
    return htmlspecialchars($str, ENT_QUOTES | ENT_IGNORE);
}

if (getRequestVar('name') && getRequestVar('message')) { // Если пришло имя и сообщение
    $record  = ORM::for_table('chat')->create(); // создаем объект, таблицы chat
    $record->name = getRequestVar('name'); // записываем в него значение, в поле name
    $record->message = getRequestVar('message'); // записываем в него значение, в поле message
    $record->created_at = time(); // записываем в него время, в поле created_at
    $record->save(); // сохраняем новую запись в базу данных
    header('Location:?name='.urlencode(getRequestVar('name')));
}

$chatHistory = ORM::for_table('chat') // обращаемся к таблице chat
               ->order_by_desc('created_at') // сортируем в обратном порядке по времени
               ->limit(25)   // ограничиваем вывод до 25 последних записей
               ->find_many() // запрашиваем все найденные записи
;

?>
<!doctype html>
<html>
<head>
    <title>Chat</title>
    <style>
        .form-group {margin:5px 0;}
        .form-group .form-control {display:block; margin-bottom:5px;}
        hr {margin: 10px 0;}
        .chat-record {border-bottom:1px dotted silver; padding: 5px 0; margin: 5px 0px;}
    </style>
</head>
<body>
    <form action="?" method="post">
        <div class="form-group">
            <label for="name" class="form-control">Имя</label>
            <input type="text" name="name" class="form-control" value="<?=esc(getRequestVar('name'))?>">
        </div>
        <br>
        <div class="form-group">
            <label for="message" class="form-control">Сообщение</label>
            <input type="text" name="message" value="" class="form-control">
            <input type="submit" value="Отправить" class="form-control">
        </div>
    </form>
    <?php if ($chatHistory):?>
        <hr>
        <?php foreach($chatHistory as $record):?>
            <div class="chat-record">
                [<?=esc(date('d.m.y H:i', $record->created_at))?>]
                <?=esc($record->name)?> &rarr;
                <?=esc($record->message)?>
            </div>
        <?php endforeach;?>
    <?php endif;?>
</body>
</html>

Вот и все, как видите работать с базой данных с помощью Idiorm очень просто название полей объекта соответствуют названиям полей таблицы. Запросы писать не нужно. Экранирование данных ORM так же берет на себя.

Если выбросить html код и функции улучшения, то создать запись можно так:

$record  = ORM::for_table('chat')->create(); // chat = имя таблицы
$record->name = 'Вася';
$record->message = 'Привет мир';
$record->created_at = time();
$record->save();

Правда просто? Получить записи в виде объектов так:

$chatHistory = ORM::for_table('chat')
               ->order_by_desc('created_at')
               ->limit(25)
               ->find_many()
;

либо, если с объектами пока туго, то можно и в виде массива

$chatHistory = ORM::for_table('chat')
               ->order_by_desc('created_at')
               ->limit(25)
               ->find_array()
;

Найти запись по id и изменить в ней данные (например имя) , можно так

// найти можно так
$record = ORM::for_table('chat')->find_one(5);

// или вот так
$record = ORM::for_table('chat')->find_one(['id'=>5]);

// или вот так
$record = ORM::for_table('chat')->where('id', 5)->find_one();

// или вот так
$record = ORM::for_table('chat')->where(['id'=>5])->find_one();

// теперь редактируем запись

if ($record) {
    $record->name = 'Петя';
    $record->save();
}

Больше примеров про выборку записей можно найти в справке, в разделе Querying: http://idiorm.readthedocs.io/en/latest/querying.html
А про создание/редактирование/удаление записей, в разделе Models: http://idiorm.readthedocs.io/en/latest/models.html

В общем, как видите, работать с базами данных проще простого 🙂

P.S. Если, у Вас остались вопросы, пишите в комментарии. Если Вам ничего не понятно, пишите в комментарии. Если было бы удобнее вместо статьи, посмотреть видео в youtube, то напишите в комментариях "хочу видео урок в ютубе".

Тэги: idiormmysqlormphp

Комментарии (0)