如何:使用 Windows 身份验证进行连接
默认情况下, Microsoft Drivers for PHP for SQL Server 使用 Windows 身份验证连接 SQL Server。 请务必注意,在大多数情况下,这通常意味着使用 Web 服务器的进程标识或线程标识(如果 Web 服务器正在使用模拟)来连接服务器,而不是最终用户的标识。
使用 Windows 身份验证连接 SQL Server 时,必须要考虑以下几点:
运行 Web 服务器的进程(或线程)所依据的凭据必须映射到有效的 SQL Server 登录才能建立连接。
如果 SQL Server 和 Web 服务器位于不同的计算机上,则必须配置 SQL Server 才能启用远程连接。
注意
建立连接时可以设置连接属性,如 Database 和 ConnectionPooling 。 有关受支持的连接属性的完整列表,请参阅 Connection Options。
只要可能存在以下原因,都应使用 Windows 身份验证来连接 SQL Server:
没有任何凭据在身份验证期间通过网络传递;用户名和密码未嵌入在数据库连接字符串中。 这意味着恶意用户或攻击者无法通过监视网络或查看配置文件内部的连接字符串来获取凭据。
用户要进行集中式帐户管理;强制执行多次无效登录请求后的安全策略,如密码有效期、最短密码长度和帐户锁定。
如果 Windows 身份验证不可行,请参阅如何:使用 SQL Server 身份验证进行连接。
SQLSRV 示例
通过使用 Microsoft Drivers for PHP for SQL Server的 SQLSRV 驱动程序,以下示例将使用 Windows 身份验证连接到 SQL Server 的本地实例。 建立连接后,服务器将查询正在访问数据库的用户登录名。
该示例假定已在本地计算机上安装了 SQL Server 和 AdventureWorks 数据库。 当从浏览器运行该示例时,所有输出都将写入该浏览器。
<?php
/* Specify the server and connection string attributes. */
$serverName = "(local)";
$connectionInfo = array( "Database"=>"AdventureWorks");
/* Connect using Windows Authentication. */
$conn = sqlsrv_connect( $serverName, $connectionInfo);
if( $conn === false )
{
echo "Unable to connect.</br>";
die( print_r( sqlsrv_errors(), true));
}
/* Query SQL Server for the login of the user accessing the
database. */
$tsql = "SELECT CONVERT(varchar(32), SUSER_SNAME())";
$stmt = sqlsrv_query( $conn, $tsql);
if( $stmt === false )
{
echo "Error in executing query.</br>";
die( print_r( sqlsrv_errors(), true));
}
/* Retrieve and display the results of the query. */
$row = sqlsrv_fetch_array($stmt);
echo "User login: ".$row[0]."</br>";
/* Free statement and connection resources. */
sqlsrv_free_stmt( $stmt);
sqlsrv_close( $conn);
?>
PDO_SQLSRV 示例
下面的示例使用 PDO_SQLSRV 驱动程序来完成与上一示例相同的任务。
<?php
try {
$conn = new PDO( "sqlsrv:Server=(local);Database=AdventureWorks", NULL, NULL);
$conn->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
}
catch( PDOException $e ) {
die( "Error connecting to SQL Server" );
}
echo "Connected to SQL Server\n";
$query = 'select * from Person.ContactType';
$stmt = $conn->query( $query );
while ( $row = $stmt->fetch( PDO::FETCH_ASSOC ) ){
print_r( $row );
}
?>