Последнее обновление: 30.10.2015

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

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

Установим драйвер для языка PHP. Непосредственно сам драйвер можно загрузить со страницы проекта на гитхабе: https://github.com/mongodb/mongo-php-driver .

После загрузки драйвера и распаковки его пакета на Unix-системах следует ввести следующие команды:

Phpize ./configure make sudo make install

И затем добавить в файл php.ini следующую строку:

Extension=mongo.so

Для установки драйвера на ОС Windows надо загрузить последний пакет со страницы https://s3.amazonaws.com/drivers.mongodb.org/php/index.html . На текущий момент последним является пакет php_mongo-1.4.5.zip .

Итак, загрузим и распакуем этот архивный пакет. В нем будут находиться драйвера для возможных версий php. Надо выбрать ту, которая соответствует вашей версии php и положить соответствующий файл драйвера в каталог php/ext , где хранятся все расширения для php.

Затем надо внести изменение в файл php.ini , добавив в него следующую строчку в секцию, где идет подключение расширений:

Extension=php_mongo-[версия].dll

Например, в моем случае c версией php 5.4 Tread Safe я добавил в каталог php/ext файл php_mongo-1.4.5-5.4-vc9.dll . И поэтому в php.ini я добавляю extension=php_mongo-1.4.5-5.4-vc9.dll

Затем перегружаем веб-сервер и тестируем. Для тестирования подключения драйвера mongodb можно воспользоваться стандартной функцией phpinfo() , выводящей всю информацию о php на веб-сервер. В нашем случае она должна вывести следующее:

Подключение к MongoDB из PHP

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

Чтобы установить соединение с бд, достаточно прописать в коде одну строку:

$connection = new Mongo();

В данном случае мы подключаемся к серверу, который запущен на localhost на стандартном порту 27017. Однако мы можем подключиться и к внешнему серверу:

$connection = new Mongo("somesite.com");

Здесь мы говорим подключиться к серверу MongoDB, который запущен на домене somesite.com и также на порту 27017. Если порт используется другой, то мы его также можем указать:

$connection = new Mongo("somesite.com:888");

После того, как работа с базой данных завершена, мы можем закрыть соединение, используя метод close:

$connection->close();

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

Ранее мы видели, что документ в mongodb фактически представляет объект в формате, аналогичном JSON. Он может хранить ключи, которым сопоставляются некоторые значения. Сами значения также могут представлять сложные объекты из ключей и значений. Так, мы создавали документ, представляющий отдельного человека:

> steve = ({ "name": "Steve", "age": 25, "languages": ["engish", "french"], company: { "name": "Apple", "year": 1976 } })

Создадим аналогичный документ в PHP. Для этого воспользуемся ассоциативными массивами:

$steve = array("name" => "Steve", "age" => 25, "languages"=> array("engish", "french"), "company" => array("name" => "Apple", "year" => 1976))

У меня была такая же проблема, когда я обновился до PHP 5.4. я имел

Extension_dir = "ext"

в php.ini и php -m начиналось нормально и сообщалось, что он загружал pdo_mysql, но когда я запускал phpinfo.php через apache, драйвер отсутствовал.

Я исправил это, изменив extension_dir на абсолютный путь . Я предполагаю, что он запутался при работе через Apache и сделал его относительно чего-то другого.

; Directory in which the loadable extensions (modules) reside. ; http://php.net/extension-dir ; extension_dir = "./" ; On windows: extension_dir = "D:/php-5.4.11-Win32-VC9-x86/ext"

попробуйте следующее: найдите это в своем php.ini и раскомментируйте extension_dir = "ext"

; Directory in which the loadable extensions (modules) reside. ; http://php.net/extension-dir ; extension_dir = "./" ; On windows: extension_dir = "ext"

Попробуйте php -m в консоли, он покажет ошибки запуска PHP.

Проверьте с помощью phpinfo (), чтобы убедиться, что путь для php.ini является тем же самым. На компьютерах с Windows обычно создается несколько экземпляров php.ini и вызывает путаницу.

Кроме того, вызов php из командной строки даст вам сообщение об ошибке с более подробной информацией о том, почему он не может быть загружен. Возможно, расширение, которое вы пытаетесь включить, несовместимо с вашей установкой PHP. т.е. это небезопасная dll с потокобезопасным двоичным кодом или существует несоответствие компилятора где-нибудь, где оба используются vc9 и vc6.

На Windows Server 2012, Apache 2.4, установка php 5.4, после того, как все остальное изменилось, это сработало …

PHPIniDir "C:\php\"

PHPIniDir "C:/php/"

После изменения конфигурации php.ini необходимо перезапустить сервер Appche в службе Windows. Затем загрузится модуль расширения. используйте следующий код для проверки:

У меня возникла эта проблема в Windows с использованием IIS. В моем php.ini были следующие разделы:

Extension=php_pdo_mysql.dll extension=php_pdo.dll

Я просто взял и и поменял местами свои позиции, чтобы появился первым. Я считаю, что порядок объявления важен!

Комментарий Михая в 2012 году гласит: «Попробуйте php -m в консоли, он покажет ошибки при запуске PHP». Это предложение оказалось наиболее полезным. Если в файле php.ini имеются какие-либо ошибки, диспетчер Windows PHP (IIS 8) не совсем понимает, что происходит с php.ini.

Перейдите в командную строку и введите php -m в командной строке. Всплывающее сообщение (предупреждение) сообщит вам о любых ошибках, и оно даст номера строк для этих проблем. В большинстве случаев моя единственная проблема заключалась в том, что я раскоментировал (удалил полуточку) на нескольких строках php.ini, где я НЕ должен был этого делать.

Еще один полезный совет для меня заключался в том, чтобы поместить полный путь для папки расширений (см. Комментарий выше Джереми Прайн), который помог с сообщениями о «отсутствующих DLL», появившихся в предупреждениях.

Я получил подсказки здесь:

Я запускаю PHP 5.2 с Apache 2.2. Исправить меня было скопировать файл libmysql.dll в мой каталог bin Apache.

Я бы порекомендовал следующий курс действий всем, у кого возникла эта проблема: 1) проверьте, чтобы загруженный файл конфигурации находился там, где вы думаете (т.е., что Apache не использует какой-либо по умолчанию php.ini) – phpinfo () предоставит ответ на этот вопрос 2), чтобы убедиться, что все нужные расширения находятся в папке php \ ext и включены в файл php.ini (самые популярные расширения просто нужно расколоть). 3) Попробуйте загрузить pdo_sqllite. Если это произошло в phpinfo () после перезапуска Apache, вы сузили проблему неспособности Apache загрузить необходимые расширения mysql. 4) Следуйте инструкциям в приведенной выше ссылке.

У меня тоже была эта пробема. У меня есть Apache / 2.2.22 (Win32) PHP / 5.3.23 на машине Windows 7. Мое решение меняло расширение extension_dir = C: \ Program Files (x86) \ PHP \ ext в файле php.ini на extension_dir = "C: \ Program Files (x86) \ PHP \ ext". Просто нужно было добавить кавычки.

убедитесь, что файлы pdo * .dll находятся в соответствующих местах в каталоге ОС, проверьте, что ссылки на эти файлы включены в php.ini, проверьте правильность вашей строки dbconnection, перезапустите apache

Ошибка PHP PDO не существует в 5.4

Неустранимая ошибка: Class "DigitalToolBox \ PDO" не найден в C: \ SERVER \ www \ MyAPP \ DigitalToolBox \ MysqlConnectionTool.php в строке 19

вы можете видеть, что pdo загружен, потому что он находится в списке с этим коммандом:

Print_r(get_loaded_extensions());

эта ошибка возникает для использования пространств имен , нам нужно добавить в начале нашего кода инструкцию:

Use PDO;

IF ($ this-> works) $ voteForThis ++;

Если вы используете PHP Manager с IIS, выполните следующие действия:

PDO Drivers no value – ваши записи dll не могут быть упорядочены в файле php.ini. Проверьте список записей расширения dll.

Extension=php_pdo_mysql.dll

записи должны быть размещены рядом со всеми записями pdo. Такой же как

Extension=php_mysql.dll

записи должны быть размещены рядом со всеми без записей pdo.

Хмель это помогает.

В PHP 7.1 x64 на windows с apache 2.4 x64:

extension_dir = "ext" не работает для меня,

Абсолютный путь: extension_dir = "C: \ DEV \ PHP71 \ ext \" работал хорошо

1. драйвер PDO и PDO_Sqlite включен, по умолчанию, в PHP 5.1.0. Вам может понадобиться выбрать другой драйвер PDO для конкретной базы данных, в этом случае обратитесь к документации по конкретной базе данных драйверов PDO.

Примечание: При построении PDO в качестве общего расширения (shared extension (не рекомендуется)), все PDO драйверы должен быть загружены после PDO самостоятельно.

2. При установке PDO как общего модуля, следует изменить файл php.ini, что бы расширение(extension) PDO загружалось автоматически, работает PHP работает.

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

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

3. extension = pdo.so

Установка PDO на системах Windows

1. PDO и все основные драйверы PDO поставляются с PHP как общие расширения(extentions). Для активизации нужно раскомментировать необходимые строки в файле php.ini:

Extension=php_pdo.dll

Примечание: Этот шаг не является необходимым для PHP 5.3 и выше, так как DLL, больше не требуется для PDO.

Extension=php_pdo.dll
extension=php_pdo_firebird.dll
extension=php_pdo_informix.dll
extension=php_pdo_mssql.dll
extension=php_pdo_mysql.dll
extension=php_pdo_oci.dll
extension=php_pdo_oci8.dll
extension=php_pdo_odbc.dll
extension=php_pdo_pgsql.dll
extension=php_pdo_sqlite.dll

Эти библиотеки должны существовать в директории "extension_dir" системы.

Проверяем работу PDO

Просмотрите подключается ли PDO с помощью функции phpinfo().

Phpinfo();

На странице вам нужно найти блок PDO, а также блоки pdo_mysql, pdo_sqlite, и т.д. в зависимости от тех PDO-драйверов которые вы подключали.

Выполните следующий код.

Echo "Доступные драйвера:";
print_r(PDO::getAvailableDrivers());
$pdo = new PDO("sqlite:my.db");
echo "Объект PDO:";
print_r($pdo);

Результатом выполнения должна быть строка:

PDO Object ()

Что означает, что содинение с БД SQLite установлено нормально. Результатом выполнения скрипта будет файл my.db созданный в директории скрипта.

Настройки PDO

Настройки PDO вида pdo.dsn.*

настройки вида pdo.dsn.* - позволяют указать параметры доступа по умолчанию.

Уровень изменения переменных pdo.dsn.* - файл php.ini

Эта статья также доступна на следующих языках: Тайский

  • Next

    Огромное Вам СПАСИБО за очень полезную информацию в статье. Очень понятно все изложено. Чувствуется, что проделана большая работа по анализу работы магазина eBay

    • Спасибо вам и другим постоянным читателям моего блога. Без вас у меня не было бы достаточной мотивации, чтобы посвящать много времени ведению этого сайта. У меня мозги так устроены: люблю копнуть вглубь, систематизировать разрозненные данные, пробовать то, что раньше до меня никто не делал, либо не смотрел под таким углом зрения. Жаль, что только нашим соотечественникам из-за кризиса в России отнюдь не до шоппинга на eBay. Покупают на Алиэкспрессе из Китая, так как там в разы дешевле товары (часто в ущерб качеству). Но онлайн-аукционы eBay, Amazon, ETSY легко дадут китайцам фору по ассортименту брендовых вещей, винтажных вещей, ручной работы и разных этнических товаров.

      • Next

        В ваших статьях ценно именно ваше личное отношение и анализ темы. Вы этот блог не бросайте, я сюда часто заглядываю. Нас таких много должно быть. Мне на эл. почту пришло недавно предложение о том, что научат торговать на Амазоне и eBay. И я вспомнила про ваши подробные статьи об этих торг. площ. Перечитала все заново и сделала вывод, что курсы- это лохотрон. Сама на eBay еще ничего не покупала. Я не из России , а из Казахстана (г. Алматы). Но нам тоже лишних трат пока не надо. Желаю вам удачи и берегите себя в азиатских краях.

  • Еще приятно, что попытки eBay по руссификации интерфейса для пользователей из России и стран СНГ, начали приносить плоды. Ведь подавляющая часть граждан стран бывшего СССР не сильна познаниями иностранных языков. Английский язык знают не более 5% населения. Среди молодежи — побольше. Поэтому хотя бы интерфейс на русском языке — это большая помощь для онлайн-шоппинга на этой торговой площадке. Ебей не пошел по пути китайского собрата Алиэкспресс, где совершается машинный (очень корявый и непонятный, местами вызывающий смех) перевод описания товаров. Надеюсь, что на более продвинутом этапе развития искусственного интеллекта станет реальностью качественный машинный перевод с любого языка на любой за считанные доли секунды. Пока имеем вот что (профиль одного из продавцов на ебей с русским интерфейсом, но англоязычным описанием):
    https://uploads.disquscdn.com/images/7a52c9a89108b922159a4fad35de0ab0bee0c8804b9731f56d8a1dc659655d60.png