Глава 51. Вопросы по Базам Данных

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

1. Я слышал, что можно получить доступ к Microsoft SQL серверу из PHP. Как?
2. Могу ли я получить доступ к базам данных Microsoft Access?
3. Я обновился до PHP 4 и теперь mysql постоянно выдает "Warning: MySQL: Unable to save result set in ..." (Предупреждение: MySQL: Не могу сохранить результат в ...). Что это?
4. Клиентские библиотеки MySQL больше не включены в PHP 5, как это отразится на мне? Могу ли я всё так же использовать MySQL c PHP? Я пытаюсь работать с MySQL и получаю ошибки "function undefined" (функция неопределена), что выдаёт их?
5. После установки поддержки разделения в MySQL, Apache выдаёт дампы сразу после загрузки libphp4.so. Можно ли это исправить?
6. Почему я получаю ошибки типа "Warning: 0 is not a MySQL result index in <file> on line <x>" или "Warning: Supplied argument is not a valid MySQL result resource in <file> on line <x>?

1. Я слышал, что можно получить доступ к Microsoft SQL серверу из PHP. Как?

На Windows машинах, вы просто используете поддержку ODBC и соответсвующий ODBC драйвер.

На Unix машинах для доступа к Microsoft SQL серверам вы можете использовать Sybase-CT драйвер, так как они (по крайней мере в основном) совместимы по протоколу. У Sybase есть бесплатная версия необходимых библиотек для Linux. Для других Unix систем вам необходимо обратиться в Sybase за соответствующими библиотеками. Также смотрите ответ на следующий вопрос.

2. Могу ли я получить доступ к базам данных Microsoft Access?

Да. Если всё полностью выполняется под Windows 9x/Me или NT/2000, то у вас уже есть все необходимые средства, так как для баз данных Microsoft Access вы можете использовать ODBC и драйверы ODBC от Microsoft.

Если вы хотите связать PHP, выполняющийся на Unix, и MS Access на Windows, то вам будут нужны драйверы ODBC для Unix. Такие ODBC драйверы для Unix есть у OpenLink Software. По бесплатной пилотной программе вы можете скачать пробную копию без срока истечения, а цены на комерчески поддерживаемую версию начинаются от 675$.

Другая возможность - хранить данные на SQL сервере, который имеет ODBC драйверы для Windows, и затем обращаться к этой базе данных из Microsoft Access (используя ODBC) и из PHP (используя встроенные драйверы) или использовать промежуточный формат понятный и для Access, и для PHP, как то последовательные файлы или базы данных dBase. По этому поводу Тим Хэйз (Tim Hayes) из OpenLink software пишет:

Использование промежуточной базы данных - не очень хорошая идея, когда есть возможность работать с базой данных на прямую из PHP через ODBC, например с драйверами от OpenLink. Если вам всё-таки надо использовать промежуточный формат, OpenLink выпустил Virtuoso (механизм виртуальной базы данных) для NT, Linux и других платформ Unix. Пожалуйста, посетите наш web сайт для бесплатной загрузки.

Другой проверенный вариант - использовать MySQL с её MyODBC драйверами на Windows и делать синхронизацию баз данных. Стив Лоренс (Steve Lawrence) пишет:

  • Установите MySQL согласно поставляемым с ней инструкциям. Последняя версия доступна с www.mysql.com (получите её с ближайшего зеркала!). Особой конфигурации не требуется, за исключением того, что при настройке баз данных и создании пользователя, в поле хоста вы должны поместить % или имя Windows машины, на которую вы хотите получить доступ из MySQL. Запишите имя вашего сервера, имя пользователя и пароль.

  • Скачайте MyODBC драйвер для Windows с сайта MySQL. Последний релиз - myodbc-2_50_19-win95.zip (доступен также для NT и как исходный код). Установите его на вашей Windows машине. Вы можете проверить его работоспособность с помощью поставляемых с ним утилит.

  • Создайте пользователя или системный dsn в вашем администраторе ODBC, расположенном в контрольной панели. Создайте dsn имя, введите имя хоста, имя пользователя, пароль и т.д. для вашей базы данных MySQL, сконфигурированной на 1-ом шаге.

  • Запустите полную инсталяцию Access, это даст вам уверенность, что вы получите все нужные добавки (add-ins). По крайней мере вам будут необходимы поддержка ODBC и администратор связанных таблиц.

  • И теперь самое интересное! Создайте новую базу данных Access. В окне таблицы щёлкните правой кнопкой мышки и выберите Link Tables (Связать Таблицы), либо из файлового меню выберите Get External Data (Получить Внешние Данные) и затем Link Tables. В появившемся окне просмотра файлов выберите файлы типа ODBC. Выберите системный dsn и имя вашего dsn, созданного на 3-ем шаге. Выберите таблицу для связи, нажмите OK и вуаля! Теперь вы можете открыть таблицу и добавить/удалить/отредактировать данные на вашем MySQL сервере! Вы также можете строить запросы, импортировать/экспортировать таблицы в MySQL, создавать формы и отчёты, и т.д.

Полезные Советы и Трюки:

  • Вы можете построить ваши таблицы в Access, экспортировать их в MySQL и затем привязать их назад. Это убыстряет создание таблиц.

  • При создании таблиц в Access, вы должны определить первичный ключ, чтобы иметь доступ к таблице по записи. Убедитесь что вы создали первичный ключ в MySQL перед тем как привязать таблицу к Access.

  • Если вы изменяете таблицу в MySQL, то вы должны связать её с Access по-новой. Идите в tools>add-ins>linked table manager, следуйте к вашему ODBC DSN, и выберите оттуда таблицу для пересвязки. Там же вы можете изменить источник вашего dsn, для этого, перед тем как нажать OK, просто пометьте "always prompt for new location" (всегда запрашивать новое местонахождение).

3. Я обновился до PHP 4 и теперь mysql постоянно выдает "Warning: MySQL: Unable to save result set in ..." (Предупреждение: MySQL: Не могу сохранить результат в ...). Что это?

Вероятнее всего PHP 4 был скомпилирован с опцией --with-mysql без задания пути к MySQL. Это означает, что PHP использует его встроенную клиентскую библиотеку MySQL. Если на вашей системе выполняются приложения (такие как PHP 3, в виде паралельного модуля Apache, или auth-mysql), которые используют другие версии MySQL клиентов, то возникает конфликт между двумя разными версиями этих клиентов.

Обычно, перекомпиляция PHP 4 с указанием пути к MySQL в опции '--with-mysql=/your/path/to/mysql' решает эту проблему.

4. Клиентские библиотеки MySQL больше не включены в PHP 5, как это отразится на мне? Могу ли я всё так же использовать MySQL c PHP? Я пытаюсь работать с MySQL и получаю ошибки "function undefined" (функция неопределена), что выдаёт их?

Да. PHP всегда будет поддерживать MySQL в том или ином виде. Единственное что изменилось в PHP 5 - это то, что мы больше не поставляем саму клиентскую библиотеку. Вот некоторые причины для этого:

  • Сегодня клиентские библиотеки уже установлены на большинстве систем.

  • Учитывая предыдущий пункт, имея несколько версий, проще запутаться. Например, если вы компонуете mod_auth_mysql с одной версией, а PHP с другой, и затем разрешаете оба в Apache, то вы получите хороший жирный крах. Также, поставляемые библиотеки не всегда дружат с установленной серверной версией. Наиболее очевидный симптом этого - разногласие по тому где искать файл mysql.socket (файл Unix сокета).

  • Также поддержка была вялой и отставала от релизов всё больше и больше.

  • Последующие версии библиотеки будут под GPL и мы не можем поставлять библиотеку под GPL с проектом лицензируемым по типу BSD/Apache. Поэтому полный разрыв в PHP 5 видится как самый лучший вариант.

На самом деле это заденет не так уж много людей. Пользователи Unix, по крайней мере те, кто знает что они делают, всегда были склонны собирать PHP с уже установленной на их системе библиотекой libmesqlclient, просто задав опцию --with-mysql=/usr при сборке. Пользователи Windows могут включить расширение php_mysql.dll внутри php.ini. Также убедитесь, что libmysql.dll доступен в системном PATH. О том как - читайте FAQ: установка системного PATH в Windows. Так как libmysql.dll (и многие другие PHP файлы) находится в папке PHP, вам лучше добавить PHP папку в ваш системный PATH.

5. После установки поддержки разделения в MySQL, Apache выдаёт дампы сразу после загрузки libphp4.so. Можно ли это исправить?

Это происходит если вы скомпоновали ваши библиотеки MySQL с pthreads. Проверьте используя ldd. Если это так, скомпилируйте MySQL из исходников или перекомпилируйте исходный rpm, отключив поточный код клиента в файле спецификации. Любой из этих вариантов исправит проблему. Затем перекомпилируйте PHP с новыми библиотеками MySQL.

6. Почему я получаю ошибки типа "Warning: 0 is not a MySQL result index in <file> on line <x>" или "Warning: Supplied argument is not a valid MySQL result resource in <file> on line <x>?

Вы пытаетесь использовать идентификатор результата, который равен 0. 0 означает что ваш запрос неудался по какой-либо причине. Вам необходимо сделать проверку на ошибки после того как вы послали ваш запрос и перед тем как вы пытаетесь использовать возвращённый идентификатор результата. Правильный способ для этого выглядит примерно как следующий код:
<?php

$result
= mysql_query("SELECT * FROM tables_priv");
if (!
$result) {
    echo
mysql_error();
    exit;
}
?>
или
<?php

$result
= mysql_query("SELECT * FROM tables_priv")
    or die(
"Bad query: " . mysql_error());
?>