Вступление
Если вы хотите создать блог с использованием MongoDB и PHP, эта статья научит вас:
- Подключиться к базе данных MongoDB
 - Сохранить документы в коллекции
 - Запрос документов в коллекции
 - Выполнять запросы диапазона
 - Сортировка документов, обновление документа, удаление одного или нескольких документов из коллекции.
 
Причина, по которой я выбрал создание блогового приложения, заключается в том, что оно является базовым CRUD-приложением и очень подходит для упрощения разработки на PHP и MongoDB. Мы создадим простой пользовательский интерфейс, используя Bootstrap с простыми текстовыми полями и кнопками. База данных MongoDB будет хранить весь контент. Вы можете скачать полный исходный код с github , посмотреть демо-версию здесь и попробовать бэкэнд демо-приложения с именем пользователя и паролем duythien .
Что такое MongoDB
Согласно официальному сайту MongoDB это база данных документов, которая обеспечивает высокую производительность, высокую доступность и простоту масштабирования. MongoDB входит в группу документов-ориентированных баз данных NoSQL. Другие подтипы баз данных NoSQL смотрите здесь .
Концепции MongoDB: базы данных, коллекции и документы
- 
База данных: MongoDB группирует данные в базы данных так же, как и большинство реляционных баз данных. Если у вас есть опыт работы с реляционными базами данных, вы должны думать об этом точно так же. В СУБД база данных представляет собой набор таблиц, хранимых процедур, представлений и т. Д. В MongoDB база данных представляет собой набор коллекций. База данных MongoDB содержит одну или несколько коллекций. Например, база данных для блогового приложения с именем blog обычно может содержать коллекции статей, авторов, комментариев, категорий и т. Д.
 - 
Коллекция: коллекция является эквивалентом таблицы RDBMS. Коллекция существует в одной базе данных. Коллекции не применяют схему. Документы в коллекции могут иметь разные поля. Как правило, все документы в коллекции имеют аналогичное или связанное назначение.
 - 
Документы: запись в коллекции 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):
- Загрузите ZIP-архив https://github.com/mongodb/mongo-php-driver/downloads на свой компьютер и распакуйте его.
 - Скопируйте файл php_mongo.dll из извлеченной папки в каталог расширений PHP (C: \ xampp \ php \ ext).
 - Откройте файл php.ini внутри вашей установки PHP и добавьте следующую строку: extension = php_mongo.dll
 - Сохраните файл и закройте его. Перезапустите XAMP.
 -   Откройте ваш текстовый редактор и добавьте следующий код в новый файл: 
<?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> 
  Далее давайте посмотрим на 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 .  В нем перечислены все текущие статьи в блоге: 
  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 
  Введите произвольное имя и адрес электронной почты в поля ввода под разделом комментариев, также поместите текст в текстовое поле.  Затем нажмите кнопку Сохранить, и страница перезагрузится с комментарием, который вы только что опубликовали.  Вот как выглядит 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 ознакомьтесь с онлайн-документацией . Вам понравилась эта статья? Дайте нам знать ваши мысли!


