Вступление
Если вы хотите создать блог с использованием 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 ознакомьтесь с онлайн-документацией . Вам понравилась эта статья? Дайте нам знать ваши мысли!