Статьи

Создание простого блогового приложения с MongoDB и PHP

Вступление

Если вы хотите создать блог с использованием MongoDB и PHP, эта статья научит вас:

  • Подключиться к базе данных MongoDB
  • Сохранить документы в коллекции
  • Запрос документов в коллекции
  • Выполнять запросы диапазона
  • Сортировка документов, обновление документа, удаление одного или нескольких документов из коллекции.

Причина, по которой я выбрал создание блогового приложения, заключается в том, что оно является базовым CRUD-приложением и очень подходит для упрощения разработки на PHP и MongoDB. Мы создадим простой пользовательский интерфейс, используя Bootstrap с простыми текстовыми полями и кнопками. База данных MongoDB будет хранить весь контент. Вы можете скачать полный исходный код с github , посмотреть демо-версию здесь и попробовать бэкэнд демо-приложения с именем пользователя и паролем duythien .

Что такое MongoDB

Согласно официальному сайту MongoDB это база данных документов, которая обеспечивает высокую производительность, высокую доступность и простоту масштабирования. MongoDB входит в группу документов-ориентированных баз данных NoSQL. Другие подтипы баз данных NoSQL смотрите здесь .

Концепции MongoDB: базы данных, коллекции и документы

  1. База данных: MongoDB группирует данные в базы данных так же, как и большинство реляционных баз данных. Если у вас есть опыт работы с реляционными базами данных, вы должны думать об этом точно так же. В СУБД база данных представляет собой набор таблиц, хранимых процедур, представлений и т. Д. В MongoDB база данных представляет собой набор коллекций. База данных MongoDB содержит одну или несколько коллекций. Например, база данных для блогового приложения с именем blog обычно может содержать коллекции статей, авторов, комментариев, категорий и т. Д.

  2. Коллекция: коллекция является эквивалентом таблицы RDBMS. Коллекция существует в одной базе данных. Коллекции не применяют схему. Документы в коллекции могут иметь разные поля. Как правило, все документы в коллекции имеют аналогичное или связанное назначение.

  3. Документы: запись в коллекции MongoDB и базовая единица данных в MongoDB. Документы аналогичны объектам JSON, но существуют в базе данных в формате с большим количеством типов, известным как BSON . Документ содержит набор полей или пар ключ-значение. Лучший способ думать о документе — это многомерный массив. В массиве у вас есть набор ключей, которые соответствуют значениям (Document == Array) . Смотрите документы .

Установка MongoDB

MongoDB работает на большинстве платформ и поддерживает 32-битные и 64-битные архитектуры. MongoDB доступен в виде двоичного файла или пакета. В производственных средах используйте 64-битные двоичные файлы MongoDB. Этот раздел будет посвящен установке на Ubuntu Linux и Windows. Для других операционных систем, пожалуйста, смотрите их документацию.

Вот как Mongo устанавливается в Ubuntu Linux. Откройте терминал и выполните следующее:

sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 7F0CEB10 # echo 'deb http://downloads-distro.mongodb.org/repo/ubuntu-upstart dist 10gen' | sudo tee /etc/apt/sources.list.d/mongodb.list 

Теперь выполните следующую команду, чтобы обновить ваш репозиторий и установить последнюю стабильную версию MongoDB:

 sudo apt-get update sudo apt-get install mongodb-10gen 

Готово, вы успешно установили MongoDB. Теперь запустите и остановите сервис MongoDB через командную строку ниже.

 sudo service mongodb start sudo service mongodb stop 

В случае ошибки запуска попробуйте выполнить следующую команду:

 sudo mongod --fork --logpath /var/log/mongodb/mongodb.log #or sudo mongod -f /etc/mongodb.conf 

Ниже описано, как установить его в Windows:

Перейдите на страницу загрузки на официальном сайте MongoDB. Нажмите на ссылку для загрузки последней стабильной версии под Windows.

После завершения загрузки извлеките и переместите его в C:\ . MongoDB требует папку данных, в которой хранятся ее файлы. Расположение по умолчанию для каталога данных MongoDB — C: \ data \ db. Если его не существует, создайте его.

Чтобы запустить MongoDB, выполните из командной строки

 C:\> cd \mongodb\bin C:\mongodb\bin> mongod 

Готово, вы успешно установили MongoDB. Теперь запустите и остановите сервис MongoDB через командную строку ниже.

 net start MongoDB net stop MongoDB 

Установка драйвера PHP для MongoDB

Сервер MongoDB уже создан для работы с вашим текущим веб-сервером, но не с PHP. Чтобы заставить PHP общаться с сервером MongoDB, нам понадобится драйвер PHP-MongoDB. Это библиотека расширений PHP.

Если вы используете Linux, установите его легко через:

 sudo pecl install mongo 

Добавьте extension=mongo.so строки extension=mongo.so в конфигурацию php.ini, и все extension=mongo.so :

 sudo -i echo 'extension=mongo.so' >> /etc/php5/apache2/php.ini 

Перезапустите ваш веб-сервер и проверьте с помощью командной строки:

 php -i |grep "mongo" php --re mongo 

Установка драйвера в Windows

Давайте попробуем установить драйвер на машине с Windows, работающей под управлением PHP 5.4 на Apache (XAMPP):

  1. Загрузите ZIP-архив https://github.com/mongodb/mongo-php-driver/downloads на свой компьютер и распакуйте его.
  2. Скопируйте файл php_mongo.dll из извлеченной папки в каталог расширений PHP (C: \ xampp \ php \ ext).
  3. Откройте файл php.ini внутри вашей установки PHP и добавьте следующую строку: extension = php_mongo.dll
  4. Сохраните файл и закройте его. Перезапустите XAMP.
  5. Откройте ваш текстовый редактор и добавьте следующий код в новый файл: <?php phpinfo();?> , Сохраните файл как phpinfo.php внутри DocumentRoot веб-сервера Apache (htdocs) и откройте скрипт PHP в браузер. Если вы видите монго в информации PHP, установка прошла успешно.

Mongo Web Development с PHP

Подключение к серверу базы данных MongoDB

Подключение к MongoDB из PHP очень похоже на подключение к любой другой базе данных. Хост по умолчанию — localhost, а порт по умолчанию — 27017.

 $connection = new Mongo(); 

Подключение к удаленному хосту с дополнительным настраиваемым портом и авторизацией:

 $connecting_string = sprintf('mongodb://%s:%d/%s', $hosts, $port,$database), $connection= new Mongo($connecting_string,array('username'=>$username,'password'=>$password)); 

Выбор базы данных

Как только соединение с сервером базы данных будет установлено, мы будем использовать его для доступа к базе данных. Определенный способ сделать это:

 $dbname = $connection->selectDB('dbname'); 

Основы (операции CRUD)

MongoDB предоставляет богатую семантику для чтения и манипулирования данными. CRUD означает создание, чтение, обновление и удаление. Эти термины являются основой для всех взаимодействий с базой данных.

Создание / Выбор Коллекции

Выбор и создание коллекции очень похожи на доступ и создание базы данных. Если коллекция не существует, она создается:

 $collection = $dbname->collection; //or $collection = $dbname->selectCollection('collection'); 

Например, это создает коллекцию «записей» в моем блоге:

 $posts = $dbname->posts 

Создание документа

Создание документа в MongoDB не может быть проще. Создать массив. Передайте его в метод вставки объекта коллекции

 $post = array( 'title' => 'What is MongoDB', 'content' => 'MongoDB is a document database that provides high performance...', 'saved_at' => new MongoDate() ); $posts->insert($post); 

Метод insert() сохраняет данные в коллекции. Массив $post автоматически получает поле с именем _id , которое является автоматически сгенерированным уникальным ObjectId вставленного документа BSON. Вы также можете использовать метод save() , который поддерживает — обновляет существующую запись или создает новую, если она не существует.

Чтение документа

Чтобы получить данные из коллекции, я использую метод find() , который получает все данные в коллекции. findOne() возвращает только один документ, который удовлетворяет заданным критериям запроса. Следующие примеры покажут вам, как запросить одну или несколько записей.

      // all records $result =  $posts :: find (); 
     // one record $id =   '52d68c93cf5dc944128b4567' ; $results =  $posts :: findOne ( array ( '_id'   =>   new   MongoId ( $id ))); 

Обновление документа

Изменяет существующий документ или документы в коллекции. По умолчанию метод update() обновляет один документ. Если для параметра multi задано значение true, метод обновляет все документы, которые соответствуют критериям запроса.

  $id =   '52d68c93cf5dc944128b4567' ; $posts -> update ( array ( '_id'       =>   new   MongoId ( $id )), array ( '$set'      =>  array ( title ' => ' What   is  phalcon ')) ); 

Метод update () принимает два параметра. Первый — это критерии описания объектов для обновления, а второй — объект, с помощью которого обновляются соответствующие записи. Существует также третий необязательный параметр, с помощью которого вы можете передать массив опций.

Мини блог

Структуру проекта мы будем строить:

      |------- admin |------ index . php # This is dashboard 
             |------ auth . php |------- view |------ admin |------- create . view . php #form create article 
                     |------- dashbroad . view . php |------ index . view . php |------ layout . php #This is main layout it will be shown for every action executed within the app 
             |------ single . view . php # This is view for a single article 
     |------- config . php # Define paramater database, url 
     |------- app . php # Include multi-php files 
     |------- db . php # Container class db 
     |------- index . php |------- single . php |------- static                                # Container css,js... 
                 |----- css |----- js |------- vendor |---- markdown # Library converts markdown into html 

Прежде чем мы начнем с нашего фактического кода PHP, нам нужно создать наши файлы и папки, как указано выше.

config.php

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

      <? php define ( 'URL' ,   'http://duythien.dev/sitepoint/blog-mongodb' ); define ( 'UserAuth' ,   'duythien' ); define ( 'PasswordAuth' ,   'duythien' ); $config =  array ( 
             'username'   =>   'duythien' , 
             'password'   =>   'qazwsx2013@' , 
             'dbname'     =>   'blog' , 
             'connection_string' =>  sprintf ( 'mongodb://%s:%d/%s' , '127.0.0.1' , '27017' , 'blog' ) 
         ); 

где мы определяем параметры UserAuth и PasswordAuth для защиты папки администратора через HTTP-аутентификацию. Здесь мы используем HTTP-аутентификацию для простоты, поскольку центральная тема статьи связана с подключением к MongoDB — обычно вы используете какой-то приличный фреймворк с ACL для построения контроля доступа.

app.php:

      <? php include 'config.php' ; include 'layout.php' ; include 'db.php' ; 

     use   Blog \DB , 
         Blog \Layout ; 

     // Constructor to the db $db =   new  DB\DB ( $config ); 

     // Constructor to layout view $layout =   new   Layout \Layout (); 

админ

Это папка, содержащая код CRUD.

 <? php require_once 'auth.php' ; require_once '../app.php' ; require_once '../vendor/markdown/Markdown.inc.php' ; 
 use  \Michelf\MarkdownExtra , \Michelf\Markdown ; 

 if   (( is_array ( $_SESSION )   &&  $_SESSION [ 'username' ]   ==   UserAuth ))   { $data =  array (); $status =   ( empty ( $_GET [ 'status' ]))   ?   'dashboard'   :  $_GET [ 'status' ]; 
     switch   ( $status )   { 
         //create post 
         case   'create' : 
             break ; 
         //edit post 
         case   'edit' : 
             break ; 
         //delete post 
         case   'delete' : 
             //display all post in dashboard 
         default : $currentPage =   ( isset ( $_GET [ 'page' ]))   ?   ( int ) $_GET [ 'page' ]   :   1 ; $data =  $db -> get ( $currentPage ,   'posts' ); $layout -> view ( 'admin/dashboard' ,  array ( 
                 'currentPage'   =>  $data [ 0 ], 
                 'totalPages'   =>  $data [ 1 ], 
                 'cursor'   =>  $data [ 2 ] 
             )); 
             break ; 
     } 
 } 

Полный файл index.php смотрите здесь . Выше я использовал функцию представления в классе layout.php которая автоматически загружает dashboard.view.php .

 <? php namespace   Blog \Layout ; 

 Class   Layout 
 { 

     /** * @var array */ 
     public  $data ; 

     public   function  view ( $path ,  $data ) 
     { 
         if   ( isset ( $data ))   { extract ( $data ); 
         } $path .=   '.view.php' ; include "views/layout.php" ; 
     } 
 } 

Состояние параметра GET соответствует действию CRUD. Например, когда статус «создать»:

 if   ( $_SERVER [ 'REQUEST_METHOD' ]   ===   'POST' )   { $article =  array (); $article [ 'title' ]   =  $_POST [ 'title' ]; $article [ 'content' ]   =   Markdown :: defaultTransform ( $_POST [ 'content' ]); $article [ 'saved_at' ]   =   new   MongoDate (); 

     if   ( empty ( $article [ 'title' ])   ||  empty ( $article [ 'content' ]))   { $data [ 'status' ]   =   'Please fill out both inputs.' ; 
     }   else   { 

 // then create a new row in the collection posts $db -> create ( 'posts' ,  $article ); $data [ 'status' ]   =   'Row has successfully been inserted.' ; 
     } 
 } $layout -> view ( 'admin/create' ,  $data ); 

Представление функций view('admin/create', $data) показывает HTML-форму, в которой пользователь может записать заголовок / содержимое нового сообщения в блоге, или сохранить данные, отправленные пользователем, в MongoDB. По умолчанию скрипт отображает следующую HTML-форму:

 <form   action = ""   method = "post" > 
     <div><label   for = "Title" > Title </label> 
         <input   type = "text"   name = "title"   id = "title"   required = "required" /> 
     </div> 
     <label   for = "content" > Content </label> 

     <p><textarea   name = "content"   id = "content"   cols = "40"   rows = "8"   class = "span10" ></textarea></p> 

     <div   class = "submit" ><input   type = "submit"   name = "btn_submit"   value = "Save" /></div> 
 </form> 

create post

Далее давайте посмотрим на db.php , который можно найти в полном объеме здесь

 <? php namespace   Blog \DB ; 

 class  DB { 

     /** * Return db * @var object */ 
     private  $db ; 

     /** * Results limit. * @var integer */ 
     public  $limit =   5 ; 


     public   function  __construct ( $config ) 
     { $this -> connect ( $config ); 
     } 

     //connecting mongodb 
     private   function  connect ( $config ) 
     { 
     } 

     //get all data 
     public   function   get ( $page ,  $collection ) 
     { 
     } 

     //get one data by id 
     public   function  getById ( $id ,  $collection ) 
     { 
     } 

     //create article 
     public   function  create ( $collection ,  $article ) 
     { 
     } 

     //delete article by id 
     public   function   delete ( $id ,  $collection ) 
     { 
     } 

     //update article 
     public   function  update ( $id ,  $collection ,  $acticle ) 
     { 
     } 

     //create and update comment 
     public   function  commentId ( $id ,  $collection ,  $comment ) 
     { 
     } 
 } 

Курсор MongoDB упрощает разбиение на страницы. Эти методы курсора могут быть связаны с объектом курсора, который находит возвраты и друг с другом. Комбинирование лимита с пропуском делает пагинацию легкой Они также могут быть объединены с заказом. Например.

      public   function   get ( $page , $collection ){ $currentPage =  $page ; $articlesPerPage =  $this -> limit ; 

         //number of article to skip from beginning $skip =   ( $currentPage -   1 )   *  $articlesPerPage ; $table =  $this -> db -> selectCollection ( $collection ); $cursor =  $table -> find (); 

         //total number of articles in database $totalArticles =  $cursor -> count ();  

         //total number of pages to display $totalPages =   ( int )  ceil ( $totalArticles /  $articlesPerPage ); $cursor -> sort ( array ( 'saved_at'   =>   - 1 ))-> skip ( $skip )-> limit ( $articlesPerPage ); $data = array ( $currentPage , $totalPages , $cursor ); 

     return  $data ; 
 } 

index.php : файлы шаблонов можно найти в папке просмотра; такой как index.view.php . Вот пример index.php :

 <? php require   'app.php' ; 

 try   { $currentPage =   ( isset ( $_GET [ 'page' ]))   ?   ( int ) $_GET [ 'page' ]   :   1 ;   //current page number $data =  $db -> get ( $currentPage ,   'posts' ); $layout -> view ( 'index' ,  array ( 
         'currentPage'   =>  $data [ 0 ], 
         'totalPages'   =>  $data [ 1 ], 
         'cursor'   =>  $data [ 2 ], 
         'name'   =>   'Duy Thien' 
     )); 
 }   catch   ( Exception  $e )   { echo 'Caught exception: ' ,  $e -> getMessage (),   "\n" ; 
 } 

Откройте браузер и перейдите по http://duythien.dev/sitepoint/blog-mongodb . В нем перечислены все текущие статьи в блоге:

index all posts

single.php : при просмотре одной страницы поста (нажмите «Читать дальше») вы просматриваете single.view.php в папке представлений. Вот логика single.php :

 <? php require   'app.php' ; 
 // Fetch the entire post $post =  $db -> getById ( $_GET [ 'id' ],   'posts' ); 
 if   ( $post )   { $layout -> view ( 'single' ,  array ( 
         'article'   =>  $post )); 
 }   

Этот файл получает _id статьи в качестве параметра HTTP GET. Мы вызываем метод findOne() для коллекции статей, отправляя значение _id в качестве параметра метода. Метод findOne() используется для извлечения одного документа. Смотрите функцию getById() в файле db.php

single posts

Введите произвольное имя и адрес электронной почты в поля ввода под разделом комментариев, также поместите текст в текстовое поле. Затем нажмите кнопку Сохранить, и страница перезагрузится с комментарием, который вы только что опубликовали. Вот как выглядит comment.php :

 <? php require   'app.php' ; 

 if   ( $_SERVER [ 'REQUEST_METHOD' ]   ===   'POST' )   { $id =  $_POST [ 'article_id' ]; $comment =  array ( 
         'name'   =>  $_POST [ 'fName' ], 
         'email'   =>  $_POST [ 'fEmail' ], 
         'comment'   =>  $_POST [ 'fComment' ], 
         'posted_at'   =>   new   MongoDate () 
     ); $status =  $db -> commentId ( $id ,   'posts' ,  $comment ); 

     if   ( $status ==  TRUE )   { header ( 'Location: single.php?id='   .  $id ); 
     } 
 } 

Комментарии к статье хранятся в поле массива comments имени документа. Каждый элемент комментария является встроенным документом, который содержит несколько полей.

Вывод

В этой статье мы рассмотрели базовое введение CRUD в PhP с MongoDB. Мы даже создали своего рода очень примитивную MVC в процессе (см. Полное приложение на Github ). Это зависит от вас, чтобы использовать надлежащую структуру, реализовать аутентификацию помимо простой HTTP-аутентификации, использованной здесь, и добавить больше функциональности, но основы на месте, и вы можете взломать это демонстрационное приложение для вашего сердца.

Для получения дополнительной информации о MongoDB ознакомьтесь с онлайн-документацией . Вам понравилась эта статья? Дайте нам знать ваши мысли!