Я пытаюсь подключиться к своему локальному серверу 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-разрядная версия.
Что я сделал:
- Включен IIS, обеспечивающий работу CGI/Fast CGI.
- Установлена версия PHP 8.1.1 без поддержки потоков x64 в C:\Program Files\PHP-8.1.1.
- В C:\Program Files\PHP-8.1.1 переименован файл php.ini-development в php.ini.
- В файле php.ini раскомментировал директиву extension_dir="ext".
- Скачал php_wincache.dll и добавил его в каталог ext по умолчанию PHP.
- В раздел Dynamic Extensions файла php.ini добавлена строка extension=php_wincache.dll.
- Установил PHPManagerForIIS_V1.5.0 и соответствующим образом настроил IIS, чтобы PHP можно было размещать через IIS. Также здесь включено расширение php_wincache.dll.
- Установлен MSSQL Server 2019 Developer Edition вместе с соответствующей Management Studio.
- Создал соответствующую базу данных и таблицы в SQL Server, к которым я хочу подключиться с PHP.
- Убедитесь, что на моем ПК установлен драйвер Microsoft ODBC 17 для SQL Server, который требуется для PHP.
- На моем ПК установлен собственный клиент Microsoft SQL Server 2012, что требуется для PHP.
- Загрузил драйверы Microsoft для PHP для SQL Server 5.9 и извлек его содержимое. Скопировал файл с именем php_sqlsrv_80_nts_x64.dll из пакета и вставил его в каталог ext по умолчанию PHP.
- Добавлена строка extension=php_sqlsrv_80_nts_x64.dll в разделе динамических расширений файла php.ini.
- В диспетчере IIS через диспетчер PHP включено расширение php_sqlsrv_80_nts_x64.dll.
- Создал файл 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.
?>