windows10 php8连接sql server

一、环境安装

文章目录

所用资源:

1.安装php拓展

msphpsql-github仓库(较新)

微软-下载 Microsoft Drivers for PHP for SQL Server(稳定)

Microsoft Drivers for PHP for Microsoft SQL Server 是 PHP 扩展,允许从 PHP 脚本中读取和写入 SQL Server 数据。SQLSRV 扩展提供过程接口,而 PDO_SQLSRV 扩展实现 PHP 数据对象 (PDO),用于访问 SQL Server 2012 及更高版本(包括 Azure SQL DB)的所有版本中的数据。这些驱动程序依赖于 Microsoft ODBC Driver for SQL Server 来处理与 SQL Server 的低级别通信。

此版本包含用于 PHP 8.0+ 的 SQLSRV 和 PDO_SQLSRV 驱动程序,并改进了这两个驱动程序并限制了一些限制。即将发布的版本将包含其他功能、错误修复等。

2.在 Windows 上安装PHP驱动程序

驱动程序作为 PHP 的预编译扩展分发,可在发布页面上找到。它们提供线程安全版本和非线程安全版本,以及 32 位(仅限 Windows)和 64 位版本。驱动程序的源代码也可用,您可以将它们编译为线程安全或非线程安全版本。Web 服务器的线程安全配置将决定您需要的版本。

如果选择构建驱动程序,则必须能够在不包含这些扩展的情况下构建 PHP 8.*。有关在 Windows 上构建 PHP 的帮助,请参阅官方 PHP 网站。有关编译驱动程序的详细信息,请参阅文档 -- 提供了示例构建脚本,但您也可以手动编译驱动程序。

要加载驱动程序,请确保驱动程序位于 PHP 扩展目录中,并通过向 ini 文件添加和/或在 PHP 安装的 php.ini 文件中启用它。如有必要,请使用 指定扩展目录,例如:。请注意,预编译的二进制文件具有不同的名称 - 在php.ini中相应地替换。有关加载驱动程序的更多详细信息,请参阅 Microsoft Docs 上的加载 PHP SQL 驱动程序。

最后,如果在 Web 服务器中运行 PHP,请重新启动 Web 服务器。

在版本中选择适合的版本(PHP Version 8.3.0)

下载好后,选择64位ts(我安装的线程安全版本,nts为非线程安全版本)的两个dll文件,复制到php的根目录,同时修改php.ini

php.ini 复制代码
extension=php_pdo_sqlsrv.dll
extension=php_sqlsrv.dll

[MSSQL]
mssql.allow_persistent=On
mssql.max_persistent=-1
mssql.max_links=-1
mssql.min_error_severity=10
mssql.min_message_severity=10
mssql.compatability_mode=Off
mssql.secure_connection=Off

3.在 Windows 上安装ODBC驱动

微软-下载 ODBC Driver for SQL Server

根据电脑系统选择对应版本

下载后一直下一步默认安装即可。

重启Apache服务

查看phpinfo页面

然后搜索sqlsrv,如果能搜到,代表sqlserver扩展安装成功

搜不到代表安装失败,自行检查失败原因及是否遗漏流程步骤

二、php连接sqlserver

可参考官方提供的例子如何:使用 Windows 身份验证进行连接以及如何:使用 SQL Server 身份验证进行连接

php 复制代码
<?php  

/* 指定服务器和连接字符串属性
在这里,代码指定了要连接的服务器名称为本地"DESKTOP-UC9IGKA\SQLEXPRESS"
并且设置了连接字符串的属性
其中包括要连接的数据库为RGB*/  

$serverName = "DESKTOP-UC9IGKA\SQLEXPRESS";  
//乱码的话,charset改成UTF-8则php输出正常
$connectionInfo = array( "Database"=>"RGB","CharacterSet" => "UTF-8","Encrypt"=>"false","trustServerCertificate"=>"true");  
  
/*使用Windows身份验证进行连接
如果连接失败,将输出错误信息并中止程序。*/  
$conn = sqlsrv_connect( $serverName, $connectionInfo);  
if( $conn === false )  
{  
     echo "Unable to connect.</br>";  
     die( print_r( sqlsrv_errors(), true));  
}  
  
/* 查询用户登录信息:这里定义了一个查询($tsql)
目的是获取当前用户的登录名。
如果查询执行失败,同样会输出错误信息并中止程序。*/  

$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));  
}  
  
/*检索和显示查询结果:
通过 sqlsrv_fetch_array 函数从查询结果集(stmt,SQL 查询的语句句柄(statement handle))中获取一行数据
然后输出用户登录名
这里假设查询只返回一个字段
因此使用 $row[0] 获取该字段的值 */  
$row = sqlsrv_fetch_array($stmt);  
echo "User login: ".$row[0]."</br>";  
  
/*释放查询语句和数据库连接所占用的资源,以防止资源泄漏。*/  
sqlsrv_free_stmt( $stmt);  
sqlsrv_close( $conn);  
?>

三、注意事项

数据库相关设置

如果使用 NT AUTHORITY/SYSTEM无法登录数据库的话,只需要 在登录名下NT AUTHORITY/SYSTEM右键属性,用户映射-勾选要访问的数据库就可以了,角色成员选 db_owner,public。

记得取消 阻止保存要求重新创建表的更改

相关语法

38行

sqlsrv_fetch_array 的示例:

sqlsrv_fetch_array 是一个 PHP 函数,用于从结果集中获取一行作为关联数组或数字数组。

php 复制代码
while ( $re = sqlsrv_fetch_array($stmt)) { 
	print_r($re);
	echo "</br>";
}

解释如下:

  • $row = sqlsrv_fetch_array($stmt);: 使用 sqlsrv_fetch_array 函数从执行查询的结果集中获取一行数据,并将该行数据存储在关联数组和数字数组中。在这里,由于没有指定关联数组或数字数组,所以默认返回两者兼具的数组。

  • echo "User login: ".$row[0]."</br>";: 输出从结果集中获取的数据。在这里,假设查询返回的结果集只包含一个字段,因此使用 $row[0] 来获取该字段的值,并将其输出到页面上。

总体而言,sqlsrv_fetch_array 的作用是将查询结果集的当前行移动到下一行,并将该行数据存储在数组中,以便后续处理。在这个例子中,通过 echo 语句将用户登录名输出到页面上。

两者兼具的数组

关联数组

如果只需要获取查询结果中的值而不需要关联数组的列名或数字数组的序号,可以使用 sqlsrv_fetch 函数。该函数返回一个布尔值,表示是否成功获取下一行的数据。

sqlsrv_fetch 的示例:

php 复制代码
while(sqlsrv_fetch($stmt)) {
    print_r(sqlsrv_get_field($stmt, 0)."</br>";);
}

在这个示例中,使用 sqlsrv_fetch 函数尝试获取结果集的下一行数据。如果成功获取了下一行数据,则使用 sqlsrv_get_field 函数直接输出用户登录名的值。sqlsrv_get_field($stmt, 0) 表示获取结果集中第一个字段的值。

请注意,使用 sqlsrv_fetch 后,可以多次调用 sqlsrv_get_field($stmt, index) 来获取不同字段的值,其中 index 为字段的索引。这种方式避免了创建数组,并直接获取所需的值,例如

php 复制代码
while(sqlsrv_fetch($stmt)) {
    $output = sqlsrv_get_field($stmt, 0) . sqlsrv_get_field($stmt, 1) . sqlsrv_get_field($stmt, 2) . "</br>";
    print_r($output);
}

print_r 是一个用于打印变量的函数,它接受一个变量作为参数,并以可读性更好的格式输出变量的信息。在你的代码中,print_r($re) 用于输出 $re 变量的内容,而 echo "</br>"; 则用于输出一个换行。

然而,当你尝试使用 print_r($re."</br>");echo($re."</br>"); 时,会导致错误,原因如下:

  1. 字符串连接错误: 在这两个语句中,你尝试将 $re 变量与 "</br>" 字符串直接连接起来。然而,$re 可能是一个资源类型(数据库查询结果集的句柄),而不是一个字符串。直接将一个资源与字符串连接可能导致类型不匹配的错误。

  2. echo 和 print_r 的不同: echoprint_r 在处理变量输出时有一些差异。echo 是一个语言结构,可以接受多个参数,用逗号分隔,而 print_r 是一个函数,只接受一个参数。在使用 echo 时,尝试将多个参数直接连接可能导致语法错误。

如果你想在输出中包含 "</br>",你可以在 print_recho 之前将其作为字符串拼接到变量中,如下所示:

php 复制代码
// 使用点号连接字符串和变量
echo print_r($re, true) . "</br>";

// 或者使用逗号分隔多个参数
echo print_r($re, true), "</br>";

在上述代码中,print_r($re, true) 返回 $re 的字符串表示,然后使用点号或逗号将其与 "</br>" 字符串连接。确保使用 true 作为 print_r 函数的第二个参数,以便它返回结果而不直接输出。

相关推荐
JaguarJack5 小时前
PHP 的异步编程 该怎么选择
后端·php·服务端
BingoGo5 小时前
PHP 的异步编程 该怎么选择
后端·php
JaguarJack20 小时前
为什么 PHP 闭包要加 static?
后端·php·服务端
ServBay2 天前
垃圾堆里编码?真的不要怪 PHP 不行
后端·php
用户962377954482 天前
CTF 伪协议
php
BingoGo4 天前
当你的 PHP 应用的 API 没有限流时会发生什么?
后端·php
JaguarJack4 天前
当你的 PHP 应用的 API 没有限流时会发生什么?
后端·php·服务端
BingoGo5 天前
OpenSwoole 26.2.0 发布:支持 PHP 8.5、io_uring 后端及协程调试改进
后端·php
JaguarJack5 天前
OpenSwoole 26.2.0 发布:支持 PHP 8.5、io_uring 后端及协程调试改进
后端·php·服务端
JaguarJack6 天前
推荐 PHP 属性(Attributes) 简洁读取 API 扩展包
后端·php·服务端