Рейтинг:0

PHP не может идентифицировать функцию sqlsrv_connect() при попытке подключения к SQL Server

флаг cn

Я пытаюсь подключиться к своему локальному серверу MSSQL из простого PHP-файла с помощью функции sqlsrv_connect(), но каждый раз, когда я вызываю файл в браузере через localhost, он выдает 500 (внутренняя ошибка сервера), говоря: «Неустранимая ошибка PHP: необработанная ошибка: вызов неопределенной функции sqlsrv_connect() в C:\inetpub\wwwroot\AJAX_Tutorial\get_db_data.php:4». get_db_data.php — это файл, из которого я пытаюсь подключиться к серверу. Похоже, что PHP или локальный хост не могут идентифицировать функцию sqlsrv_connect(). Но что касается меня, я сделал все необходимое, чтобы убедиться, что PHP подключается к SQL Server.

Моя среда: Windows 10 Pro, версия 21H2, 64-разрядная версия.

Что я сделал:

  1. Включен IIS, обеспечивающий работу CGI/Fast CGI.
  2. Установлена ​​версия PHP 8.1.1 без поддержки потоков x64 в C:\Program Files\PHP-8.1.1.
  3. В C:\Program Files\PHP-8.1.1 переименован файл php.ini-development в php.ini.
  4. В файле php.ini раскомментировал директиву extension_dir="ext".
  5. Скачал php_wincache.dll и добавил его в каталог ext по умолчанию PHP.
  6. В раздел Dynamic Extensions файла php.ini добавлена ​​строка extension=php_wincache.dll.
  7. Установил PHPManagerForIIS_V1.5.0 и соответствующим образом настроил IIS, чтобы PHP можно было размещать через IIS. Также здесь включено расширение php_wincache.dll.
  8. Установлен MSSQL Server 2019 Developer Edition вместе с соответствующей Management Studio.
  9. Создал соответствующую базу данных и таблицы в SQL Server, к которым я хочу подключиться с PHP.
  10. Убедитесь, что на моем ПК установлен драйвер Microsoft ODBC 17 для SQL Server, который требуется для PHP.
  11. На моем ПК установлен собственный клиент Microsoft SQL Server 2012, что требуется для PHP.
  12. Загрузил драйверы Microsoft для PHP для SQL Server 5.9 и извлек его содержимое. Скопировал файл с именем php_sqlsrv_80_nts_x64.dll из пакета и вставил его в каталог ext по умолчанию PHP.
  13. Добавлена ​​строка extension=php_sqlsrv_80_nts_x64.dll в разделе динамических расширений файла php.ini.
  14. В диспетчере IIS через диспетчер PHP включено расширение php_sqlsrv_80_nts_x64.dll.
  15. Создал файл phpinfo.php в корне IIS, который успешно запустился, но не нашел упоминания о wincache и sqlsrvin.

После описанных выше шагов я запустил реальный PHP-файл, пытаясь подключиться к SQL Server, но он выдает ошибку, говорящую о том, что не может идентифицировать функцию sqlsrv_connect(). Предполагая, что php_sqlsrv_80_nts_x64.dll не загружается во время запуска PHP, я запустил php --ini в командной строке. Вот когда выбрасываются следующие сообщения:

Предупреждение PHP: Запуск PHP: невозможно загрузить динамическую библиотеку 'php_wincache.dll' (пробовали: ext\php_wincache.dll (не удалось найти указанный модуль), ext\php_php_wincache.dll.dll (не удалось найти указанный модуль) ) в Неизвестно в строке 0

Предупреждение: запуск PHP: sqlsrv: невозможно инициализировать модуль Модуль скомпилирован с модулем API=20200930 PHP скомпилирован с модулем API=20210902 Эти параметры должны совпадать in Неизвестно в строке 0 Путь к файлу конфигурации (php.ini): Загруженный файл конфигурации: C:\Program Files\PHP-8.1.1\php.ini Сканировать дополнительные файлы .ini в: (нет) Проанализированы дополнительные файлы .ini: (нет)

Однако PHP, похоже, работает нормально, потому что, когда я использовал методы jQuerey AJAX get() и post() из файла HTML для извлечения данных из другого файла PHP, мне это удалось. Никаких исключений тогда не было.

Итак, что мне не хватает сейчас, когда ни php_wincache.dll, ни sqlsrv не загружаются во время запуска PHP, и я не могу подключить SQL Server из файла PHP? Поскольку я новичок в jQuery AJAX и PHP, я не очень разбираюсь в их тонкостях и, следовательно, застрял с проблемой в течение последних четырех дней. Я использовал все ресурсы в моей руке, но ничего не работает. Пожалуйста помоги. Из-за этого я не могу выполнять свои задачи.

Спасибо и С уважением!

код get_db_data.php:

<?php
    $serverName = "(local)";    // Optionally use port number (1433 by default).
    $connectionString = array("Database"=>"TestDB");    // Connection string.
    $conn = sqlsrv_connect($serverName, $connectionString); // Connect using Windows Authentication.

    if($conn === false) {
        echo "Connection could not be established.<br/>";
        die(print_r(sqlsrv_errors(), true));
    } else {
        echo "Connection established successfuly.<br/>";
    }

    sqlsrv_close($conn);    // Close connection resources.
?>
флаг jp
У вас разные версии API
флаг cn
Различные версии API чего? Что касается документации PHP и MS-SQL Server, я использую PHP 8.1.1, который содержит php8.dll и соответствующий драйвер SQL Server, то есть SQLSRV59. Вот ссылка для PHP https://windows.php.net/download#php-8.1 и вот ссылка для драйвера SQL Server, рекомендованного для PHP 8.0 https://docs.microsoft.com/en-us/sql/connect/ php/system-requirements-for-the-php-sql-driver?redirectedfrom=MSDN&view=sql-server-ver15. Единственная разница в том, что я использую PHP 8.1.1.
флаг cn
Но если вы перейдете по ссылке для драйвера SQL Server, в разделе «Драйверы Microsoft 5.9 для PHP для SQL Server» прокрутите вниз до версии PHP 8.0. Там написано, что dll драйвера можно использовать с 64-битной php8.dll, и это именно то, что использует мой PHP 8.1.1, то есть php8.dll. Вот почему я скачал этот драйвер. Так что ты предлагаешь мне делать сейчас? Удалить мою текущую установку PHP 8.1.1 и вернуться к PHP 8.0?
флаг cn
Более того, приведенное выше предупреждение об ошибке также отображается для «отсутствующей» php_wincache.dll, которая фактически присутствует в каталоге ext PHP. Так почему же он выдает ошибку «невозможно загрузить динамическую библиотеку» и для php_wincache.dll? Любое предложение, пожалуйста?
флаг jp
Невозможно загрузить модуль, так как он не соответствует версии API.
Рейтинг:2
флаг jp

У тебя есть Неустранимая ошибка PHP: необработанная ошибка: вызов неопределенной функции sqlsrv_connect() так как sqlsrv модуль не был загружен. Модуль не был загружен, потому что он скомпилировано с модулем API=20200930 в то время как ваш PHP скомпилирован с модулем API=20210902 как ясно говорит ваше сообщение об ошибке. PHP ожидает, что модули будут скомпилированы с той же версией API, что и сам PHP. Вам нужно либо получить ту же версию PHP, для которой был скомпилирован модуль, либо получить модуль, скомпилированный для вашей версии PHP.

флаг cn
Вы были правы, проблема была в несоответствии версий. Пока я использовал PHP-8.1, я скачал SQLSRV для PHP-8.0. Из-за этого несоответствия файл драйвера не загружался во время запуска PHP на сервере. Переход на PHP-8.0 решил проблему. Спасибо, что указали на суть проблемы.
Рейтинг:1
флаг in

Я думаю https://github.com/microsoft/msphpsql/releases/download/v5.10.0-beta2/Windows-8.1.zip это то, что вам нужно.

попробуйте это в вашем php.ini

расширение = php_pdo_sqlsrv_81_ts.dll
расширение = php_sqlsrv_81_ts.dll
флаг cn
Несоответствие версии было проблемой. Пока я использовал PHP-8.1, драйвер SQLSRV был для PHP-8.0, из-за чего PHP не мог загрузить драйвер во время запуска. Спасибо, что поделились ссылкой на SQLSRV для PHP-8.1. Не удалось найти его на официальной странице Microsoft.

Ответить или комментировать

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