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


mongodb php создание счетчика для сообщений в блоге

Это должна быть общая проблема, но я новичок в mongodb и php, поэтому, пожалуйста, несите меня :-).

Я создаю сайт blogpost и намеревался предоставить уникальный blogId для каждого блога, и пользователь может получить доступ к https://www.sitename.com/blogID.

Я храню счетчик (как целое число) в mongodb и увеличиваю его, когда кто-то публикует свой блог:

Он работает нормально до сих пор, но что, если более одного пользователя попытаются опубликовать блог одновременно, он может обеспечить одинаковые $ count для нескольких пользователей.

Как я могу устранить эту проблему? Благодарю.

Ваша проблема заключается в том, что вы хотите создать уникальный идентификатор и убедиться, что он не используется повторно, даже если есть параллельный доступ к базе данных.

В MongoDB вы делаете это с помощью команды findAndModify(). См. Здесь рецепт о том, как это сделать с MongoDB:

См. Здесь для получения дополнительной информации о findAndModify():

MongoDB и PHP простой вход

Я новичок в mongoDb и PHP.
Я пытаюсь создать простую страницу входа в систему, которая будет принимать пользовательский ввод из текстовых полей и искать в базе данных, если запись существует.

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

Если кто-то может вести меня в направлении обряда. Я просмотрел различные учебники онлайн, но не смог получить то, что мне нужно.

Я не уверен, как взять пользовательский ввод из текстовых полей и запросить базу данных.

Спасибо вам за помощь

Решение

Чтобы получить имя пользователя и пароль из пользовательского ввода, вам нужно сделать что-то вроде ниже;

Getting Started with MongoDB and PHP

За последний год произошла небольшая революция в мире СУБД, связанная с появлением безсхемных (безструктурных) СУБД таких как Apache CouchDB. В этих базах данных используется другой подход нежели в реляционных БД. Они достаточно быстро становятся популярны среди Web-разрабочиков из-за своей гибкости, простоты и легкой интеграции с современными технологиями такими как JSON.
В данной статье изложен краткий обзор MongoDB, одной из новых поколений безсхемных СУБД, которая получила большое внимание разработчиков.

Start Me Up
На официальном сайте MongoDB написано, что это расширяемая, высокопроизводительная, документоориентированная БД с открытым исходным кодом. Существует под большое количество платформ и распространяется под лицензией GNU AGPL.
Хотя MongoDB и похожа на CouchDB, между ними существуют серьезные различия:

  • Разработчики MongoDB должны использовать встроенные в язык драйверы (native language drivers) для доступа к БД, в то время как для CouchDB используется REST
  • MongoDB поддерживает большее количество типов данных
  • Масштабируемость MongoDB строится на основе технологии sharding (русского аналога нет, оставил на английском), в то время как для CouchDB — это репликация.
  • Запросы MongoDB используют объекты BSON, в то время как запросы CouchDB генерируются с помощью Javascript.

Документация MongoDB детально описывается все эти (и немного больше) различия, также имеются тесты сравнивающие MongoDB, CouchDB и MySQL (еще один повод для holy war).
Беглый обзор закончен, время для скачивания и установки MongoDB. В большинстве случаев стандартного бинарного пакеат хватает; он содержит MongoDB и клиент, работающий из командной строки, набор утилит для бэкапа, восстановления, а также сохранения и получения бинарных фалов. Для начала скачаем подходящую версию для вашей системы:
shell> cd /usr/local
shell> tar -xzvf mongodb-linux-i686-1.4.2.tgz
shell> ln -s mongodb-linux-i686-1.4.2 mongo
Если у вас Ubuntu, вы можете установить MongoDB используя aptitude. Для этого добавьте в /etc/apt/sources.list следующую строку:
deb downloads.mongodb.org/distros/ubuntu 10.4 10gen
Затем установите этот пакет используя aptitude:
shell> aptitude update
shell> aptitude install mongodb-stable
Когда пакет установлен запустите MongoDB сервер
shell> mkdir /usr/local/mongo/data
shell> /usr/local/mongo/bin/mongod —dbpath=/usr/local/mongo/data

Заметьте, что по умолчанию, сервер MongoDB server считает что данные сохраняются в /data/db, и заканчивает выполнение, если не находит этого пути. Параметр —dbpath позволяет указать другой путь.
Вы можете использовать командную строку для доступа к серверу, как это показано ниже:
shell>/usr/local/mongo/mongo
Вот как это выглядит:

Можно отдавать команды серверу, также как и в MySQL-клиенте. Ниже пример, который показывает версию сервера и доступные БД:

>show dbs
admin
local
>db.version()
1.4.2
>db.stats()
<
«collections» : 0,
«objects» : 0,
«dataSize» : 0,
«storageSize» : 0,
«numExtents» : 0,
«indexes» : 0,
«indexSize» : 0,
«ok» : 1
>

* This source code was highlighted with Source Code Highlighter .

Collecting Ideas
Во вселенной MongoDB, эквивалентом таблицы является «коллекция». Подобно тому, как таблицы имеют множество записей, в коллекциях — множество «документов». Эти документы представлены как JSON объекты, с полями и значениями представляющими пары ключ-значение, и сохраненные (сериализованы) в BSON (Binary JSON) для хранения. Ниже пример одного такого документа:
<
«orderDate»: «10-05-2010»,
«orderTotal»: 468.99,
>
Так как основной элекмент MongoDB это документ в формате JSON, а JSON поддерживает иерархические данные, вы можете включать один документ в другой. Далее, так как документы сериализуются в формат BSON для хранения, MongoDB может легко искать вложенные документы. Ниже пример:
<
«orderDate»: «10-05-2010»,
«orderTotal»: 468.99,
«shipTo»:
<
«street»: «17 Hill View»,
«zip»: «12345»,
«country»: «US»
>
>
Для создания новой MongoDB коллекции, запустите клиент в командной строке и выполните следующие команды, которые создадут коллекцию под названием items» и добавят несколько документов:

Продолжаем дальше, добавьте еще документов как показано выше. Для отображения полного спика документов в коллекции вызовите метод find() без аргументов:

Заметьте, специальный ключ ‘_id’ есть у каждого документа. Когда вы записываете новый документ в коллекцию, MongoDB автоматически добавляет уникальный идентификатор к каждому документу. Этот идентификатор может быть использован для получения или модификации документа, это некое подобие автоинкрементного ключа в реляционных базах данных.
Для отображения списка документов по какому-либо критерию, добавьте этот критерий (в виде объекта JSON) в метод find(). Ниже пример, показывающий записи с количеством большим 9 и ценой меньше 1:

Теперь давайте попробуем написать что-нибудь на php!

Hooking Things Up
Поддержка MongoDB в PHP реализована посредством расширения, которое обеспечивает API для доступа к коллекциям MongoDB. Это расширение разрабатывается Kristina Chodorow и бесплатно доступно в PECL под лицензией Apache License. Расширение стабильно и позволяет выполнять большинство задач, относящихся к доступу и использованию БД MongoDB database из приложений, написанных на языке PHP.
ДЛя того чтобы использовать это расширение установите его используя стандартную команду pecl
shell> pecl install mongo
Или вы можете скачать исходный код, скомпилировать его в загружаемый модуль PHP:
shell> tar -xzvf mongo-1.0.7.tar.gz
shell> cd mongo-1.0.7
shell> phpize
shell> ./configure
shell> make
shell> make install
Теперь у вас есть загружаемый PHP модуль под названием mongo.so, который находится в стандартном каталоге для модулей PHP. Подключите данное расширение в php.ini, перепустите Web-сервер и проверьте активность этого расширения командой phpinfo():

Теперь давайте посмотрим, что мы можем сделать, используя это расширение

  1. try <
  2. // open connection to MongoDB server
  3. $conn = new Mongo( ‘localhost’ );
  4. // access database
  5. $db = $conn->test;
  6. // access collection
  7. $collection = $db->items;
  8. // execute query
  9. // retrieve all documents
  10. $cursor = $collection->find();
  11. // iterate through the result set
  12. // print each document
  13. echo $cursor->count() . ‘ document(s) found.
    ‘ ;
  14. foreach ($cursor as $obj) <
  15. echo ‘Name: ‘ . $obj[ ‘name’ ] . ‘
    ‘ ;
  16. echo ‘Quantity: ‘ . $obj[ ‘quantity’ ] . ‘
    ‘ ;
  17. echo ‘Price: ‘ . $obj[ ‘price’ ] . ‘
    ‘ ;
  18. echo ‘
    ‘ ;
  19. >
  20. // disconnect from server
  21. $conn->close();
  22. > catch (MongoConnectionException $e) <
  23. die( ‘Error connecting to MongoDB server’ );
  24. > catch (MongoException $e) <
  25. die( ‘Error: ‘ . $e->getMessage());
  26. >
  27. ?>

* This source code was highlighted with Source Code Highlighter .

В начале этого скрипта инициализируется новый объект Mongo, в конструктор которого передается информация, необходимая для установки соединения с сервером MongoDB (в примере имя хоста). Даный объект используется для всех последующих взаимодействий с сервером MongoDB.
Следующим шагом является получение доступа к базе данных. Это может быть сделано используя метод selectDB() или что более проще, посредством магического метода call, обратиться к базе как к свойству объекта. Как только получен доступ к базе данных не составит особого труда получить доступ к коллекции, испольуя метод selectCollection() или посредством магического метода call, обратившись к коллекции как к свойству. Коллекции предствавлены в виде объектов MongoCollection.
У каждого объекта MongoCollection есть метод find(), который может быть использован для выполнения запросов. Метод принимает в качестве аргументов два массива: массив параметров запросаи массив полей, которые долны быть получены в результате ответа на запрос. Возвращаемым значением является курсор, представленный объектом типа MongoCursor object. Тип MongoCursor реализует (implement) шаблон Iterator, поэтому достаточно легко пробежать по всему возвращаемому набору используя foreach(). Тип MongoCursor содержит метод count(), возвращающий количество записей.
PHP расширение Mongo поддерживает модель исключений, реализованную в PHP 5.x, и определяет 5 типов исключений: MongoConnectionException для ошибок, связанных с соединением, MongoCursorException и MongoCursorTimeoutException для ошибок связанных с запросом; MongoGridFSException для ошибок связанных с файловым взаимодействием; и MongoException для всех остальных ошибок. В предыдущем примере было бы неплохой идеей заключить код в try/catch блок.
Ниже пример вывода предыдущего примера:

Addition And Subtraction
Добавление нового документа в коллекцию достаточно просто. Посмотрите следующий пример:

try <
// open connection to MongoDB server
$conn = new Mongo( ‘localhost’ );

// access database
$db = $conn->test;

// access collection
$collection = $db->items;

// insert a new document
$item = array(
‘name’ => ‘milk’ ,
‘quantity’ => 10,
‘price’ => 2.50,
‘note’ => ‘skimmed and extra tasty’
);
$collection->insert($item);
echo ‘Inserted document with ID: ‘ . $item[ ‘_id’ ];

// disconnect from server
$conn->close();
> catch (MongoConnectionException $e) <
die( ‘Error connecting to MongoDB server’ );
> catch (MongoException $e) <
die( ‘Error: ‘ . $e->getMessage());
>
?>

* This source code was highlighted with Source Code Highlighter .

Для добавление нового документа в коллекцию, создайте новый массив содержащий пару ключ-значение, которые вы хотите вставить (механизм поддерживает также вложенные массивы, которые конвертируются во встроенные документы) и передайте этот массив в метод insert объекта типа MongoCollection. Этот метод добавит документ в коллекцию и рассчитает значение ‘_id’ (уникальный идентификатор документа), которое добавится в исходный массив. Этот идентификатор представляется специальным типом MongoId, который есть шестнадцатиричное представление идентификатора. Поэтому можно легко получить идентификатор документа, не делая дополнительный запрос.
Ниже пример:

Удаление документа из коллекции осуществляется методом remove(), который принимает в качестве параметров массив критериев, и удаляет все документы соответствующие этим критериям. Обычно remove() возвращает значение типа Boolean (true или false); однако, если передать специальный ‘safe’ аргумент в качестве второго аргумента позволит получить масиив с большим количеством информации, включающей в себя количество удаленных документов. Ниже пример:

try <
// open connection to MongoDB server
$conn = new Mongo( ‘localhost’ );

// access database
$db = $conn->test;

// access collection
$collection = $db->items;

// remove a document
$criteria = array(
‘name’ => ‘milk’ ,
);
$r = $collection->remove($criteria, array( ‘safe’ => true ));
echo ‘Removed ‘ . $r[ ‘n’ ] . ‘ document(s).’ ;

// disconnect from server
$conn->close();
> catch (MongoConnectionException $e) <
die( ‘Error connecting to MongoDB server’ );
> catch (MongoException $e) <
die( ‘Error: ‘ . $e->getMessage());
>
?>

* This source code was highlighted with Source Code Highlighter .

Также возможно удалить документ, используя его идентификатор. Однако в метод remove() передается объект метода MongoId, а не строка PHP. Ниже пример:

try <
// open connection to MongoDB server
$conn = new Mongo( ‘localhost’ );

// access database
$db = $conn->test;

// access collection
$collection = $db->items;

// remove a document by ID
$criteria = array(
‘_id’ => new Mongo >’4bea96b400f4784c0a070000′ ),
);
$collection->remove($criteria);
echo ‘Removed document with ID: ‘ . $criteria[ ‘_id’ ];

// disconnect from server
$conn->close();
> catch (MongoConnectionException $e) <
die( ‘Error connecting to MongoDB server’ );
> catch (MongoException $e) <
die( ‘Error: ‘ . $e->getMessage());
>
?>

* This source code was highlighted with Source Code Highlighter .

Обновление документа происходит посредством метода save(), как показано ниже:

try <
// open connection to MongoDB server
$conn = new Mongo( ‘localhost’ );

// access database
$db = $conn->test;

// access collection
$collection = $db->items;

// retrieve existing document
$criteria = array(
‘name’ => ‘eggs’ ,
);
$doc = $collection->findOne($criteria);

// update document with new values
// save back to collection
$doc[ ‘name’ ] = ‘apples’ ;
$doc[ ‘quantity’ ] = 35;
$doc[ ‘note’ ] = ‘green apples taste sooooo good!’ ;
$collection->save($doc);

// disconnect from server
$conn->close();
> catch (MongoConnectionException $e) <
die( ‘Error connecting to MongoDB server’ );
> catch (MongoException $e) <
die( ‘Error: ‘ . $e->getMessage());
>
?>

* This source code was highlighted with Source Code Highlighter .

Заметьте, что если findOne() ничего не возвратил, вызов save() добавит новый документ.
Asking Questions
Когда заходит речь о выполнении запросов, MongoDB предлагает достаточно гибкий инструментарий. Вы уже видели метод find(), который возвращает набор документов, соответствующий критериям поиска. Также есть метод findOne(), который возвращает один документ. Можно использовать множество критериев для поиска — просто передайте в качестве критериев поиска массив в find() или findOne(), а MongoDB применит все эти критерии с модификатором AND.
Ниже пример:

try <
// open connection to MongoDB server
$conn = new Mongo( ‘localhost’ );

// access database
$db = $conn->test;

Мастер Йода рекомендует:  Устраняем типичные ошибки в MySQL

// access collection
$collection = $db->items;

// formulate AND query
$criteria = array(
‘quantity’ => 30,
‘price’ => 0.5
);

// retrieve only ‘name’ and ‘price’ keys
$fields = array( ‘name’ , ‘price’ );

// execute query
$cursor = $collection->find($criteria, $fields);

// iterate through the result set
// print each document
echo $cursor->count() . ‘ document(s) found.
‘ ;
foreach ($cursor as $obj) <
echo ‘Name: ‘ . $obj[ ‘name’ ] . ‘
‘ ;
echo ‘Price: ‘ . $obj[ ‘price’ ] . ‘
‘ ;
echo ‘
‘ ;
>

// disconnect from server
$conn->close();
> catch (MongoConnectionException $e) <
die( ‘Error connecting to MongoDB server’ );
> catch (MongoException $e) <
die( ‘Error: ‘ . $e->getMessage());
>
?>

* This source code was highlighted with Source Code Highlighter .

MongoDB также поддерживает большое количество условных и логических операторов для создания сложных запросов. Плюс к этому поддержка регулярных выражений. Ниже пример, который выводит все записи с количеством между 10 и 50 и чьи имена заканчиваются на ‘es’:

try <
// open connection to MongoDB server
$conn = new Mongo( ‘localhost’ );

// access database
$db = $conn->test;

// access collection
$collection = $db->items;

// formulate complex query
$criteria = array(
‘quantity’ => array(
‘$gt’ => 10,
‘$lt’ => 50
),
‘name’ => new MongoRegex( ‘/es$/i’ )
);

// execute query
$cursor = $collection->find($criteria);

// iterate through the result set
// print each document
echo $cursor->count() . ‘ document(s) found.
‘ ;
foreach ($cursor as $obj) <
echo ‘Name: ‘ . $obj[ ‘name’ ] . ‘
‘ ;
echo ‘Quantity: ‘ . $obj[ ‘quantity’ ] . ‘
‘ ;
echo ‘Price: ‘ . $obj[ ‘price’ ] . ‘
‘ ;
echo ‘
‘ ;
>

// disconnect from server
$conn->close();
> catch (MongoConnectionException $e) <
die( ‘Error connecting to MongoDB server’ );
> catch (MongoException $e) <
die( ‘Error: ‘ . $e->getMessage());
>
?>

* This source code was highlighted with Source Code Highlighter .

Как это будет выглядеть:

Вы можете также изменить количество возвращаемых документов или отсортировать их по необходимому ключу, используя limit() и sort() методы. Ниже пример:

try <
// open connection to MongoDB server
$conn = new Mongo( ‘localhost’ );

// access database
$db = $conn->test;

// access collection
$collection = $db->items;

// execute query
// sort by price
// limit to 3 documents
$cursor = $collection->find();
$cursor->sort(array( ‘price’ => 1))->limit(3);

// iterate through the result set
// print each document
echo $cursor->count() . ‘ document(s) found.
‘ ;
foreach ($cursor as $obj) <
echo ‘Name: ‘ . $obj[ ‘name’ ] . ‘
‘ ;
echo ‘Quantity: ‘ . $obj[ ‘quantity’ ] . ‘
‘ ;
echo ‘Price: ‘ . $obj[ ‘price’ ] . ‘
‘ ;
echo ‘
‘ ;
>

// disconnect from server
$conn->close();
> catch (MongoConnectionException $e) <
die( ‘Error connecting to MongoDB server’ );
> catch (MongoException $e) <
die( ‘Error: ‘ . $e->getMessage());
>
?>

* This source code was highlighted with Source Code Highlighter .

Между прочим, если вы ходите узнать, как внутри MongoDB выполняет запрос, вы можете использовать метод explain() объекта MongoCursor для «look inside» системы обработки запросов, очень похоже на команду EXPLAIN у MySQL. Ниже пример и результат вывода:

try <
// open connection to MongoDB server
$conn = new Mongo( ‘localhost’ );

// access database
$db = $conn->test;

// access collection
$collection = $db->items;

// execute and explain query
$criteria = array(
‘quantity’ => array(
‘$gt’ => 10,
‘$lt’ => 50
),
‘name’ => new MongoRegex( ‘/es$/i’ )
);
$cursor = $collection->find($criteria);
$cursor->sort(array( ‘price’ => 1))->limit(3);
print_r($cursor->explain());

// disconnect from server
$conn->close();
> catch (MongoConnectionException $e) <
die( ‘Error connecting to MongoDB server’ );
> catch (MongoException $e) <
die( ‘Error: ‘ . $e->getMessage());
>
?>

* This source code was highlighted with Source Code Highlighter .

Rank And File
В дополнение к документам MongoDB также поддерживает бинарные данные. Бинарные данные до 4 MB могут быть сохранены в обычном документе, а данные (файлы), котороые больше этого размера, могут быть сохранены, использую маленькую штучку под названием GridFS.
GridFS это спецификация, описывающая дробление и сохранение больших файлов в MongoDB. Обычно, GridFS использует две коллекции: коллекция ‘files’, которая созраняет метаданные о каждом файле, и коллекция ‘chunks’, которая сохраняет данные, разделенные на кусочки (chunks). Каждый файл в коллекции ‘files’ collection имеет уникальный идентификатор, подобный идентификаторам других документов, хранимых в MongoDB; этот идентификатор можкт быть использован для получения или изменения файла.


Расширение MongoDB PECL обеспечивает набор классов MongoGridFS, которые могут быть использованы для взаимодействия с файлами, сохраненными с использованием GridFS. Каждый файл представлен экземпляром класса MongoGridFSFile, а каждый объект MongoGridFS предоставляет методы для добавления, удаления и поиска этих файлов.

Для лучшего понимания, рассмотрим следующий пример, который иллюстрирует процесс добавления изображения в MongoDB:

try <
// open connection to MongoDB server
$conn = new Mongo( ‘localhost’ );

// access database
$db = $conn->test;

// get GridFS files collection
$gr >getGridFS();

// store file in collection
$ >storeFile( ‘/tmp/img_2312.jpg’ );
echo ‘Saved file with ID: ‘ . $id;

// disconnect from server
$conn->close();
> catch (MongoConnectionException $e) <
die( ‘Error connecting to MongoDB server’ );
> catch (MongoException $e) <
die( ‘Error: ‘ . $e->getMessage());
>
?>

* This source code was highlighted with Source Code Highlighter .

В начале примера получается эксземпляр класса MongoGridFS, используя метод getGridFS() класса MongoDB, а затем методом storeFile() файл сохраняется в MongoDB. Если вы запустите этот пример, а затем посмотрите на содержимое вашей БД, вы увидите две новые коллекции ‘fs.files’ и ‘fs.chunks’. Если вы взгляненте немного глубже в коллекцию ‘fs.files’, то вы увидите файл, корторый вы добавили.

> show collections
fs.chunks
fs.files
items
system.indexes
> db.fs.files.find()
< "_id" : Object >«4beaa34f00f4784c0a300000» ), «filename» : «/tmp/img_2312.jpg» , «uploadDate» : «Wed May 12 2010 18:17:11 GMT+0530 (India Standard Time)» , «length» : 11618, «chunkSize» : 262144, «md5» : «e66b9a33c7081ae2e4fff4c37f1f756b» >

* This source code was highlighted with Source Code Highlighter .

В качестве альтернативы the storeFile() существует метод storeUpload(), которые предназначен для использования совместно с загрузкой фалов, используя PHP. Использовать эту возможность очень легко: передайте в storeUpload название поля загрузки файла в форме, а MongoDB сама все сделает. Вы также можете передать название файла как второй аргумент.
Ниже небольшой пример:

if (isset($_POST[ ‘submit’ ])) <
try <
// open connection to MongoDB server
$conn = new Mongo( ‘localhost’ );

// access database
$db = $conn->test;

// get GridFS files collection
$gr >getGridFS();

// check uploaded file
// store uploaded file in collection and display ID
if (is_uploaded_file($_FILES[ ‘f’ ][ ‘tmp_name’ ])) <
$ >storeUpload( ‘f’ );
echo ‘Saved file with ID: ‘ . $id;
> else <
throw new Exception( ‘Invalid file upload’ );
>

// disconnect from server
$conn->close();
> catch (MongoConnectionException $e) <
die( ‘Error connecting to MongoDB server’ );
> catch (Exception $e) <
die( ‘Error: ‘ . $e->getMessage());
>
>
?>

Драйвер MongoDB

В отличие от расширения mongo, это расширение поддерживает разрабатывается поверх библиотек » libmongoc и » libbson. Оно предоставляет минимальное API для ключевого функционала драйвера: команды, запросы, записи, управление соединением и сериализация BSON.

Самодельные библиотеки PHP, требующие это расширение, могут предоставлять высокоуровневые API, такие как: сборщики запросов, методы помощники для индивидуальных команд и GridFS. Разработчики приложений должны рассмотреть вопрос об использовании этого расширения совместно с » библиотекой MongoDB PHP, которая реализует такие же высокоуровневые API драйвера MongoDB, как и для других языков. Подобное разделение задач позволяет этому драйверу сконцентрироваться на главных задачах, стоящих перед ним — повышение производительности.

  • Установка и настройка
    • Требования
    • Установка
    • Настройка во время выполнения
    • Предопределенные константы
  • Обучающие материалы
    • Использование библиотеки PHP для MongoDB (PHPLIB)
    • Мониторинг производительности приложения (Application Performance Monitoring или APM)
  • Архитектура и внутреннее устройство драйвера — Обзор архитектуры драйвера и ее особенностей
    • Архитектура — Обзор архитектуры
    • Соединения — Обработка соединения и постоянство
    • Постоянные данные — Сериализация и десериализация переменных PHP в MongoDB
  • Безопасность
    • Атака с помощью инъекций в запросе
    • Атака с помощью инъекций в скриптах
  • MongoDB\Driver — Классы драйвера MongoDB
    • MongoDB\Driver\Manager — Класс MongoDB\Driver\Manager
    • MongoDB\Driver\Command — Класс The MongoDB\Driver\Command
    • MongoDB\Driver\Query — Класс MongoDB\Driver\Query
    • MongoDB\Driver\BulkWrite — Класс MongoDB\Driver\BulkWrite
    • MongoDB\Driver\Session — Класс MongoDB\Driver\Session
    • MongoDB\Driver\WriteConcern — Класс MongoDB\Driver\WriteConcern
    • MongoDB\Driver\ReadPreference — The MongoDB\Driver\ReadPreference class
    • MongoDB\Driver\ReadConcern — Класс MongoDB\Driver\ReadConcern
    • MongoDB\Driver\Cursor — Класс MongoDB\Driver\Cursor
    • MongoDB\Driver\CursorId — Класс MongoDB\Driver\CursorId
    • MongoDB\Driver\CursorInterface — The MongoDB\Driver\CursorInterface interface
    • MongoDB\Driver\Server — Класс MongoDB\Driver\Server
    • MongoDB\Driver\WriteConcernError — Класс The MongoDB\Driver\WriteConcernError
    • MongoDB\Driver\WriteError — Класс MongoDB\Driver\WriteError
    • MongoDB\Driver\WriteResult — Класс MongoDB\Driver\WriteResult
  • MongoDB\BSON — Классы типов BSON и функции сериализации
    • Функции
    • MongoDB\BSON\Binary — Класс MongoDB\BSON\Binary
    • MongoDB\BSON\Decimal128 — Класс MongoDB\BSON\Decimal128
    • MongoDB\BSON\Javascript — Класс MongoDB\BSON\Javascript
    • MongoDB\BSON\MaxKey — Класс MongoDB\BSON\MaxKey
    • MongoDB\BSON\MinKey — Класс MongoDB\BSON\MinKey
    • MongoDB\BSON\ObjectId — Класс MongoDB\BSON\ObjectId
    • MongoDB\BSON\Regex — Класс MongoDB\BSON\Regex
    • MongoDB\BSON\Timestamp — Класс MongoDB\BSON\Timestamp
    • MongoDB\BSON\UTCDateTime — Класс MongoDB\BSON\UTCDateTime
    • MongoDB\BSON\Type — Интерфейс MongoDB\BSON\Type
    • MongoDB\BSON\Persistable — Интерфейс MongoDB\BSON\Persistable
    • MongoDB\BSON\Serializable — Интерфейс MongoDB\BSON\Serializable
    • MongoDB\BSON\Unserializable — Интерфейс MongoDB\BSON\Unserializable
    • MongoDB\BSON\BinaryInterface — Интерфейс MongoDB\BSON\BinaryInterface
    • MongoDB\BSON\Decimal128Interface — Интерфейс MongoDB\BSON\Decimal128Interface
    • MongoDB\BSON\JavascriptInterface — Интерфейс MongoDB\BSON\JavascriptInterface
    • MongoDB\BSON\MaxKeyInterface — Интерфейс MongoDB\BSON\MaxKeyInterface
    • MongoDB\BSON\MinKeyInterface — Интерфейс MongoDB\BSON\MinKeyInterface
    • MongoDB\BSON\ObjectIdInterface — Интерфейс MongoDB\BSON\ObjectIdInterface
    • MongoDB\BSON\RegexInterface — Интерфейс MongoDB\BSON\RegexInterface
    • MongoDB\BSON\TimestampInterface — Интерфейс MongoDB\BSON\TimestampInterface
    • MongoDB\BSON\UTCDateTimeInterface — Интерфейс MongoDB\BSON\UTCDateTimeInterface
    • MongoDB\BSON\DBPointer — Класс MongoDB\BSON\DBPointer (устаревший)
    • MongoDB\BSON\Symbol — Класс MongoDB\BSON\Symbol (устаревший)
    • MongoDB\BSON\Undefined — Класс MongoDB\BSON\Undefined (устарело)
  • MongoDB\Driver\Monitoring — Классы мониторинга и функции подписчика
    • Функции
    • MongoDB\Driver\Monitoring\CommandFailedEvent — Класс MongoDB\Driver\Monitoring\CommandFailedEvent
    • MongoDB\Driver\Monitoring\CommandStartedEvent — Класс MongoDB\Driver\Monitoring\CommandStartedEvent
    • MongoDB\Driver\Monitoring\CommandSucceededEvent — Класс MongoDB\Driver\Monitoring\CommandSucceededEvent
    • MongoDB\Driver\Monitoring\CommandSubscriber — Интерфейс The MongoDB\Driver\Monitoring\CommandSubscriber
    • MongoDB\Driver\Monitoring\Subscriber — Интерфейс MongoDB\Driver\Monitoring\Subscriber
  • MongoDB\Driver\Exception — Классы исключений
    • MongoDB\Driver\Exception\AuthenticationException — Класс MongoDB\Driver\Exception\AuthenticationException
    • MongoDB\Driver\Exception\BulkWriteException — Класс MongoDB\Driver\Exception\BulkWriteException
    • MongoDB\Driver\Exception\CommandException — Класс MongoDB\Driver\Exception\CommandException
    • MongoDB\Driver\Exception\ConnectionException — Класс MongoDB\Driver\Exception\ConnectionException
    • MongoDB\Driver\Exception\ConnectionTimeoutException — Класс MongoDB\Driver\Exception\ConnectionTimeoutException
    • MongoDB\Driver\Exception\Exception — Интерфейс MongoDB\Driver\Exception\Exception
    • MongoDB\Driver\Exception\ExecutionTimeoutException — Класс MongoDB\Driver\Exception\ExecutionTimeoutException
    • MongoDB\Driver\Exception\InvalidArgumentException — Класс MongoDB\Driver\Exception\InvalidArgumentException
    • MongoDB\Driver\Exception\LogicException — Класс MongoDB\Driver\Exception\LogicException
    • MongoDB\Driver\Exception\RuntimeException — The MongoDB\Driver\Exception\RuntimeException class
    • MongoDB\Driver\Exception\ServerException — Класс MongoDB\Driver\Exception\ServerException
    • MongoDB\Driver\Exception\SSLConnectionException — Класс MongoDB\Driver\Exception\SSLConnectionException (устаревший)
    • MongoDB\Driver\Exception\UnexpectedValueException — Класс MongoDB\Driver\Exception\UnexpectedValueException
    • MongoDB\Driver\Exception\WriteException — Класс MongoDB\Driver\Exception\WriteException
    • Class Tree — MongoDB Exception Class Tree

User Contributed Notes 3 notes

*** ONLY FOR VERSIONS >= 1.2.0 ***

If you encounter the following error:

«PHP Warning: PHP Startup: Unable to load dynamic library ‘/usr/lib64/php/modules/mongodb.so’
— /usr/lib64/php/modules/mongodb.so: undefined symbol: php_json_serializable_ce in Unknown on line 0″

For a detailed explanation, please visit:

TLDR: You need to load the mongodb.so extension after the json.so
extension

Special thanks to Derick Rethans for pointing this out!

There is an adapter — so old MongoClient / MongoDB code will run on the new PHP7/Mongo mess

In new driver, these fail:

(A) $count = $collection->find( $criteria )->count();

(B1) $cursor = $collection->find( $criteria );
(B2) $count = $cursor->count();

In new driver, result counting has become its own separate action, to be applied to the collection, not the cursor:

$count = $collection->count( $criteria );
$cursor = $collection->find( $criteria );

«In the new driver, a Cursor object now represents the actual results of an executed command or query, whereas cursors in the legacy driver had a dual-nature (pre- or post-executed). The legacy MongoCursor::count() method actually invoked a count command with the same criteria; however, this meant it was entirely possible for the count command’s calculation to differ from the actual query results, since they were not necessarily operating on the same result data.

«The userland library implements a count() method on the collection, which also takes filter criteria, and we’d rather encourage that so users understand that the operations are separate. If we do end up making Cursor countable in the userland library, we would use iterator_count() to provide an exact count on the results; however, this will also require us to cache the results so that users can rewind the cursor and iterate again (this was most recently discussed in PHPLIB-81). While the legacy driver would re-execute the query on a rewind, that’s also not an option given the nature of a Cursor in the new driver.

«I realize this may come across as an inconvenience, but I believe the explicit API is a ultimately a step forward from the legacy driver, where many users might have been oblivious to what was actually happening under the hood. Feel free to follow up if you have additional questions.

Командуем Slack-ом

В качестве примера — автоинформирование студентов в слаке об их группе.

Стек взят исходя из бесплатного деплоя, HTTPS, требуемого слаком, ну и нежной любви к PHP, конечно же, не считая преимуществ производительности 7 версии. Сразу отмечу, это пет-проект, с реальной системой он имеет немного общего, создан чтобы показать насколько проста магия в современном мире бэкенда.

Предполагается, что локально уже стоит сервер с PHP 7, MongoDB, Git, Composer и нормальная консоль.

Что дано

Есть учебные группы, есть расписание занятий и домашние задания, есть слак-каналы со студентами.

Что требуется

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

База данных

В боевых условиях конечно же есть уже данные по занятиям группы, но для пет-проекта, назовем его slack-magic , мы сгенерируем их и поместим в MongoDB с названием slack_magic . Создаем простой JSON:

Кидаем файл в папку с MongoDB и там же вызываем в консоли:

Заходим и проверяем:

Вжух, есть данные в базе:

Правда, они не в том виде, котором хотелось. Ведь нам надо как-то ориентироваться по датам. Да и про время старта забыли, чтобы показывать ближайшее занятие, нужно отталкиваться не только от даты, но и от времени.

Очищаем коллекцию при помощи db.groups.drop() и меняем файл в соответствии с форматом даты для MongoDB:

Проверяем на выборку:

Работает! Бежим вперед, идем на mlab.com, регистрируемся, создаем «Single-node» и «Sandbox», создаем пользователя и экспортируем наши данные сразу и туда при помощи команды (данные взять свои с mlab.com соответственно):

Не забываем сохранить себе оттуда же MongoDB URI.

Heroku

Сервис Heroku безусловно хорош простым развертыванием окружения и деплоеем из консоли. Как бесплатная песочница он прекрасен, что уж говорить. Для тестирования нашего зоопарка самое то. Регистрация и создание приложения там предельно просты — «Create New App» и готово. Приложение назвалось slack-magic-ru и соответственно после настройки стало доступно по адресу https://slack-magic-ru.herokuapp.com/

Мастер Йода рекомендует:  Обзор библиотек для работы с большими числами в C++

Для работы в консоли устанавливаем Heroku CLI и проверяем:

Переходим в папку с нашим проектом и создаем там файл composer.json :

И файл Procfile :

Создаем папку public и в ней файл-заглушку index.php с нехитрым содержимым:

Не забываем про файл .gitignore :

Добавляем и коммитим наше богатство:

Затем логинимся в Heroku:

Добавляем удаленный репозиторий:

И пушим все на сервер:

Проверяем по нашей ссылке от Heroku все ли работает. Если нет — читаем логи, молимся, перечитываем все сначала.

Приложение для Slack

Прежде чем отвечать на запросы пользователей в слаке, нужно понять, как их получать. Для того, чтобы в канале слака можно было вводить свои команды и получать вменяемый (или не очень) ответ, необходимо сначала добавить приложение.

После создания то, что нам нужно в «Add features and functionality» под названием «Slash Commands»:

Добавляем для начала команды /info и /next , в «Request URL» указываем наш сайт на heroku:

Далее идем в «Install your app to your team» и нажимаем «Install App to Team»:

Идем в любой канал слака и проверяем команду /info или /next в деле. Успех:

Ответ на команду

Отвечать принято в формате JSON и со статусом 200. Если мы будем отвечать тем же текстом «Работает!», то это должно выглядеть так:

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

При указании в response_type значения in_channel ответ будет виден всем в канале, и команда тоже.


Переписываем наш index.php в соответствии с этим:

Пушим на heroku и снова проверяем команду /info в слаке:

Данные от Slack App

От приложения Slack данные приходят в виде POST-запроса на наш сервер, например, такие:

Пока все, что нас интересует — command и text . В command должно приходить /info или /next , а в text название группы. Будем наивно полагать, что мы живем в идеальном мире и все так и происходит. Переписываем index.php , используя в ответе немного базового форматирования:

Тестируем локально при помощи, например, плагина RESTED для Chrome, пушим на heroku, проверяем в слаке:

Пора браться за базу данных.

Работа с MongoDB в PHP

Для работы с базой данных в PHP используется библиотека классов MongoDB, которую мы уже установили при помощи Composer в самом начале. Документацию по работе с ней можно почитать тут.

Сначала проверим локально, адекватно ли мы наполнили данные и как с ними работать:

Снова тестируем локально, отправляя разные POST-запросы. Когда все заработает как надо, успокаиваемся и думаем как это залить на heroku. Задача стояла и локально тестить, и на github залить и собственно деплой на heroku сделать. Конфиг выносим отдельно, в файл cfg.php :

Дальше там еще прибавится переменных. Добавляем cfg.php в .gitignore , коммитимся.

Создадим ветку heroku , где будет храниться другой конфиг и .gitignore .

В ветке heroku убираем из .gitignore файл cfg.php и меняем $mongodb_uri на MongoDB URI из mlab.com, коммитим и пушим на heroku из этой ветки:

Снова проверяем команды в слаке, работает:

Собственно отсюда пушим и на github. Единственная проблема в таком подходе — при переключении на master нужно сохранять файл cfg.example.php как cfg.php . Другой вариант — использовать переменные окружения и сохранять все в файле .env , для heroku использовать heroku config:set , но это отдельный разговор.

Защищаемся

Конечно полагаться на данные, которые приходят в запросе — нельзя, никогда. Для начала очищаем их:

Добавляем проверку на пустые значения, зачем вхолостую к базе подключаться:

Тут хорошо бы сразу проверять команды на правильные и только тогда подключаться и получать данные о группе.

Добавляем в cfg.php переменную $slack_app_token , в которой будет храниться токен приложения Slack:

Добавляем проверку в index.php :

Тестируем локально, если ничего не сломалось, идем в ветку heroku . Теперь возвращаемся к нашему приложению Slack и находим в Basic Information токен Verification Token и добавляем в cfg.php .

Примитивизм

Конечно можно (да и нужно) спроектировать и реализовать нормальное REST API, прикрутить какой-нибудь микрофреймворк для роутинга и других банальных штук, обновлять данные о группах PUT-запросами из системы и прочие плюшки с блекджеком и балеринами. Как вариант — проверять канал чата и брать название группы оттуда, да и вообще проверять пользователя на соответствие студенту, чтобы «всякие не шастали тут».

Пост не про это, а про то, как быстро и просто запилить магию. А головой думать в качественом смысле можно и своей.

MongoDB для начинающих: основные команды (часть 3/3)

В сегодняшнем уроке мы настроим нашу систему таким образом, чтобы мы могли работать с MongoDB через PHP.

С самого начала MongoDB уже сконфигурирована для работы с веб-сервером. Для того, чтобы работать с ней через php, ruby, node.js, perl, нужно установить специальный драйвер.

Установка MongoDB PHP расширения на Windows

Пользователям Windows необходимо скачать драйвер MongoDB для своей версии PHP (5.2, 5.3, 5.4). Найти эти драйвера можно на Github. После того, как вы скачаете нужный вам архив, распакуйте его и переименуйте файл в php_mongo.dll

В моём случае, я буду переименовывать файл php_mongo-1.3.2RC1-5.3-vc9-nts.dll, т.к. у меня версия php 5.3.

Внимание! Прежде чем приступить к следующим шагам, сделайте копии исходных файлов, прежде чем что-то исправлять.

Далее нам необходимо подключить данный драйвер в php.ini. Для начала, поместим скачанный файл в каталог со всеми php расширениями. Каждая сборка хранит этот каталог по-своему. Чтобы узнать, где лежит каталог с php расширениями, можно заглянуть в php.ini или посмотреть значение опции extension_dir, вызвав метод phpinfo(); В моём случае, это С:\server\ZendServer\lib\phpext. Файл php_mongo.dll помещаю туда.

Теперь нужно активировать его в файле php.ini. Путь к данному файлу вы также сможете найти, вызвав phpinfo();

В файле php.ini находим секцию с подключением dll файлов и прописываем название нашего драйвера:

Далее перезапускаем Apache сервер, чтобы изменения вошли в силу. Если после перезапуска у вас возникла ошибка, то скорее всего, вам нужно подобрать другой драйвер MongoDB.

Работа с MongoDB через PHP

Когда речь заходит о БД, существует множество аспектов, которые можно обсудить. Поскольку данные статьи — это только знакомство с технологией, то мы не будет особо углубляться. Для работы с MongoDB нужно воспользоваться специальным классом.

В этом примере, я воспользуюсь той коллекцией, которую мы создали в предыдущих уроках. Итак, создаём новый php файл и начинаем кодить:

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

Теперь результат выборки, записанной в переменную $cursor, можем вывести в var_dump() или print_r(). Для того чтобы пройтись по каждой строчке, можем воспользоваться циклом foreach:

Далее к полям объекта можно обращаться через знак ->

Для того чтобы узнать больше о всевозможных операциях, читайте официальную документацию. Надеюсь, этот небольшой скрипт даст вам хоть какое-то представление о том, как работать с no-sql базами данных через PHP. Никаких запутанных команд, никаких SQL выражений — всё просто и понятно.

Данный урок подготовлен для вас командой сайта ruseller.com
Источник урока: https://www.hongkiat.com/blog/webdev-with-mongodb-part3/
Перевел: Станислав Протасевич
Урок создан: 15 Апреля 2013
Просмотров: 23888
Правила перепечатки

5 последних уроков рубрики «PHP»

Фильтрация данных с помощью zend-filter

Когда речь идёт о безопасности веб-сайта, то фраза «фильтруйте всё, экранируйте всё» всегда будет актуальна. Сегодня поговорим о фильтрации данных.

Контекстное экранирование с помощью zend-escaper

Обеспечение безопасности веб-сайта — это не только защита от SQL инъекций, но и протекция от межсайтового скриптинга (XSS), межсайтовой подделки запросов (CSRF) и от других видов атак. В частности, вам нужно очень осторожно подходить к формированию HTML, CSS и JavaScript кода.

Подключение Zend модулей к Expressive

Expressive 2 поддерживает возможность подключения других ZF компонент по специальной схеме. Не всем нравится данное решение. В этой статье мы расскажем как улучшили процесс подключение нескольких модулей.

Совет: отправка информации в Google Analytics через API

Предположим, что вам необходимо отправить какую-то информацию в Google Analytics из серверного скрипта. Как это сделать. Ответ в этой заметке.

Подборка PHP песочниц

Подборка из нескольких видов PHP песочниц. На некоторых вы в режиме online сможете потестить свой код, но есть так же решения, которые можно внедрить на свой сайт.

MongoDB for the PHP Mind, Part 1

This is part one of a three part blog series by Mitch Pirtle.

We have covered a lot on the blog about MongoDB features, as well as many ways to utilize MongoDB from different languages. This is the first in a series of posts from the perspective of a PHP developer; and covers the gamut from getting started to advanced concepts.

I’m not going to waste the first blog post getting you up and running with MongoDB and the PHP extension, as that whole process is documented quite beautifully:

While we’re at it, you should also take advantage of the online documentation for MongoDB, as well as the reference for the MongoDB extension for PHP.

Getting Started

“So now what?” Oddly enough, I get this question quite frequently, as most folks familiar with relational databases are expecting to create a database, make sure the proper character set is being used, and also enforce login security for database access.

With MongoDB this is greatly simplified, as all MongoDB databases are UTF-8. This is important to note, as some databases arbitrarily pick character sets based on — leaving you with some annoying migration problems to deal with down the road.

We need to secure the database but that is relatively straightforward. At least for development, not using authentication (“trusted mode”) is fine as it should be running on your laptop, with your laptop firewall on. On a public server, either lock down the db with authentication or lock down the network (much like one would do with memcached).

You can dynamically create your database from PHP when you save your first document. This is actually the right place to start for your first experience with MongoDB.

Documents?

Let’s get some quick terminology down so things make more sense. In MongoDB, a table is called a collection, and a row or recordset is called a document.

You are looking at MongoDB most likely wondering what a document database can do for you, and your applications. Unlike relational databases, MongoDB is schema-less, meaning you can store different types of documents in the same collection. This makes MongoDB fantastic for rapid prototyping, but also passes the responsibility to you, our intrepid developer, to make sure to lock down your schema when you finalize your data model.

Why don’t we start with people, since they are the most common user of web applications:

This is familiar to a lot of you that work with JavaScript, as it is a JSON document. MongoDB stores your documents as a serialized binary JSON called BSON, giving you the ability to reach inside your documents to find and manipulate them quickly and easily.

There are the ever-present first_name and last_name fields, as well as one called tags which adds a wrinkle to things. This is not stored as a string, but an array of strings. Here is one of MongoDB’s most profound differences with relational databases.

If you are storing arrays inside your documents, you are also able to search by them as well. With the above example, you could get a count of all users in your database who listed developer as one of their tags.

Most importantly, MongoDB can search the tag field regardless of whether it is there or not, or it contains a string, an embedded array, or even an embedded document.

Here is what this document looks like in PHP, I’m calling this first script test.php:

Now let’s quit talking and start doing, as that’s the way I like to learn. I’m going to be verbose, so you understand all the things that are taking place. We can shorten this process later. Add the following to your existing test PHP script:

When you run this script (php -f test.php) you might not notice much. What happened in the database? Let’s find out, by firing up the MongoDB client app on the command line:

The test database didn’t exist, as well as the users collection, until we saved that document. I appreciate using findOne() as it formats the JSON output nicely — calling find() will show all results, but no pretty indentation.

There’s a surprise waiting for you in your shiny new document; a field called _id. This is added by MongoDB to ensure a unique key, one that remains unique across a great many shards and clusters of servers.

If you compare the document that is returned by findOne() versus the original data, you will notice that an _id field has been added. The _id field is the unique identifier for a document in a collection. If you don’t provide an _id value, MongoDB will generate a unique ObjectID which is a 12-byte binary value designed to have a high probability of being unique when allocated. An _id value is typically an ObjectID, but you can also specify your own value if there is a more natural primary key. If you’re just starting with MongoDB it’s generally best to use the default ObjectID.

Now it is time to take a look at how to retrieve this data. I’m creating another PHP script called test2.php, and it looks strikingly similar to this:

Мастер Йода рекомендует:  Разработана технология сверхбыстрой голографической 3D-печати

Running this script (php -f test2.php) produces the following output:

The PHP var_dump() output is similar to the shell output for db.users.findOne() above. You will notice that the document created by test2.php has a different ObjectId from the first document that was created in test.php. ObjectIds are non-sequential and are generated from a combination of current timestamp, machine ID, process ID, and a counter field (read the ObjectId specification if you’re curious to know more).

This post hopefully gets your interest piqued with MongoDB and how you can work with it from within your favorite language, PHP. Don’t miss the opportunity to see the most excellent tutorial at php.net.

Conclusion

This article demonstrates a few simple concepts behind MongoDB and how they relate to PHP. In the next series we will talk about more advanced query concepts, different datatypes supported by MongoDB’s BSON, and more.

Создание приложения блога на Angular и MongoDB: Главная

В первой части учебной серии вы видели, как начать работу с созданием Angular веб-приложения. Вы узнали, как настроить приложение и создать компонент «Login».

В этой части серии вы напишите API REST ендпоинт, необходимый для взаимодействия с бэкендом MongoDB. Вы также создадите компонент Home , который будет отображаться после успешного входа в систему.

Начинаем

Давайте начнем с клонирования исходного кода из первой части серии.

Перейдите в каталог проекта и установите необходимые зависимости.


После установки зависимостей перезапустите сервер.

Откройте https://localhost:4200 в своем браузере, и вы должны получить запущенное приложение.

Создание API REST для входа в систему

Внутри папки проекта AngularBlogApp-Home создайте другую папку с именем server . Наш API REST мы напишем на Node.js.

Перейдите в папку server и выполните инициализацию проекта.

Введите необходимые данные, и вы должны инициализировать проект.

Вы будете использовать фреймворк Express для создания сервера. Установите Express , используя следующую команду:

После установки Express создайте файл под названием app.js . Это будет корневой файл для вашего сервера Node.js.

Вот как выглядит файл app.js :

Как видно из приведенного выше кода, вы импортировали express в app.js . С помощью express вы создали приложение app .

Используя app , вы открыли ендпоинт /api/user/login , который отобразит сообщение. Запустите сервер Node.js, используя следующую команду:

Откройте https://localhost:3000/api/user/login в своем браузере, и вы должны увидеть это сообщение.

Вы будете отправлять запрос POST из сервиса Angular на сервер с параметрами username и password . Поэтому вам нужно проанализировать параметры запроса.

Установите body-parser , который middleware для разбора тела Node.js для анализа параметров запроса.

После его установки импортируйте его в app.js .

Добавьте следующий код в файл app.js .

Вышеупомянутые два параметра body-parser возвращают middleware, которое анализирует только json и urlencoded тела и просматривает только запросы, в которых заголовок Content-Type соответствует опции type .

Вы будете использовать Mongoose для взаимодействия с MongoDB из Node.js. Поэтому установите Mongoose с помощью Node Package Manager (npm).

Как только у вас будет установлен mongoose, импортируйте его в app.js .

Определите URL-адрес базы данных MongoDB в app.js .

Теперь будет использовать Mongoose для подключения к базе данных MongoDB. Вот как это выглядит:

Если соединение установлено, выводится сообщение с username и password .

Вот как выглядит файл app.js :

Перезапустите сервер node, используя следующую команду:

Чтобы подключиться к серверу node из приложения Angular, вам нужно установить прокси. Создайте файл с именем proxy.json внутри папки client/src . Вот как это выглядит:

Измените файл client.json клиента, чтобы запустить приложение, используя прокси файл.

Сохраните изменения и запустите клиентский сервер.

Откройте https://localhost:4200 в своем браузере и введите имя пользователя и пароль. Нажмите кнопку входа и вы должны увидеть эти параметры на консоли node.

Валидация логина пользователя

Чтобы взаимодействовать с MongoDB с использованием Mongoose, вам нужно определить схему и создать модель. Внутри папки server создайте папку с именем model .

Создайте файл user.js внутри папки model . Добавьте следующий код в файл user.js :

Как видно из приведенного выше кода, вы импортировали mongoose в user.js . Вы создали userSchema , используя mongoose schema , и создали модель User , используя модель mongoose .

Импортируйте файл user.js в файле app.js .

Прежде чем запрашивать коллекцию user , вам необходимо создать ее. Перейдите в оболочку MongoDB, набрав mongo . Создайте коллекцию user , используя следующую команду:

Вставьте запись, с которой вы будете работать.

Теперь, когда mongoose подключается к MongoDB, вы найдете запись из базы данных с использованием предоставленных username и password . Вот как выглядит API:

Как видно из приведенного выше кода, после получения ответа от базы данных вы возвращаете то же самое на клиентскую сторону.

Сохраните указанные выше изменения и попробуйте запустить клиент и сервер. Введите имя пользователя как roy и пароль как 123 , и вы сможете просмотреть результат в консоли браузера.

Перенаправление на компонент Home

После успешной проверки пользователя вам необходимо перенаправить пользователя на компонент Home . Итак, давайте начнем с создания компонента Home .

Создайте папку Home в папке src/app . Создайте файл home.component.html и добавьте следующий HTML-код:

Создайте файл с именем home.component.css и добавьте следующий стиль CSS:

Создайте файл компонента home.component.ts и добавьте следующий код:

Как видно из приведенного выше кода, вы только что создали HomeComponent с помощью декоратора @Component и указали selector , templateUrl и styleUrls .

Добавьте HomeComponent в NgModules в app.module.ts .

Импортируйте HomeComponent в app.routing.ts и определите маршрут для home .

В методе validateLogin в файле login.component.ts при успешной проверке перенаправьте пользователя на HomeComponent . Для перенаправления вам сперва необходимо импортировать Router .

Если ответ от вызова API будет успешным, вы перейдете к HomeComponent с помощью Angular Router .

Вот так выглядит файл login.component.ts :

Сохраните указанные выше изменения и перезапустите сервер. Войдите в приложение, используя существующее имя пользователя и пароль, и вы будете перенаправлены на HomeComponent .

Подведем итоги

В этом уроке вы видели, как написать REST API ендпоинт для входа пользователя в систему. Вы научились использовать Mongoose для взаимодействия с MongoDB из Node. После успешной валидации вы видели, как использовать Angular Router для перехода к HomeComponent .

Как прошел этот урок? Сообщите нам свои мысли и предложения в комментариях ниже.

Исходный код этого учебника доступен на GitHub.

MongoDB для новичков: настройка MongoDB для работы с PHP (Часть 3/3)

Перед тем, как всецело окунуться в руководство, мы рекомендуем вам ознакомиться с предыдущими статьями, посвященными работе с MongoDB.

Сервер MongoDB разработан таким образом, что уже способен работать с вашим текущим веб-сервером. Проблема заключается в том, что вам нужно будет установить драйвера для языка, с которым вы желаете работать: PHP, Ruby, Node.js, Perl и так далее. Мы не будем вдаваться в подробности процесса установки WAMP/MAMP, так как это не совсем подходит к теме нашего сегодняшнего руководства.

Но вы без проблем сможете найти в интернете очень простые руководства по установке WAMP / MAMP на любой ОС.

Примечание: Вы можете работать с сервером MongoDB и без веб-сервера. Но большинство приложений могут потребовать его, и поэтому мы фокусируем свое внимание на использовании MongoDB для веб-разработки.

Вы можете получить какой-то результат от работы MongoDB, если откроете localhost, используя определенный номер порта вашей установки.

MongoDB по умолчанию работает на 27017. Это порт драйвера, и для того, чтобы просматривать аналитику/диагностику, мы воспользуемся портом 28017. Так что, вы можете осуществить доступ к серверу MongoDB, введя в адресной строке браузера:

Этот адрес должен работать корректно вне зависимости от того, находится ли ваш локальный веб-сервер онлайн.

После того, как вы установите и запустите WAMP или MAMP, вы можете посетить локальный веб-сервер на порту 80, чтобы просмотреть страницу стандартного шаблона.

Теперь мы хотим рассказать вам об установке PHP-драйвера, и завершим разработку библиотеки PHP-класса в MongoDB.

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

Пользователи Mac и Linux должны иметь возможность установить эти драйверы напрямую из командной строки. Руководствуясь документацией PHP-языка для MongoDB , мы должны установить конкретный pecl из Pear Library кода PHP.

Вот строка кода, которую следует запустить из терминала:

Если у вас уже установлена Pear, то вам не нужно запускать первую строку. Это необходимо только для PHP-установок, которые не обновлены до последней версии библиотеки Pear. Но после завершения команд, найдите ваш файл php.ini, и добавьте туда следующий отрывок кода:

Вы должны заметить похожий блок кода где-то в середине файла, который имеет несколько других строк с повторяющимся extension=name. Большинство расширений ограничены комментарием, но строки без символа # представляют собой на данный момент активные расширения.

После того, как вы добавили эту строку, сохраните и закройте файл, затем перезагрузите ваш веб-сервер apache, чтобы изменения вступили в силу.

PHP-расширение Mongo в Windows

Все пользователи Windows также должны будут отредактировать файл php.ini. Это можно сделать напрямую посредством контекстного меню WAMP при нажатии на иконку, а затем при переходе в PHP -> php.ini. Вам нужно добавить ту же строку кода, за исключением того, что название файла должно быть php_mongo.dll.

Также, вместо установки посредством командной строки, вам будет проще скачать и скопировать расширение и переместить его вручную.

Windows-пользователям нужно перейти в Github-директорию , в которой полно php-драйверов MongoDB. Найдите там последнюю версию, которая поддерживает вашу версию PHP (5.2, 5.3, 5.4), и скачайте zip-архив. Как только вы распакуете архив, найдите там разрешение, которое совпадает с вашей версией PHP. В нашем случае то php_mongo-1.2.12-5.3-vc9.dll, который нужно переименовать в php_mongo.dll.

Теперь нужно поместить файл в директорию ваших PHP-расширений, которая должна быть расположена по адресу C:\wamp\bin\php\php5.x\ext\. Если вы переместили этот файл в правильное место, и в ваш файл php.ini была добавлена соответствующая строка кода, то все должно заработать! Перезагрузите ваш веб-сервер, и откройте страницу phpinfo(), чтобы просмотреть результат!

Вы можете осуществить поиск (CTRL + F) на предмет наличия mongo, и это поможет вам увидеть детали о модуле.

Веб-разработка Mongo при помощи PHP

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

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

Здесь мы выбираем тестовую базу данных, и далее осуществляем доступ к внутренней коллекции shows. Мы можем запустить функцию find() в любой коллекции Mongo, чтобы извлечь указатель с соответствующей внутренней информацией.

Теперь, для того, чтобы поместить эту информацию на страницу, давайте используемся var_dump() , которая подходит здесь лучше, чем альтернатива в лице print_r() . Добавьте последний блок кода прямо под переменную $cursor.

Цикл foreach() должен пройтись по всем результатам указателей, и извлечь данные переменной для каждого внутреннего массива. У нас должно быть 3 объекта, которые отображают данные, ранее добавленные в нашу коллекцию TV Shows. Вы заметите, что здесь также есть и другой ключ под названием _id, который представляет собой id объекта, автоматически созданный для каждого документа.

Мы же рекомендуем вам более близко подойти к изучению документации о PHP-классе MongoDB при помощи Google. В интернете так много информации, что вряд ли все это получится уместить в вводный курс. Но этот небольшой PHP-скрипт должен служить примером того, насколько гибкими могут быть базы данных в Mongo. Нет никаких сбивающих с толку SQL-команд, нет требований к аутентификации, и весь код прост и понятен!

Разработчики, которые знакомы с базами данных, все равно могут столкнуться с трудностями, проходя по этапам, приведенным в данном руководстве. Даже если несколько раз прочесть что здесь написано, все равно могут остаться назревшие вопросы по поводу терминологии, к примеру. Но не стоит пугаться первоначальных сложностей при работе с mongo, так как уже через неделю вы будете вспоминать, насколько сложно было работать с MySQL.

Mongo представляет собой open source систему баз данных, которая не имеет схем, и может быть быстро расширена по сравнению с конкурирующими системами. Вы не ограничены лишь колонками или таблицами, и внесение данных производится невероятно быстро при помощи кода в формате JSON. Также следует отметить тот факт, что вы можете устанавливать соединение с вашими веб-приложения при помощи PHP, и это зачастую намного проще, чем в случае с MySQL/MSSQL.

Мы действительно надеемся, что данное руководство поможет новичкам в работе с MongoDB, и они самостоятельно смогут произвести установку, настройку и начать разработку веб-приложений.

В целом, Mongo не всегда будет выбором номер один при разработке новых веб-проектов. Но данная система очень безопасна, очень надежна, и медленно, но верно набирает обороты и привлекает все больше внимания в сообществе разработчиков.

Вам понравился материал? Поблагодарить легко!
Будем весьма признательны, если поделитесь этой статьей в социальных сетях:

Создание приложения для ведения блога с использованием Angular и MongoDB: Главная страница

Дата публикации: 2020-03-22

От автора: этот пост является частью серии статей «Создание приложения для блоггинга с использованием Angular и MongoDB». В первой части серии вы узнали, как начать работу по созданию веб-приложения на Angular. А также, как настроить приложение и создать компонент Login. В этой части мы поговорим о создании главной страницы приложения для ведения блога. Напишем API REST, необходимый для взаимодействия с back-end MongoDB, а также создадим компонент Home, который будет отображаться после успешного входа в систему.

Приступим к работе

Давайте начнем с клонирования исходного кода из первой части серии.

Добавить комментарий