php与mysql的配置很常见,但偶尔需要用php连接sqlserver时,就要稍费一些手脚。
基本配置:
Windows 10 企业版;Apache2.4;php7.2.4;SQL Server 2017 EXPRESS;
按照网上多数的文献,要先从微软官网上下载 用于连接 SQL Server 的php扩展。
网址是:https://www.microsoft.com/en-us/download/details.aspx?id=20098
从这个上面可以下载 SQLSRV40.EXE。执行后解压得到如下的文件结构:
但是实验下来,这里的dll只能用于php7.0。 php7.2需要的扩展 要从GITHUB下载。下载地址:https://github.com/Microsoft/msphpsql/releases/tag/v5.2.0-RC
选择上图的 “Windows-7.2.zip”下载。
解压后有“X64"与"X86"两个版本。选择"X64"版本
这里有线程安全与非线程安全两个版本,为了确定应该要选择的版本,通过在命令行下执行php -i 或者 phpinfo(); 查看php的信息
从红笔圏出来的内容可以看出是TS版本。
由于只想使用pdo方式连接,所以选择了上述4个dll中的php_pdo_sqlsrv_72_ts.dll
放入到php的扩展文件夹 ext 中。
然后修改配置文件 php.ini
加入:
extension = php_pdo_sqlsrv_72_ts.dll
重启apache服务器,再次查看php信息
从上面的信息中可以看出sqlserver 的pdo扩展已经启用了。
为了测试用php调用存储过程的代码,用sql脚本建立一个简单的存储过程
CREATE PROCEDURE [dbo].[test]
@p AS varchar(100)
AS
BEGIN
select @p;
END
GO
调用存储过程的php代码如下:
<?php
$db = new PDO( "sqlsrv:Server=.\SQLEXPRESS;Database=test1", 'sa', 'sa');
//执行存储过程,返回结果集
function execStoreProc($db,$storeProcName,$paras)
{
$paraList='';
foreach ($paras as $para) {
$paraList.=",'$para'";
}
if($paraList){
$paraList=" ".substr($paraList, 1)." ;";
}else{
$paraList=" ;";
}
$sql="exec ".$storeProcName.$paraList;
print($sql);
$stmt = $db->prepare($sql, array($db::ATTR_CURSOR=>$db::CURSOR_SCROLL));
$stmt->execute();
// 取得结果集
while($rowSet = $stmt->fetchAll($db::FETCH_NUM))
{
$result = $rowSet;
$stmt->nextRowset();
}
return $result;
}
$res = execStoreProc($db,'test',['hello!']);
var_dump($res);