Учебник РНР
Назад Вперёд

Глава 47. Вопросы о базах данных

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

1. Я слышал, что можно получать доступ к Microsoft SQL Server из PHP. Как?
2. Можно ли получать доступ к БД Microsoft Access?
3. Я обновил до PHP 4, а как теперь mysql будет сообщать мне "Warning!: MySQL: Unable to save result set in ..." ?
4. После установки совместной/shared поддержки MySQL, Apache передаёт ядро в дамп, как только загружается libphp4.so. Можно ли это исправить?
5. Почему я получаю ошибку, которая выглядит примерно так: "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 Server из PHP. Как?

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

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

2. Можно ли получать доступ к БД Microsoft Access?

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

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

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

Опцией, которая была успешно опробована, является использование MySQL и его MyODBC-драйверов под Windows и синхронизация баз данных. Steve Lawrence пишет:

  1. Установите MySQL на вашей платформе в соответствии с инструкциями к MySQL, которые находятся на www.mysql.com. Никакого специального конфигурирования не требуется, за исключением случая, когда вы устанавливаете БД и конфигурируете бюджет пользователя - тогда вы должны поместить % в поле host или имя хоста Windows-копьютера, доступ к которому вы хотите выполнять из MySQL. Запомните имя вашего сервера, username и password.
  2. Загрузите драйвер MyODBC для Windows с сайта MySQL. Последний релиз это myodbc-2_50_19-win95.zip (для NT также имеется, как и исходный код). Установите его на вашей Windows-машине. Вы можете протестировать эту операцию с помощью прилагаемой утилиты.
  3. Создайте пользовательский или системный dsn в ODBC administrator, размещённом в control panel. Введите dsn-имя, имя вашего хоста, user name, password, port, etc для вашей БД MySQL, сконфигурированной на шаге 1.
  4. Произведите полную установку Access, это гарантирует, что у вас будут все необходимые add-ins ... как минимум, вам необходима поддержка ODBC и менеджер связанных таблиц/linked table manager.
  5. Создайте новую access-БД. В окне таблицы щёлкните правой кнопкой мыши и выберите Link Tables, либо в меню file выберите Get External Data, а затем - Link Tables. Когда появится бокс поиска файлов, выберите тип файлов: ODBC. Выберите System dsn и имя вашего dsn, созданного на шаге 3. Выберите таблицу для привязки, нажмите OK. теперь вы можете открыть таблицу и добавлять/удалят/редактировать данные на вашем MySQL-сервере! Вы можете также создавать запросы/queries, таблицы импорта/экспорта в MySQL, создавать формы и отчёты etc.

Подсказки и замечания:

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

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

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

3. Я обновил до PHP 4, а как теперь mysql будет сообщать мне "Warning!: MySQL: Unable to save result set in ..." ?

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

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

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

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

5. Почему я получаю ошибку, которая выглядит примерно так: "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>"?

Вы пытаетесь использовать result-идентификатор 0.
0 указывает, что ваш запрос не выполнен по каким-то причинам. Необходимо проверить наличие ошибок после отправки запроса/query и перед попыткой использования возвращённого result identifier. Подходящий способ - сделать это кодом наподобие следующего:
$result = mysql_query("SELECT * FROM tables_priv");
if (!$result) {
    echo mysql_error();
    exit;
}

или

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

НазадОглавление Вперёд
Получение PHPВверх Инсталяция