Пример создания простого приложения на 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 с такими полями (как это сделать написано тут):
1 2 3 4 5 6 |
id [INT, PRIMARY] name [VARCHAR(32)] message [VARCHAR(255)] created_at [INT] |
MySQL команда
1 2 3 4 5 6 7 8 |
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
1 2 3 4 |
<?php include 'idiorm.php'; |
Теперь добавляем ниже подключение к нашей базе данных, тут нужно заменить my_database, database_user и database_password на Ваши данные (в моем случае это будет sandbox и mysql/mysql).
1 2 3 4 5 6 7 8 9 10 11 |
<?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')); |
Вот и все, можно приступать к написанию чата, добавляем форму ввода сообщения
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
<?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> |
Форма для ввода есть, теперь научим ее оставлять имя, после отправки формы.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
<?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> |
Теперь, ловим данные из формы и сохраняем новую запись в базу данных.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 |
<?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> |
Осталось вывести сообщения в обратном порядке по времени, это и добавляем
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 |
<?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)?> → <?=esc($record->message)?> </div> <?php endforeach;?> <?php endif;?> </body> </html> |
Вот и все, как видите работать с базой данных с помощью Idiorm очень просто название полей объекта соответствуют названиям полей таблицы. Запросы писать не нужно. Экранирование данных ORM так же берет на себя.
Если выбросить html код и функции улучшения, то создать запись можно так:
1 2 3 4 5 6 7 |
$record = ORM::for_table('chat')->create(); // chat = имя таблицы $record->name = 'Вася'; $record->message = 'Привет мир'; $record->created_at = time(); $record->save(); |
Правда просто? Получить записи в виде объектов так:
1 2 3 4 5 6 7 |
$chatHistory = ORM::for_table('chat') ->order_by_desc('created_at') ->limit(25) ->find_many() ; |
либо, если с объектами пока туго, то можно и в виде массива
1 2 3 4 5 6 7 |
$chatHistory = ORM::for_table('chat') ->order_by_desc('created_at') ->limit(25) ->find_array() ; |
Найти запись по id и изменить в ней данные (например имя) , можно так
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
// найти можно так $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, то напишите в комментариях "хочу видео урок в ютубе".
Author: | Tags: /
| Rating:
1 comment.
Write a comment