【问题标题】:PHP Connection to MS SQL Server 2012与 MS SQL Server 2012 的 PHP 连接
【发布时间】:2015-03-31 07:13:50
【问题描述】:

我有一个似乎无法解决的问题。 我的任务很简单:我想连接到我们网络中的机器,这是一台使用过的 IBM 服务器并在其上运行 SQL。

我的 PHP 连接脚本如下:

// Melde alle PHP Fehler
error_reporting(-1);
ini_set('display_errors', 1);
// Server in diesem Format: <computer>\<instance name> oder
// <server>,<port>, falls nicht der Standardport verwendet wird

error_reporting(E_ALL);
$serverName = "SERVERNAME\MSSQLSRV";

$connectionInfo = array('Database'=>'hgadb', "UID"=>"USERNAME", "PWD"=>"PASSWORD");
$conn = sqlsrv_connect($serverName, $connectionInfo);


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

我正在使用 Microsoft SQL Server 管理工具,并设置了一个名为“hgadb”的数据库用于测试目的,并使用用户名 hgadbuser 和匹配的密码为该数据库设置了一个登录名。

一切似乎都设置好了,但我一遍又一遍地收到同样的错误:

Array ( [0] => Array ( [0] => 28000 [SQLSTATE] => 28000 [1] => 18456 [code] => 18456 [2] => [Microsoft][ODBC Driver 11 for SQL Server][SQL Server]Fehler bei der Anmeldung f�r den Benutzer 'USERNAME'. [message] => [Microsoft][ODBC Driver 11 for SQL Server][SQL Server]Fehler bei der Anmeldung f�r den Benutzer 'USERNAME'. ) [1] => Array ( [0] => 42000 [SQLSTATE] => 42000 [1] => 4060 [code] => 4060 [2] => [Microsoft][ODBC Driver 11 for SQL Server][SQL Server]Die von der Anmeldung angeforderte hgadb-Datenbank kann nicht ge�ffnet werden. Fehler bei der Anmeldung. [message] => [Microsoft][ODBC Driver 11 for SQL Server][SQL Server]Die von der Anmeldung angeforderte hgadb-Datenbank kann nicht ge�ffnet werden. Fehler bei der Anmeldung. ) [2] => Array ( [0] => 28000 [SQLSTATE] => 28000 [1] => 18456 [code] => 18456 [2] => [Microsoft][ODBC Driver 11 for SQL Server][SQL Server]Fehler bei der Anmeldung f�r den Benutzer 'USERNAME'. [message] => [Microsoft][ODBC Driver 11 for SQL Server][SQL Server]Fehler bei der Anmeldung f�r den Benutzer 'USERNAME'. ) [3] => Array ( [0] => 42000 [SQLSTATE] => 42000 [1] => 4060 [code] => 4060 [2] => [Microsoft][ODBC Driver 11 for SQL Server][SQL Server]Die von der Anmeldung angeforderte hgadb-Datenbank kann nicht ge�ffnet werden. Fehler bei der Anmeldung. [message] => [Microsoft][ODBC Driver 11 for SQL Server][SQL Server]Die von der Anmeldung angeforderte hgadb-Datenbank kann nicht ge�ffnet werden. Fehler bei der Anmeldung. ) )

我知道它是德语 - 翻译它说:

[message] => [Microsoft][ODBC Driver 11 for SQL Server][SQL Server]The from the login requested database:  DATABASENAME-Database cannot be opened. Error with login. ) )

我在这里错过了什么?

更新

当我尝试通过 SQL Server 身份验证使用 SSMS 登录时,我收到以下错误消息

===================================

Cannot connect to SQL\MSSQLSRV.

===================================

Die Standarddatenbank des Benutzers kann nicht geöffnet werden. Fehler bei der Anmeldung.
Fehler bei der Anmeldung für den Benutzer 'USERNAME'. (.Net SqlClient Data Provider)

------------------------------
For help, click: http://go.microsoft.com/fwlink?ProdName=Microsoft%20SQL%20Server&EvtSrc=MSSQLServer&EvtID=4064&LinkId=20476

------------------------------
Server Name: SERVERNAME\MSSQLSRV
Error Number: 4064
Severity: 11
State: 1
Line Number: 65536


------------------------------
Program Location:

   at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
   at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)
   at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady)
   at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj)
   at System.Data.SqlClient.SqlInternalConnectionTds.CompleteLogin(Boolean enlistOK)
   at System.Data.SqlClient.SqlInternalConnectionTds.AttemptOneLogin(ServerInfo serverInfo, String newPassword, SecureString newSecurePassword, Boolean ignoreSniOpenTimeout, TimeoutTimer timeout, Boolean withFailover)
   at System.Data.SqlClient.SqlInternalConnectionTds.LoginNoFailover(ServerInfo serverInfo, String newPassword, SecureString newSecurePassword, Boolean redirectedUserInstance, SqlConnectionString connectionOptions, SqlCredential credential, TimeoutTimer timeout)
   at System.Data.SqlClient.SqlInternalConnectionTds.OpenLoginEnlist(TimeoutTimer timeout, SqlConnectionString connectionOptions, SqlCredential credential, String newPassword, SecureString newSecurePassword, Boolean redirectedUserInstance)
   at System.Data.SqlClient.SqlInternalConnectionTds..ctor(DbConnectionPoolIdentity identity, SqlConnectionString connectionOptions, SqlCredential credential, Object providerInfo, String newPassword, SecureString newSecurePassword, Boolean redirectedUserInstance, SqlConnectionString userConnectionOptions)
   at System.Data.SqlClient.SqlConnectionFactory.CreateConnection(DbConnectionOptions options, DbConnectionPoolKey poolKey, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningConnection, DbConnectionOptions userOptions)
   at System.Data.ProviderBase.DbConnectionFactory.CreateNonPooledConnection(DbConnection owningConnection, DbConnectionPoolGroup poolGroup, DbConnectionOptions userOptions)
   at System.Data.ProviderBase.DbConnectionFactory.TryGetConnection(DbConnection owningConnection, TaskCompletionSource`1 retry, DbConnectionOptions userOptions, DbConnectionInternal& connection)
   at System.Data.ProviderBase.DbConnectionClosed.TryOpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, DbConnectionOptions userOptions)
   at System.Data.SqlClient.SqlConnection.TryOpen(TaskCompletionSource`1 retry)
   at System.Data.SqlClient.SqlConnection.Open()
   at Microsoft.SqlServer.Management.SqlStudio.Explorer.ObjectExplorerService.ValidateConnection(UIConnectionInfo ci, IServerType server)
   at Microsoft.SqlServer.Management.UI.ConnectionDlg.Connector.ConnectionThreadUser()

当我使用 Windows 身份验证登录并更改用户尝试连接到文件夹系统数据库中的“主”数据库时(如下图所示),然后我可以使用SSMS 和我的 php 连接没有显示任何错误。

为什么我无法连接到我的某个测试数据库?

【问题讨论】:

  • 服务器名丢失
  • 您的用户是否有足够的权限访问数据库?当您从 SSMS 与该用户连接时,您可以打开并查询数据库吗?请检查 SQL Server 日志并与我们分享与登录失败相关的错误条目的状态,这有助于了解错误的根源。
  • 服务器名在 sqlsrv_connect 函数中被声明和调用 :) 我明天将在这里分享我的日志 - 为了复制我必须通过 SQL Server 身份验证连接到 SSMS 的错误,对吗?我在使用 SSMS 时正在连接 Windows 身份验证。

标签: php sql-server ssms windows-server-2012


【解决方案1】:

问题解决了。

我必须在 SSMS 中为访客和公共连接的数据库设置权限。现在它可以正常工作了。

【讨论】:

  • 您在 SSMS 中的哪个位置设置了这些权限?在实例上或特定数据库上以及哪个文件夹上?安全等..?谢谢。
  • 右键单击您的数据库 -> 属性 -> 权限
猜你喜欢
  • 2017-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-04
  • 2016-02-20
  • 1970-01-01
相关资源
最近更新 更多