Ошибка sqlsetconnectattr для драйвера php

PHP Driver version or file name

5.8,5.9

SQL Server version

2014,2017

Client operating system

Microsoft Windows 10 20H2

PHP version

7.4

Microsoft ODBC Driver version

11, 13,17

Table schema

-

Problem description

PHP DB layer libs (example) as well as raw sqlsrv/pdo_sqlsrv can’t connect to the sql server due to Driver's SQLSetConnectAttr failed, even when given a freshly installed sql server express 2017

Expected behavior and actual behavior

Expected: connection succeeds
Actual behavior, connection fails with Driver's SQLSetConnectAttr failed

Repro code or steps to reproduce

Check the sample library test suite above

Note: iirc, version 5.2 via php 7.2 worked correctly & eastablished connections just fine

I am trying to access a SQL database from my PHP code. I am currently using XAMPP 8.0.6 with PHP 8.0.6. This is also not working on a machine with PHP 7.4.19 and the relevant extensions installed.

Installed drivers / extensions:

  • sql-srv: php_sqlsrv_80_ts_x64.dll
  • sql-pdo: php_pdo_sqlsrv_80_ts_x64.dll
  • OBDC drivers: 10.0.19041.1

The sqlsrv and sql-pdo are placed correctly in the php.ini. Connecting to the database using the OBDC gui, I get a successful connection.

The code that I am trying to get data from the database with is:

      function mssqlConnect(){
        $ServerName = "xxx";
        $ConnectionTimeout = 30;
        $connectionOptions = ["Database"=>"database","UID"=>"user","PWD"=>"password", "LoginTimeout" => $ConnectionTimeout];
        
        $sqlconn = sqlsrv_connect($ServerName,$connectionOptions);
        if( $sqlconn ) {
          echo "Connection established";
        } else {
          echo "Connection could not be established";
          die( print_r( sqlsrv_errors(), true));
        }
      }

When attempting to run this, I get this following message:

Connection could not be established. 
Array (
[0] => Array (
[0] => IM006
[SQLSTATE] => IM006
[1] => 0
[code] => 0
[2] =>
[Microsoft]
[ODBC Driver Manager] Driver's SQLSetConnectAttr failed
)
[1] => Array (
[0] => 01000
[SQLSTATE] => 01000
[1] => 5701
[code] => 5701
[2] =>
[Microsoft]
[ODBC Driver 11 for SQL Server]
[SQL Server]Changed database context to 'database'.
)
[2] => Array (
[0] => 01000
[SQLSTATE] => 01000
[1] => 5703
[code] => 5703
[2] =>
[Microsoft]
[ODBC Driver 11 for SQL Server]
[SQL Server]Changed language setting to us_english.
)

It’s able to reach out to the database just fine. When I try to use a bogus user/pass I get a 401 error [Microsoft][ODBC Driver 11 for SQL Server][SQL Server]Login failed for user 'other user'

A page I found said to disable pooling, I set a ConnectionPooling option in the $conectionOptions array with both a 0 and 1 and am getting the same result. I also tried by changing it via the OBDC GUI to the same result.

I am unable to successfully connect to the database. I also cannot find any related documentation to the error codes that I am receiving. Thank you

I run SQL Server 2016. I try to connect to it via a PHP script (PHP version 8). I did install the drivers and added the path in the php.ini (same version as my PHP version):

...
extension=pdo_sqlsrv_80_nts
extension=pdo_sqlsrv_80_ts
extension=sqlsrv_80_nts
extension=sqlsrv_80_ts
...

Here is my script:

$serverName = "<ServerName>";
$connectionInfo = array( "Database"=>"<database>", "UID"=>"<user>", "PWD"=>"<pwd>");
$conn = sqlsrv_connect( $serverName, $connectionInfo);

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

I get the following error:

Array
(
    [0] => Array
        (
            [0] => IM006
            [SQLSTATE] => IM006
            [1] => 0
            [code] => 0
            [2] => [Microsoft][ODBC Driver Manager] Driver's SQLSetConnectAttr failed
            [message] => [Microsoft][ODBC Driver Manager] Driver's SQLSetConnectAttr failed
        )

    [1] => Array
        (
            [0] => 01000
            [SQLSTATE] => 01000
            [1] => 5701
            [code] => 5701
            [2] => [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]Changed database context to '<database>'.
            [message] => [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]Changed database context to '<database>'.
        )

    [2] => Array
        (
            [0] => 01000
            [SQLSTATE] => 01000
            [1] => 5703
            [code] => 5703
            [2] => [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]Changed language setting to us_english.
            [message] => [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]Changed language setting to us_english.
        )

)

Any idea what could be wrong?
Thank you for your help

phpinfo()

phpinfo()

I run SQL Server 2016. I try to connect to it via a PHP script (PHP version 8). I did install the drivers and added the path in the php.ini (same version as my PHP version):

...
extension=pdo_sqlsrv_80_nts
extension=pdo_sqlsrv_80_ts
extension=sqlsrv_80_nts
extension=sqlsrv_80_ts
...

Here is my script:

$serverName = "<ServerName>";
$connectionInfo = array( "Database"=>"<database>", "UID"=>"<user>", "PWD"=>"<pwd>");
$conn = sqlsrv_connect( $serverName, $connectionInfo);

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

I get the following error:

Array
(
    [0] => Array
        (
            [0] => IM006
            [SQLSTATE] => IM006
            [1] => 0
            [code] => 0
            [2] => [Microsoft][ODBC Driver Manager] Driver's SQLSetConnectAttr failed
            [message] => [Microsoft][ODBC Driver Manager] Driver's SQLSetConnectAttr failed
        )

    [1] => Array
        (
            [0] => 01000
            [SQLSTATE] => 01000
            [1] => 5701
            [code] => 5701
            [2] => [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]Changed database context to '<database>'.
            [message] => [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]Changed database context to '<database>'.
        )

    [2] => Array
        (
            [0] => 01000
            [SQLSTATE] => 01000
            [1] => 5703
            [code] => 5703
            [2] => [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]Changed language setting to us_english.
            [message] => [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]Changed language setting to us_english.
        )

)

Any idea what could be wrong?
Thank you for your help

phpinfo()

phpinfo()

Я пытаюсь получить доступ к базе данных SQL из моего кода PHP. В настоящее время я использую XAMPP 8.0.6 с PHP 8.0.6. Это также не работает на машине с установленным PHP 7.4.19 и соответствующими расширениями.

Установленные драйверы / расширения:

  • sql-srv: php_sqlsrv_80_ts_x64.dll
  • sql-pdo: php_pdo_sqlsrv_80_ts_x64.dll
  • Драйверы OBDC: 10.0.19041.1

Sqlsrv и sql-pdo правильно размещены в php.ini. Подключившись к базе данных с помощью графического интерфейса OBDC, я получаю успешное соединение.

Код, с помощью которого я пытаюсь получить данные из базы данных:

      function mssqlConnect(){
        $ServerName = "xxx";
        $ConnectionTimeout = 30;
        $connectionOptions = ["Database"=>"database","UID"=>"user","PWD"=>"password", "LoginTimeout" => $ConnectionTimeout];
        
        $sqlconn = sqlsrv_connect($ServerName,$connectionOptions);
        if( $sqlconn ) {
          echo "Connection established";
        } else {
          echo "Connection could not be established";
          die( print_r( sqlsrv_errors(), true));
        }
      }

При попытке запустить это я получаю следующее сообщение:

Connection could not be established. 
Array (
[0] => Array (
[0] => IM006
[SQLSTATE] => IM006
[1] => 0
[code] => 0
[2] =>
[Microsoft]
[ODBC Driver Manager] Driver's SQLSetConnectAttr failed
)
[1] => Array (
[0] => 01000
[SQLSTATE] => 01000
[1] => 5701
[code] => 5701
[2] =>
[Microsoft]
[ODBC Driver 11 for SQL Server]
[SQL Server]Changed database context to 'database'.
)
[2] => Array (
[0] => 01000
[SQLSTATE] => 01000
[1] => 5703
[code] => 5703
[2] =>
[Microsoft]
[ODBC Driver 11 for SQL Server]
[SQL Server]Changed language setting to us_english.
)

Он может без проблем обращаться к базе данных. Когда я пытаюсь использовать поддельный пользователь / пароль, я получаю ошибку 401 [Microsoft][ODBC Driver 11 for SQL Server][SQL Server]Login failed for user 'other user'

На странице, на которой я обнаружил, говорится об отключении пула, я установил параметр ConnectionPooling в массиве $ conectionOptions как 0, так и 1, и получаю тот же результат. Я также попытался изменить его через графический интерфейс OBDC к тому же результату.

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

2 ответа

Лучший ответ

Попробуйте обновить драйверы SQL Server !!

Вероятно, вы сможете найти эти драйверы в Google «Download ODBC Driver for SQL Server«. В моем случае проблема была устранена в версии 17 или выше.

Также попробуйте Пример PDO-SQL-Server (возможно, реализация PDO работает).

Примере:

<?php  
function mssqlConnect() {
  $ServerName = "xxx";

  try {  
    $conn = new PDO( "sqlsrv:server=$ServerName;Database = database", 'user', 'password');   
    $conn->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );   
  } catch( PDOException $e ) {  
     die( "Connection could not be established - " . $e->getMessage() );   
  } 

  echo "Connection established";
  return $conn;
}

function findEmployee($name) {
  $conn = mssqlConnect();
  $stmt = $conn->prepare('SELECT * FROM employees WHERE name = :name');
  if ($stmt->execute(array('name' => $name))) {
    while($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
      // do something with $row
    }
  } else {
    echo 'Query error - ' . join(' ', $stmt->errorInfo());
  }

  // Close connection which execute created.
  $stmt->closeCursor();
}

?>  


1

Top-Master
22 Июн 2021 в 12:28

Симптомы

При попытке установить атрибут подключение подключение ODBC, где пул соединений включен с помощью API-интерфейса ODBC драйвер драйвера ODBC для Microsoft SQL Server, появляется следующее сообщение об ошибке:

IM006 сбой SQLSetConnectAttr драйвер [Microsoft] [Диспетчер драйверов ODBC]

Примечание. В документации драйвера ODBC упоминания, что сообщение является информационное сообщение. Тем не менее сообщение как сообщение об ошибке.

Это может происходить, если выполняются все следующие условия:

  • С помощью API-интерфейса ODBC драйвер помощью SQLConnect создания подключения с именем источника данных (DSN).

  • Одно из свойств источника данных (например, вариант использования ANSI значения NULL, шаблоны и предупреждения ) по умолчанию отключено.

  • Пул соединений включен для дескриптора среды.

  • После открытия подключения с помощью помощью SQLConnect устанавливается атрибут уровня изоляции транзакции подключения.

  • Выполнить транзакцию базы данных.

Временное решение

Чтобы обойти эту проблему, выполните следующие действия.

  1. Отключите параметр для подключения ODBC пула подключений.

    Примечание. Отключение пула подключений может повлиять на производительность приложения.

  2. После фиксации транзакции, не включить параметр auto commit.

  3. Чтобы установите уровень изоляции транзакций перед открытием подключения ODBC.

  4. Используйте соединения вместо получения подключения ODBC DSN.

Решение

Существует исправление от корпорации Майкрософт. Однако данное исправление предназначено для устранения только проблемы, описанной в этой статье. Применяйте данное исправление только в тех системах, которые имеют данную проблему.

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

Примечание. Если наблюдаются другие проблемы или необходимо устранить неполадки, вам может понадобиться создать отдельный запрос на обслуживание. Стандартная оплата за поддержку будет взиматься только за дополнительные вопросы и проблемы, которые не соответствуют требованиям конкретного исправления. Полный список телефонов поддержки и обслуживания клиентов корпорации Майкрософт или создать отдельный запрос на обслуживание посетите следующий веб-узел корпорации Майкрософт:

http://support.microsoft.com/contactus/?ws=supportПримечание. В форме «Пакет исправлений доступен для скачивания» отображаются языки, для которых доступно исправление. Если нужный язык не отображается, значит исправление для данного языка отсутствует. Английская версия данного исправления содержит атрибуты файла (или более поздней версии), приведенные в следующей таблице. Дата и время для этих файлов указаны в формате общего скоординированного времени (UTC). При просмотре сведений о файле, он преобразуется в локальное время. Чтобы узнать разницу между временем по Гринвичу и местным временем, следует использовать
Часовой пояс вкладка «Дата и время» панели управления.

MDAC 2.7 SP1

Date Time Version Size File name
———————————————————
13-Oct-2002 19:24 90,112 Dahotfix.exe
03-Jul-2003 04:09 2000.81.9031.51 372,736 Sqlsrv32.dll

MDAC 2.8

Date Time Version Size File name
———————————————————
31-Mar-2004 16:44 2000.85.1040.0 24,576 Odbcbcp.dll
31-Mar-2004 16:43 2000.85.1040.0 401,408 Sqlsrv32.dll

Примечание. Список всех доступных исправлений для компонентов MDAC 2.8 щелкните следующий номер статьи базы знаний Майкрософт:

ИСПРАВИТЬ 839801 : исправления для компонентов MDAC 2.8

Статус

Корпорация Майкрософт подтвердила, что это является проблемой в продуктах Майкрософт, перечисленных в разделе «Относится к». Эта ошибка была исправлена в Microsoft Access компонент 2.7 Пакет обновления 1 обновление данных и компоненты доступа к данным MDAC 2.8.

Дополнительные сведения

Возникает проблема, описанное в разделе «Проблема» данной статьи, только при наличии доступа к данным компонента (MDAC) 2.7 на компьютере установлен Пакет обновления 1.

Действия по воспроизведению проблемы

Чтобы воспроизвести проблему, используйте следующий код:

// ODBCTestCase.cpp : Defines the entry point for the console application.//

#include "stdafx.h"
#include "windows.h"
#include "sqlext.h"
#include "sql.h"
#include "stdlib.h"

void GetSQLError();
long InitializeEnvironment();
long Connect(BOOL lbUseDSN);
long Disconnect();
int ExecuteProcedure();

SQLHENV ghEnvironment = NULL;
SQLHDBC ghConnection = NULL;
HSTMT ghStatement = NULL;
/**********************************************
* main
**********************************************/
int main(int argc, char* argv[])
{
BOOL lbTransaction = TRUE;
BOOL lbUseDSN = FALSE;
long lValue =0;

if(argc > 1)
{
if(strcmp(argv[1], "DSN") == 0)
lbUseDSN = TRUE;
if(argc > 2)
{
if(strcmp(argv[2], "TRAN") == 0)
lbTransaction = TRUE;
}
}

if(InitializeEnvironment() == 0)
{
for(long llSub = 0; llSub < 2; llSub++)
{
if(Connect(lbUseDSN) == 0)
{

if(lbTransaction)
SQLSetConnectOption(ghConnection, SQL_AUTOCOMMIT, SQL_AUTOCOMMIT_OFF);

//SQLGetConnectAttr(ghConnection,SQL_ATTR_AUTOCOMMIT,&lValue,0,NULL);

ExecuteProcedure();

if(lbTransaction)
{
SQLTransact(ghEnvironment, ghConnection, SQL_COMMIT);

//If you do not call the following, the problem does not occur:
SQLSetConnectOption(ghConnection, SQL_AUTOCOMMIT, SQL_AUTOCOMMIT_ON);

//If you call the following the problem does not occur:
//SQLSetConnectOption(ghConnection, SQL_AUTOCOMMIT, SQL_AUTOCOMMIT_OFF);
//SQLGetConnectAttr(ghConnection,SQL_ATTR_AUTOCOMMIT,&lValue,0,NULL);
}

Disconnect();
}
}
SQLFreeHandle(SQL_HANDLE_ENV, ghEnvironment);
}

return 0;
}

/**********************************************
* InitializeEnvironment
**********************************************/
long InitializeEnvironment()
{
if (!SQL_SUCCEEDED(SQLSetEnvAttr(NULL,
SQL_ATTR_CONNECTION_POOLING,
(SQLPOINTER)SQL_CP_ONE_PER_DRIVER,
SQL_IS_INTEGER)))
{
GetSQLError();
return 8;
}

if(!SQL_SUCCEEDED(SQLAllocHandle(SQL_HANDLE_ENV, NULL, &ghEnvironment)))
{
GetSQLError();
return 8;
}
if(!SQL_SUCCEEDED(SQLSetEnvAttr(ghEnvironment, SQL_ATTR_ODBC_VERSION, (SQLPOINTER) SQL_OV_ODBC2, SQL_IS_INTEGER)))
{
GetSQLError();
return 8;
}
if (!SQL_SUCCEEDED(SQLSetEnvAttr(ghEnvironment,
SQL_ATTR_CP_MATCH,
(SQLPOINTER) SQL_CP_STRICT_MATCH ,
//(SQLPOINTER) SQL_CP_RELAXED_MATCH ,
SQL_IS_INTEGER)))
{
GetSQLError();
return 8;
}

return 0;
}
/**********************************************
* Connect
**********************************************/
long Connect(BOOL lbUseDSN)
{
SQLCHAR lszOutConnectString[1024];
SQLSMALLINT llReturnLength;
SQLAllocHandle(SQL_HANDLE_DBC, ghEnvironment, &ghConnection);

// If you set the isolation before opening the connection, no error reported.
// Customer cannot set this attribute before opening connection because the object
//is running under COM+, and under COM+ isolation levels automatically are set to serializable
//if(!SQL_SUCCEEDED(::SQLSetConnectAttr(ghConnection, SQL_ATTR_TXN_ISOLATION, (SQLPOINTER)SQL_TXN_READ_COMMITTED , SQL_IS_INTEGER)))
//{
// GetSQLError();
// return 8;
//}

if(lbUseDSN)
{
int iReturn = ::SQLConnect(ghConnection,
(SQLCHAR*)"LocalCPR",
SQL_NTS,
(SQLCHAR*)"sa",
SQL_NTS,
(SQLCHAR*)"password1",
SQL_NTS);
if(!SQL_SUCCEEDED(iReturn))
{
GetSQLError();
return 8;
}
}
else
{
if(!SQL_SUCCEEDED(SQLDriverConnect(ghConnection,
NULL,
(SQLCHAR*)"DSN=LocalCPR;UID=sa;PWD=password1;",
SQL_NTS,
lszOutConnectString,
1024,
&llReturnLength,
SQL_DRIVER_NOPROMPT)))
{
GetSQLError();
return 8;
}
}

SQLAllocStmt(ghConnection, &ghStatement);

//If you set the isolation after you open the connection, you see the problem.
if(!SQL_SUCCEEDED(::SQLSetConnectAttr(ghConnection, SQL_ATTR_TXN_ISOLATION, (SQLPOINTER)SQL_TXN_READ_COMMITTED , SQL_IS_INTEGER)))
{
GetSQLError();
return 8;
}
return 0;
}
/**********************************************
* Disconnect
**********************************************/
long Disconnect()
{
if(ghStatement)
{
if(!SQL_SUCCEEDED(SQLFreeHandle(SQL_HANDLE_STMT, ghStatement)))
{
GetSQLError();
return 8;
}
ghStatement = NULL;
}

if(ghConnection)
{
::SQLDisconnect(ghConnection);

if(!SQL_SUCCEEDED(SQLFreeHandle(SQL_HANDLE_DBC, ghConnection)))
{
GetSQLError();
return 8;
}
ghConnection = NULL;
}
return 0;
}
/**********************************************
* ExecuteProcedure
**********************************************/
int ExecuteProcedure()
{
SQLINTEGER mlIndicator = 0;
SQLRETURN lnSqlRetCd = SQL_SUCCESS;
::SQLFreeStmt(ghStatement, SQL_CLOSE);
::SQLFreeStmt(ghStatement, SQL_UNBIND);

/*****************************************************************/
/* Execute Procedure
/*****************************************************************/
RETCODE llDbRetCd = SQLExecDirect(ghStatement, (SQLCHAR*)"SELECT * From Table1", SQL_NTS);
if((llDbRetCd != SQL_SUCCESS) && (llDbRetCd != SQL_SUCCESS_WITH_INFO))
{
GetSQLError();
return 8;
}

/*****************************************************************/
/* Bind return Value
/*****************************************************************/
char lszReturnBuf[300];
SDWORD lSts;

llDbRetCd = SQLBindCol(ghStatement, 1, SQL_C_TCHAR, &lszReturnBuf, 300, &lSts);

if ((llDbRetCd != SQL_SUCCESS) && (llDbRetCd != SQL_SUCCESS_WITH_INFO))
{
GetSQLError();
return 8;
}

/*****************************************************************/
/* Fetch Result
/*****************************************************************/
llDbRetCd = SQLFetch(ghStatement);
if ((llDbRetCd != SQL_SUCCESS) && (llDbRetCd != SQL_SUCCESS_WITH_INFO))
{
GetSQLError();
return 8;
}

printf("Output Value : %sn",lszReturnBuf);
return 0;
}

/**********************************************
* GetSQLError
**********************************************/
void GetSQLError()
{
long llDbErrCd = 0;
short llRetMsgLen = 0;
char lszSqlErrMsg[255];
char lszSqlMsg[255];

SQLError(ghEnvironment,
ghConnection,
ghStatement,
(SQLCHAR*) lszSqlErrMsg,
&llDbErrCd,
(SQLCHAR*) lszSqlMsg,
255,
&llRetMsgLen);
printf(lszSqlErrMsg);
printf(lszSqlMsg);
}


Technical /
August 22, 2008 /

/

Today I ran into a very strange problem with one of my web app’s. After migrating it to a new server, a ODBC link stopped working. The only differences between the two servers were the OS: XP on one and 2003 R2 on the other.

The error’s weren’t telling me much:

ERROR [HYC00] [MERANT][ODBC SQLBase driver]Optional feature not implemented.
ERROR [HY000] [MERANT][ODBC SQLBase driver][SQLBase]00134 SQL CNO ERROR.SQL NOT FOUND LOOKING UP ERROR 09293
ERROR [IM006] [MERANT][ODBC SQLBase driver]Driver’s SQLSetConnectAttr failed.
ERROR [HYC00] [MERANT][ODBC SQLBase driver]Optional feature not implemented.
ERROR [HY000] [MERANT][ODBC SQLBase driver][SQLBase]00134 SQL CNO ERROR.SQL NOT FOUND LOOKING UP ERROR 09293
ERROR [IM006] [MERANT][ODBC SQLBase driver]Driver’s SQLSetConnectAttr failed.

After trying a lot of different things, the solution was quite simple. Because IIS uses app pools under 2003, the application was running under the “Network Service” account. This account didn’t have enough rights to read the ODBC files (sql.ini and some dll’s). You can solve this by granting the account rights to the files needed (depends on your database manufacturer which you need) or using a dedicated application account to run your application (which I prefer) which has read-only rights to your filesystem (or at least the folders where your config / dll files reside).
Be carefull granting rights to a web application which is available through the Internet! Less is more!

Latest posts

[DevOps] Should you migrate onto YAML release pipelines?

Today I ran into a very strange problem with one of my web app’s. After migrating it to a new server, a ODBC link stopped working. The only differences between the two servers were the OS: XP on one and 2003 R2 on the other.

Устранение проблем с разрешениями, сообщения об ошибках в продуктах Майкрософт и MySQL в Dreamweaver.

Пользовательский интерфейс в Dreamweaver и более поздних версиях стал проще. В результате этого некоторые функции, описанные в этой статье, могут отсутствовать в Dreamweaver и более поздних версиях. Дополнительные сведения см. в этой статье.

Устранение проблем с разрешениями

Одной из наиболее частых проблем являются недостаточные разрешения для папок или файлов. Если база данных расположена на компьютере под управлением Windows 2000 или Windows XP и при попытке просмотра динамической страницы в веб-браузере или интерактивном представлении появляется сообщение об ошибке, то возможной причиной может быть проблема с разрешениями.

Учетная запись Windows, с помощью которой пользователь пытается войти в базу данных, не имеет достаточных прав. Эта учетная запись может быть либо анонимной учетной записью Windows (по умолчанию это IUSR_имя_компьютера), либо учетной записью пользователя, если для доступа к странице требуется проверка подлинности.

Чтобы открыть веб-серверу доступ к файлу базы данных, понадобится предоставить учетной записи «IUSR_имя_компьютера» правильные разрешения. Кроме того, чтобы разрешить запись в базу данных, также нужно настроить определенные разрешения для папки, содержащей эту базу данных.

Если предполагается анонимный доступ к странице, предоставьте учетной записи «IUSR_имя_компьютера» полный доступ к этой папке и файлу базы данных, как описано ниже.

Помимо этого, если путь к базе данных указан в формате UNC (СерверПапка), убедитесь, что в разрешениях для общего ресурса учетной записи «IUSR_имя_компьютера» предоставлен полный доступ. Этот шаг нужно выполнить даже в том случае, если общий ресурс расположен на локальном веб-сервере.

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

Проверка или изменение разрешений для файла базы данных (в Windows XP)

  1. Для изменения разрешений необходимо иметь права администратора на соответствующем компьютере.

  2. Откройте проводник Windows, перейдите к файлу базы данных или папке, содержащей эту базу данных, щелкните правой кнопкой мыши файл или папку и выберите пункт «Свойства».

  3. Перейдите на вкладку «Безопасность».

    Этот шаг применим только в том случае, если используется файловая система NTFS. На компьютерах с файловой системой FAT в этом диалоговом окне вкладки «Безопасность» нет.

  4. Если учетной записи «IUSR_имя_компьютера» нет в списке «Группы или пользователи», нажмите кнопку «Добавить» и добавьте ее.

  5. В диалоговом окне «Выбор пользователей или групп» нажмите кнопку «Дополнительно».

    В диалоговом окне отобразятся дополнительные параметры.

  6. Щелкните «Размещение» и выберите имя компьютера.

  7. Нажмите кнопку «Поиск», чтобы отобразить список учетных записей, связанных с компьютером.

  8. Выберите учетную запись «IUSR_имя_компьютера» и нажмите кнопку «ОК»; затем нажмите «ОК» еще раз, чтобы очистить это диалоговое окно.

  9. Чтобы предоставить учетной записи IUSR неограниченные права доступа, выберите «Полный доступ» и нажмите кнопку «ОК».

Проверка или изменение разрешений для файла базы данных (в Windows 2000)

  1. Для изменения разрешений необходимо иметь права администратора на соответствующем компьютере.

  2. Откройте проводник Windows, перейдите к файлу базы данных или папке, содержащей эту базу данных, щелкните правой кнопкой мыши файл или папку и выберите пункт «Свойства».

  3. Перейдите на вкладку «Безопасность».

    Этот шаг применим только в том случае, если используется файловая система NTFS. На компьютерах с файловой системой FAT в этом диалоговом окне вкладки «Безопасность» нет.

  4. Если учетной записи «IUSR_имя_компьютера» нет в списке учетных записей Windows в диалоговом окне «Разрешения для файлов», нажмите кнопку «Добавить» и добавьте ее.

  5. В диалоговом окне «Выбор пользователей, компьютеров или групп» выберите в меню «Папка» имя компьютера, чтобы отобразить список учетных записей, связанных с компьютером.

  6. Выберите учетную запись «IUSR_имя_компьютера» и нажмите кнопку «Добавить».

  7. Чтобы предоставить учетной записи IUSR все разрешения, в меню «Тип доступа» выберите «Полный доступ» и нажмите кнопку «ОК».

    Для дополнительной безопасности можно отключить разрешение на чтение для веб-папки, содержащей базу данных. То есть просмотр содержимого этой папки будет запрещен, но доступ к базе данных для веб-страниц по-прежнему будет открыт.

    Дополнительные сведения о разрешениях для учетной записи IUSR и веб-сервера см. в следующих статьях раздела TechNote на веб-сайте центра поддержки Adobe.

    • Общие сведения об анонимной проверке подлинности и учетной записи IUSR находятся по адресу: www.adobe.com/go/authentication_ru

    • Подробнее о настройке разрешений веб-сервера IIS см. по адресу: www.adobe.com/go/server_permissions_ru

Устранение неполадок, связанных с сообщениями об ошибках в продуктах Майкрософт

Подобные сообщения об ошибках могут появляться во время запроса динамической страницы с сервера, если сервер IIS (Internet Information Server) используется с базой данных, разработанной корпорацией Майкрософт, например Access или SQL Server.

Корпорация Adobe не предоставляет техническую поддержку для программных продуктов сторонних разработчиков, например для Microsoft Windows и сервера IIS. Если приведенная в данной главе информация не помогла устранить проблему, обратитесь в службу технической поддержки Майкрософт или посетите веб-сайт технической поддержки Майкрософт по адресу: http://support.microsoft.com/.

Дополнительные сведения об ошибках 80004005 см. в статье «Руководство по устранению неполадок в случае появления ошибки 80004005 при работе со страницами ASP и компонентами Microsoft для доступа к данным (Q306518)» на веб-сайте корпорации Майкрософт по адресу: http://support.microsoft.com/default.aspx?scid=kb;ru-ru;Q306518.

[[Ссылка]80004005 — Источник данных не найден и не указан драйвер, используемый по умолчанию]

Эта ошибка возникает при попытке просмотра динамической страницы в веб-браузере или интерактивном представлении. Текст сообщения может отличаться в зависимости от используемой базы данных и веб-сервера. К вариантам этого сообщения об ошибке относятся следующие.

  • 80004005 — Ошибка SQLSetConnectAttr драйвера

  • 80004005 — Общий сбой. Не удается открыть раздел реестра «DriverId»

    Далее перечислены возможные причины и способы решения.

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

  • Возможно, имя DSN задано как DSN пользователя, а не DSN системы. Удалите DSN пользователя и создайте вместо него DSN системы.

Если этого не сделать, дублирующиеся имена DSN вызовут новую ошибку ODBC.

Если используется приложение Microsoft Access, файл базы данных (MDB-файл) может быть заблокирован. Причина блокирования может заключаться в том, что DSN с другим именем уже использует базу данных. Откройте проводник Windows, в папке, в которой расположен файл базы данных (MDB-файл), найдите файл блокировки (LDB-файл) и удалите его. Если другое имя DSN указывает на один и тот же файл базы данных, удалите это имя, чтобы избежать ошибок в дальнейшем. Перезагрузите компьютер после внесения изменений.

[[Ссылка]80004005 — Не удается использовать «(нет данных)»; файл уже используется]

Эта ошибка возникает при использовании базы данных Microsoft Access и попытке просмотра динамической страницы в веб-браузере или интерактивном представлении. Еще один вариант текста этого сообщения об ошибке: «80004005 — Обработчик баз данных Microsoft Jet не может открыть файл (нет данных)».

Возможная причина — неправильно установлены разрешения. Далее перечислены несколько конкретных причин и способов решения.

  • Возможно, учетная запись, используемая сервером IIS (как правило, это учетная запись IUSR), не имеет нужных разрешений Windows для доступа к файловой базе данных или папке, содержащей эту базу данных. Проверьте разрешения учетной записи IIS (IUSR) в диспетчере пользователей.

  • Пользователь может не иметь разрешения на создание или удаление временных файлов. Проверьте разрешения для файла и папки. Убедитесь в наличии разрешения на создание или удаление временных файлов. Временные файлы обычно создаются в той же папке, в которой содержится база данных, но они также могут создаваться и в других папках, например «/Winnt».

  • В Windows 2000 может потребоваться изменить значение времени ожидания для DSN базы данных Access. Чтобы изменить это значение, выберите команды «Пуск» > «Настройка» > «Панель управления» > «Администрирование» > «Источники данных» (ODBC). Откройте вкладку «Система», выделите правильное имя DSN и нажмите кнопку «Настройка». Нажмите кнопку «Параметры» и в поле «Время ожидания страницы» введите значение 5000.

    Если проблемы так и не удалось решить, см. следующие статьи базы знаний Майкрософт:

  • Статья: 80004005 — «Невозможно использовать ‘(неизвестно)’; файл уже используется» по адресу: http://support.microsoft.com/default.aspx?scid=kb;ru-ru;Q174943.

  • Статья: «Сбой подключения к базам данных Microsoft Access в ASP» по адресу: http://support.microsoft.com/default.aspx?scid=kb;ru-ru;Q253604.

  • Статья: «Ошибка «не удается открыть неизвестный файл» при использовании Access» по адресу: http://support.microsoft.com/default.aspx?scid=kb;ru-ru;Q166029.

[[Ссылка]80004005 — Сбой при входе в систему()]

Эта ошибка возникает при использовании сервера Microsoft SQL Server и попытке просмотра динамической страницы в веб-браузере или интерактивном представлении.

Эта ошибка создается сервером SQL Server, если он не принимает либо не распознает учетную запись или введенный пароль (если используется стандартная защита), или же если учетная запись Windows не соответствует учетной записи SQL (если используется встроенная система безопасности).

Далее перечислены возможные решения.

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

  • Если используется встроенная система безопасности, проверьте учетную запись Windows, обращающуюся к странице, и найдите соответствующую ей учетную запись SQL (при наличии).

  • Сервер SQL Server не допускает использование нижних подчеркиваний в именах учетных записей SQL. Если вручную сопоставить учетную запись Windows «IUSR_имя_компьютера» учетной записи SQL с таким же именем, эта учетная запись не будет принята сервером. Учетную запись, в которой использовано нижнее подчеркивание, нужно сопоставлять с именем учетной записи на сервере SQL, в котором нижнее подчеркивание не используется.

[[Ссылка]80004005 — В операции должен использоваться обновляемый запрос]

Данная ошибка возникает, когда событие обновляет набор записей или вставляет в него данные.

Далее перечислены возможные причины и способы решения.

  • Разрешения для доступа к папке, содержащей базу данных, слишком ограничены. Учетная запись IUSR должна обладать правами на чтение/запись.

  • Разрешения для самого файла базы данных не включают действующих полных прав на чтение/запись.

  • Возможно, база данных не расположена в каталоге Inetpub/wwwroot. Для обновления базы данных требуется, чтобы она располагалась в каталоге wwwroot. В противном случае будут доступны только просмотр и поиск данных, но не их обновление.

  • Набор записей основан на необновляемом запросе. Хорошими примерами необновляемых запросов в базе данных являются соединения. Преобразуйте необновляемые запросы в обновляемые.

    Дополнительные сведения об этой ошибке см. в статье базы знаний Майкрософт «Ошибка ASP «запрос не является обновляемым» при обновлении записи в таблице» по адресу: http://support.microsoft.com/default.aspx?scid=kb;ru-ru;Q174640.

[[Ссылка]80040e07 — Несоответствие типов данных в выражении условия отбора]

Данная ошибка возникает при попытке сервера обработать страницу, содержащую серверное поведение «Вставить запись» или «Обновить запись», которое пытается задать пустую строку («») в качестве значения для столбца «Дата/время» в базе данных Microsoft Access.

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

[[Ссылка] 80040e10 «Слишком мало параметров»]

Данная ошибка возникает в том случае, если столбец, указанный в запросе SQL, отсутствует в таблице базы данных. Проверьте имена столбцов в таблице базы данных на соответствие столбцам, указанным в запросе SQL. Зачастую причиной этой ошибки является опечатка.

[[Ссылка]80040e10 — Неверное поле COUNT]

Данная ошибка возникает при просмотре страницы, содержащей серверное поведение «Вставить запись», в веб-браузере и попытке с ее помощью вставить запись в базу данных Microsoft Access.

Данная ошибка может возникать при попытке вставить запись в поле базы данных, в имени которого содержится вопросительный знак (?). Для некоторых обработчиков баз данных, включая Microsoft Access, вопросительный знак является специальным символом, поэтому его нельзя использовать в именах таблиц баз данных и в именах полей.

Откройте систему базы данных и удалите вопросительный знак (?). из имен полей, а затем обновите на странице варианты поведения сервера, которые ссылаются на это поле.

[[Ссылка]80040e14 — Ошибка синтаксиса в инструкции INSERT INTO]

Данная ошибка возникает при попытке сервера обработать страницу, содержащую серверное поведение «Вставить запись».

Как правило, эта ошибка появляется вследствие одной или нескольких описанных ниже проблем с именами полей, объектов или переменных в базе данных.

  • В качестве имени использовано зарезервированное слово. Большинство баз данных имеют набор зарезервированных слов. Например, слово «date» является зарезервированным и, следовательно, не может быть использовано в именах столбцов базы данных.

  • В имени использованы специальные символы. Вот несколько примеров специальных символов:

    . / * : ! # & — ?

  • Имя содержит пробел.

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

    Чтобы решить проблему, не используйте в именах столбцов базы данных зарезервированные слова, например «date», «name», «select», «select» и «level». Помимо этого, исключите пробелы и специальные символы.

    Списки зарезервированных слов для наиболее распространенных систем баз данных см. на следующих веб-страницах.

  • Microsoft Access: http://support.microsoft.com/default.aspx?scid=kb;ru-ru;Q209187

  • MySQL: http://dev.mysql.com/doc/mysql/en/reserved-words.html

[[Ссылка]80040e21 — Ошибка ODBC при вставке или обновлении]

Данная ошибка возникает при попытке сервера обработать страницу, содержащую серверное поведение «Обновить запись» или «Вставить запись». Базе данных не удается обработать операцию обновления или вставки, которую пытается выполнить серверное поведение.

Далее перечислены возможные причины и способы решения.

  • Серверное поведение пытается обновить поле автонумерации в таблице базы данных или вставить запись в это поле. Так как поля автонумерации заполняются автоматически самой системой базы данных, внешние попытки заполнить эти поля значениями приводят к ошибкам.

  • Серверное поведение обновляет или вставляет данные неправильного типа в поле базы данных. Например, дата вставляется в логическое поле, требующее значение «да» или «нет», строка вставляется в числовое поле, а неправильно отформатированная строка — в поле «Дата/время».

[[Ссылка]800a0bcd — Функция BOF или EOF возвращает значение True]

Эта ошибка возникает при попытке просмотра динамической страницы в веб-браузере или интерактивном представлении.

Данная проблема возникает при попытке отобразить на странице данные из пустого набора записей. Для решения проблемы к динамическому содержимому, которое будет отображено на странице, нужно применить серверное поведение «Показать область». Вот как это сделать:

  1. Выделите динамическое содержимое на странице.

  2. На панели «Поведение сервера» нажмите кнопку со знаком «Плюс» (+) и выберите пункты «Показать область» > «Показать область, если набор записей не пустой».

  3. Выберите набор записей, из которого берется динамическое содержимое, и нажмите кнопку «ОК».

  4. Повторите шаги 1–3 для каждого элемента динамического содержимого на странице.

Устранение неполадок, связанных с сообщениями об ошибках MySQL

Одним из распространенных сообщений об ошибке, которое может появиться во время тестирования подключения базы данных PHP к MySQL 4.1 является «Клиент не поддерживает запрашиваемый протокол аутентификации. Обновите клиент MySQL.»

Может понадобиться вернуться к более ранней версии MySQL или установить PHP 5 и скопировать некоторые динамически связываемые библиотеки (DLL). Подробные инструкции см. в разделе Настройка среды разработки PHP.

Hi to all

Months ago I migrated my Oracle 9.2.0.8 32bit DB to Oracle 11gR2 64bit DB. Yesterday I created several new user account in the DB. However, these users reported that they encountered *»ORA-01017: invalid username/password; logon denied. Driver’s SQLSetConnectAttr failed.»* Existing users have no issue with login. All users use MS Excel 2000 (MSQuery 2000) via ODBC to connect to the DB.

So far, I have tried login in command prompt with the both existing user and new user account in the same laptop. Both existing user and new user account are able to login into the SQL*Plus and query the DB. From sqlplus /nolog, I can see that the Oracle Client is SQL*Plus: Release 9.2.0.1.0. Checked in Oracle OEM 11g and new user accounts are not locked. [Thus, I conclude there is no issue with account creation here]

The error appears when I try to login using the new user account via MS Excel 2000 (MSQuery 2000). With the existing user password and id, I am able to login. I am puzzled now because it seems that MSQuery 2000 doesn’t allow new user account to access the DB. There is no change to the tnsnames.ora and sqlnet.ora when I did all these testing.

Please help me as I don’t know why MSQuery 2000 doesn’t allow new user account to access the DB. Many thanks.

I run SQL Server 2016. I try to connect to it via a PHP script (PHP version 8). I did install the drivers and added the path in the php.ini (same version as my PHP version):

...
extension=pdo_sqlsrv_80_nts
extension=pdo_sqlsrv_80_ts
extension=sqlsrv_80_nts
extension=sqlsrv_80_ts
...

Here is my script:

$serverName = "<ServerName>";
$connectionInfo = array( "Database"=>"<database>", "UID"=>"<user>", "PWD"=>"<pwd>");
$conn = sqlsrv_connect( $serverName, $connectionInfo);

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

I get the following error:

Array
(
    [0] => Array
        (
            [0] => IM006
            [SQLSTATE] => IM006
            [1] => 0
            [code] => 0
            [2] => [Microsoft][ODBC Driver Manager] Driver's SQLSetConnectAttr failed
            [message] => [Microsoft][ODBC Driver Manager] Driver's SQLSetConnectAttr failed
        )

    [1] => Array
        (
            [0] => 01000
            [SQLSTATE] => 01000
            [1] => 5701
            [code] => 5701
            [2] => [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]Changed database context to '<database>'.
            [message] => [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]Changed database context to '<database>'.
        )

    [2] => Array
        (
            [0] => 01000
            [SQLSTATE] => 01000
            [1] => 5703
            [code] => 5703
            [2] => [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]Changed language setting to us_english.
            [message] => [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]Changed language setting to us_english.
        )

)

Any idea what could be wrong?
Thank you for your help

phpinfo()

phpinfo()

aynber's user avatar

aynber

22.3k8 gold badges50 silver badges63 bronze badges

asked Mar 26, 2021 at 10:01

Andreas's user avatar

7

I had the same issue after upgrading from Php 7 to 8. My PDO code (pdo_sqlsrv) still worked, as some of the commenters here mention. But the old non-PDO code (sqlsrv) got the same error that you describe.
I started switching that code over to PDO, and will continue that when I can. But I then realized that updating my SQL Server drivers resolved the issue. You can find those drivers by googling «Download ODBC Driver for SQL Server». You will be wanting verion 17 or above.

answered May 3, 2021 at 6:58

Ben Mockler's user avatar

2

I recently stumbled upon this same issue. For me sqlsrv_query was throwing warnings as errors. I fixed this by putting sqlsrv_configure('WarningsReturnAsErrors',0); just above the query code.

Update:
You need to update your ODBC driver’s version. According to this article, there are known issues with driver below 17.4.2.
Download latest ODBC
here.

Update 2:
If you are using PHP driver 5.9, then ODBC driver 18 will be incompatible. Refer here. You must have ODBC driver 17(higher then 17.4.2) as well.

answered Sep 13, 2021 at 6:30

sonam81's user avatar

sonam81sonam81

1572 silver badges9 bronze badges

1

629 votes

2 answers

Get the solution ↓↓↓

I am trying to access a SQL database from my PHP code. I am currently using XAMPP 8.0.6 with PHP 8.0.6. This is also not working on a machine with PHP 7.4.19 and the relevant extensions installed.

Installed drivers / extensions:

  • sql-srv: php_sqlsrv_80_ts_x64.dll
  • sql-pdo: php_pdo_sqlsrv_80_ts_x64.dll
  • OBDC drivers: 10.0.19041.1

The sqlsrv and sql-pdo are placed correctly in the php.ini. Connecting to the database using the OBDC gui, I get a successful connection.

The code that I am trying to get data from the database with is:

      function mssqlConnect(){
        $ServerName = "xxx";
        $ConnectionTimeout = 30;
        $connectionOptions = ["Database"=>"database","UID"=>"user","PWD"=>"password", "LoginTimeout" => $ConnectionTimeout];
        
        $sqlconn = sqlsrv_connect($ServerName,$connectionOptions);
        if( $sqlconn ) {
          echo "Connection established";
        } else {
          echo "Connection could not be established";
          die( print_r( sqlsrv_errors(), true));
        }
      }

When attempting to run this, I get this following message:

Connection could not be established. 
Array (
[0] => Array (
[0] => IM006
[SQLSTATE] => IM006
[1] => 0
[code] => 0
[2] =>
[Microsoft]
[ODBC Driver Manager] Driver's SQLSetConnectAttr failed
)
[1] => Array (
[0] => 01000
[SQLSTATE] => 01000
[1] => 5701
[code] => 5701
[2] =>
[Microsoft]
[ODBC Driver 11 for SQL Server]
[SQL Server]Changed database context to 'database'.
)
[2] => Array (
[0] => 01000
[SQLSTATE] => 01000
[1] => 5703
[code] => 5703
[2] =>
[Microsoft]
[ODBC Driver 11 for SQL Server]
[SQL Server]Changed language setting to us_english.
)

It’s able to reach out to the database just fine. When I try to use a bogus user/pass I get a 401 error[Microsoft][ODBC Driver 11 for SQL Server][SQL Server]Login failed for user 'other user'

A page I found said to disable pooling, I set a ConnectionPooling option in the $conectionOptions array with both a 0 and 1 and am getting the same result. I also tried by changing it via the OBDC GUI to the same result.

I am unable to successfully connect to the database. I also cannot find any related documentation to the error codes that I am receiving. Thank you

2021-11-12

Write your answer


499

votes

Answer

Solution:

Try updatingSQL Server drivers!!

You probably can find those drivers by Googling «Download ODBC Driver for SQL Server«.
In my case, verion 17 or above fixed the issue.

Also, try the PDO-SQL-Server example (maybe PDO implementation works).

Example:

<?php  
function mssqlConnect() {
  $ServerName = "xxx";

  try {  
    $conn = new PDO( "sqlsrv:server=$ServerName;Database = database", 'user', 'password');   
    $conn->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );   
  } catch( PDOException $e ) {  
     die( "Connection could not be established - " . $e->getMessage() );   
  } 

  echo "Connection established";
  return $conn;
}

function findEmployee($name) {
  $conn = mssqlConnect();
  $stmt = $conn->prepare('SELECT * FROM employees WHERE name = :name');
  if ($stmt->execute(array('name' => $name))) {
    while($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
      // do something with $row
    }
  } else {
    echo 'Query error - ' . join(' ', $stmt->errorInfo());
  }

  // Close connection which execute created.
  $stmt->closeCursor();
}

?>  


789

votes


Share solution ↓

Additional Information:

Date the issue was resolved:

2021-11-12

Link To Source

Link To Answer
People are also looking for solutions of the problem: call to undefined function illuminateencryptionopenssl_cipher_iv_length()

Didn’t find the answer?

Our community is visited by hundreds of web development professionals every day. Ask your question and get a quick answer for free.


Similar questions

Find the answer in similar questions on our website.

Я пытаюсь получить доступ к базе данных SQL из моего кода PHP. В настоящее время я использую XAMPP 8.0.6 с PHP 8.0.6. Это также не работает на машине с установленным PHP 7.4.19 и соответствующими расширениями.

Установленные драйверы / расширения:

  • sql-srv: php_sqlsrv_80_ts_x64.dll
  • sql-pdo: php_pdo_sqlsrv_80_ts_x64.dll
  • Драйверы OBDC: 10.0.19041.1

Sqlsrv и sql-pdo правильно размещены в php.ini. Подключившись к базе данных с помощью графического интерфейса OBDC, я получаю успешное соединение.

Код, с помощью которого я пытаюсь получить данные из базы данных:

      function mssqlConnect(){
        $ServerName = "xxx";
        $ConnectionTimeout = 30;
        $connectionOptions = ["Database"=>"database","UID"=>"user","PWD"=>"password", "LoginTimeout" => $ConnectionTimeout];
        
        $sqlconn = sqlsrv_connect($ServerName,$connectionOptions);
        if( $sqlconn ) {
          echo "Connection established";
        } else {
          echo "Connection could not be established";
          die( print_r( sqlsrv_errors(), true));
        }
      }

При попытке запустить это я получаю следующее сообщение:

Connection could not be established. 
Array (
[0] => Array (
[0] => IM006
[SQLSTATE] => IM006
[1] => 0
[code] => 0
[2] =>
[Microsoft]
[ODBC Driver Manager] Driver's SQLSetConnectAttr failed
)
[1] => Array (
[0] => 01000
[SQLSTATE] => 01000
[1] => 5701
[code] => 5701
[2] =>
[Microsoft]
[ODBC Driver 11 for SQL Server]
[SQL Server]Changed database context to 'database'.
)
[2] => Array (
[0] => 01000
[SQLSTATE] => 01000
[1] => 5703
[code] => 5703
[2] =>
[Microsoft]
[ODBC Driver 11 for SQL Server]
[SQL Server]Changed language setting to us_english.
)

Он может без проблем обращаться к базе данных. Когда я пытаюсь использовать поддельный пользователь / пароль, я получаю ошибку 401 [Microsoft][ODBC Driver 11 for SQL Server][SQL Server]Login failed for user 'other user'

На странице, на которой я обнаружил, говорится об отключении пула, я установил параметр ConnectionPooling в массиве $ conectionOptions как 0, так и 1, и получаю тот же результат. Я также попытался изменить его через графический интерфейс OBDC к тому же результату.

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

2 ответа

Лучший ответ

Попробуйте обновить драйверы SQL Server !!

Вероятно, вы сможете найти эти драйверы в Google «Download ODBC Driver for SQL Server«. В моем случае проблема была устранена в версии 17 или выше.

Кроме того, попробуйте PDO-SQL-Server (возможно, реализация PDO работает).

Примере:

<?php  
function mssqlConnect() {
  $ServerName = "xxx";

  try {  
    $conn = new PDO( "sqlsrv:server=$ServerName;Database = database", 'user', 'password');   
    $conn->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );   
  } catch( PDOException $e ) {  
     die( "Connection could not be established - " . $e->getMessage() );   
  } 

  echo "Connection established";
  return $conn;
}

function findEmployee($name) {
  $conn = mssqlConnect();
  $stmt = $conn->prepare('SELECT * FROM employees WHERE name = :name');
  if ($stmt->execute(array('name' => $name))) {
    while($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
      // do something with $row
    }
  } else {
    echo 'Query error - ' . join(' ', $stmt->errorInfo());
  }

  // Close connection which execute created.
  $stmt->closeCursor();
}

?>  


1

Top-Master
22 Июн 2021 в 12:28

  • Ошибка spn 520243 shacman
  • Ошибка sql таблица не найдена schemastorage
  • Ошибка sql таблица не найдена extensionsrestructngsng
  • Ошибка spn 520211 fm12 камаз
  • Ошибка sql таблица не найдена commonsettings