PHP连接Microsoft SQL Server 2000/2005/2008

PHP连接Microsoft SQL Server 2000/2005/2008




最近由于工作需要用于SQL Server,想做一个测试环境,SQL Server 2008不是刚出来,图个新鲜,就下载了2008版的,用了很多方法一直没能连接上SQL Server 2008。在网上找了一些资料,终于连接上了SQL Server 2008,整理了一下收集到的资料,利用中午休息时间,写个贴子发出来,让大家看看。呵呵!!






PHP自带的MSSQL扩展php_mssql.dll原来是给SQL Server 2000用的,难怪连接不上2008?! -_-!!要使用SQL Server 2005以上版本,就要用到微软为PHP提供的最新第三方扩展SQL Server Driver for PHP才行,最新版本是2.0的,下载地址:






SQL Server Driver for PHP 1.1 (2009-10)


http://www.microsoft.com/downloads/details.aspx?familyid=CCDF728B-1EA0-48A8-A84A-5052214CAAD9&displaylang=en


SQL Server Driver for PHP 2.0 CTP1(2010-04)


http://www.microsoft.com/downloads/details.aspx?familyid=DF4D9CC9-459C-4D75-A503-AE3FCEB85860&displaylang=en


或者:http://www.microsoft.com/sqlserver/2005/en/us/PHP-Driver.aspx

想看中文详细使用资料可参考MSDN的,地址:


http://msdn.microsoft.com/zh-cn/library/cc296170(SQL.90).aspx








先来复习一下怎么样用PHP自带的扩展php_mssql.dll连接SQL Server 2000,用mssql系列函数来操作,和操作MySQL的一样。


1、打开PHP配置文件php.ini,找到;extension=php_mssql.dll把前面的分号去掉。


2、找到mssql.secure_connection = Off修改成 mssql.secure_connection = On。


3、把PHP文件夹下的php_mssql.dll和ntwdblib.DLL这两个文件拷贝到C:\windows\system32\文件夹下。


4、重启Apache,OK



测试一下:








<?php


//用mssql_connect


$conn=mssql_connect('localhost','pandao','1987') or die('数据库连接不上');


mssql_select_db('test',$conn);


//query语句


$Query="select * from news";


$AdminResult=mssql_query($Query);


//输出结果


$Num=mssql_num_rows($AdminResult);


for($i=0;$i<$Num;$i++)


{


$Row=mssql_fetch_array($AdminResult);


echo($Row[1]);


echo("<br/>");


}


?>
复制代码


当然还可以用pdo和ODBC来连接SQL Server。








准备工作








下载驱动程序,我下载的是2.0的,下载后安装释放程序,里面有以下文件:


php_pdo_sqlsrv_52_nts.dll


php_pdo_sqlsrv_52_ts.dll


php_pdo_sqlsrv_53_nts_vc6.dll


php_pdo_sqlsrv_53_nts_vc9.dll


php_pdo_sqlsrv_53_ts_vc6.dll


php_pdo_sqlsrv_53_ts_vc9.dll


php_sqlsrv_52_nts.dll


php_sqlsrv_52_ts.dll


php_sqlsrv_53_nts_vc6.dll


php_sqlsrv_53_nts_vc9.dll


php_sqlsrv_53_ts_vc6.dll


php_sqlsrv_53_ts_vc9.dll


SQLServerDriverForPHP.chm(手册,英文够好的话,可以看看,嘿嘿)


SQLServerDriverForPHP_License.rtf


SQLServerDriverForPHP_Readme.htm(自述文件)






下面是自述文件里的内容,我翻译一下:






驱动程序文件
 PHP 版本
 线程安全性
 用于PHP .dll
 
php_sqlsrv_53_nts_vc6.dll


php_pdo_sqlsrv_53_nts_vc6.dll
 5.3
 no
 php5.dll
 
php_sqlsrv_53_nts_vc9.dll


php_pdo_sqlsrv_53_nts_vc9.dll
 5.3
 no
 php5.dll
 
php_sqlsrv_53_ts_vc6.dll


php_pdo_sqlsrv_53_ts_vc6.dll
 5.3
 yes
 php5ts.dll
 
php_sqlsrv_53_ts_vc9.dll


php_pdo_sqlsrv_53_ts_vc9.dll
 5.3
 yes
 php5ts.dll
 
php_sqlsrv_52_nts.dll


php_pdo_sqlsrv_52_nts.dll
 5.2
 no
 php5.dll
 
php_sqlsrv_52_ts.dll


php_pdo_sqlsrv_52_ts.dll
 5.2
 yes
 php5ts.dll
 






关于VC6和VC9的区别,还有非线程安全与线程安全






VC6 版本是使用 Visual Studio 6 编译器编译的,如果你是在windows下使用Apache+PHP的,请选择VC6版本。


VC9 版本是使用 Visual Studio 2008 编译器编译的,如果你是在windows下使用IIS+PHP的,请选择VC9版本。


Non Thread Safe就是非线程安全,在执行时不进行线程(Thread)安全检查;


Thread Safe 是线程安全,执行时会进行线程(Thread)安全检查,以防止有新要求就启动新线程的 CGI 执行方式而耗尽系统资源;








开始配置








我用的是APMserv 搭建的PHP环境(Apache 2.2.9+PHP 5.2.6+MySQL 5.1.28),想用线程安全的,所以选择php_sqlsrv_52_ts.dll和php_pdo_sqlsrv_52_ts.dll。


开始工作,先把文件拷贝到PHP文件夹下的ext目录下,然后在配置文件php.ini
的Extensions后面加上:


;extension=php_sqlsrv_52_ts.dll


;extension=php_pdo_sqlsrv_52_ts.dll


再重启Apache。


最后测试一下是否成功,看一下phpinfo的sqlsrv


  


下载 (16.53 KB)
sqlsrv


2010-6-5 13:13






如图所示这样就表示连接成功了!!开始工作喽!






连接数据库






使用过SQL Server的人应该都清楚,SQL Server常用的有两种认证方式,一种是本地系统账户认证(Windows Authentication ),一种是使用用户名和密码(SQL Server Authentication ),第二种认证方式必须启用SQL Server的混合模式。






1.Windows Authentication连接部分代码段












<?php


$serverName = "(local)";


$connectionInfo = array("Database"=>"test","ConnectionPooling"=>false);


$conn = sqlsrv_connect( $serverName, $connectionInfo);


if( $conn == false)


{


    echo "连接失败!";


    die( print_r( sqlsrv_errors(), true));


}


?>
复制代码






2.SQL Server Authentication连接部分代码段












<?php


$serverName = "(local)"; //数据库服务器地址


$uid = "pandao"; //数据库用户名


$pwd = "1987"; //数据库密码


$connectionInfo = array("UID"=>$uid, "PWD"=>$pwd, "Database"=>"test");


$conn = sqlsrv_connect( $serverName, $connectionInfo);


if( $conn == false)


{


    echo "连接失败!";


    die( print_r( sqlsrv_errors(), true));


}


$query = sqlsrv_query($conn, "SELECT TOP 10 nid,title,content FROM test.dbo.news");


while($row = sqlsrv_fetch_array($query)){


    echo $row['nid']."-----".$row['title']."<br/>";


}


?>
复制代码






由于我电脑没装SQL Server 2005,所以没有测试,SQL Server Driver for PHP是给2005和2008用的,应该是一样的,大家在时间可以测试一下,看是不是一样。


微软为PHP新增加了操作SQL Server 2005/2008的函数sqlsrv系列,下面是sqlsrv API,用法跟操作MySQL的基本一样,可以参考学习一下。


在PHPchina混了N久了,还是第一次在PHPchina发原创贴,在下文笔不行,写得不好,欢迎大家拍砖!


相关参考文章:


微软提供给PHP5的SQL Server扩展: sqlsrv (转载)


PHP连接SQL Server 2005 和 SQL Server 2008








API 参考 (SQL Server Driver for PHP) 








用于 SQL Server Driver for PHP 的 API 名称是 sqlsrv。所有 sqlsrv函数都以 sqlsrv_打头,后跟动词或名词。后跟动词的函数用于执行特定操作,而后跟名词的函数用于返回特定形式的元数据。


SQL Server Driver for PHP 包含以下函数:






函数 说明 
sqlsrv_begin_transaction 开始事务。 
sqlsrv_cancel 取消语句;并放弃相应语句的所有未决结果。 
sqlsrv_client_info 提供有关客户端的信息。 
sqlsrv_close 关闭连接。释放与相应连接关联的所有资源。 
sqlsrv_commit 提交事务。 
sqlsrv_configure 更改错误处理和日志记录配置。 
sqlsrv_connect 创建一个连接,并将其打开。 
sqlsrv_errors 返回关于上一操作的错误和/或警告信息。 
sqlsrv_execute 执行预定义语句。 
sqlsrv_fetch 使下一行的数据可供读取。 
sqlsrv_fetch_array 以数值索引数组、关联数组或这两种数组的形式检索下一行的数据。 
sqlsrv_fetch_object 以对象形式检索下一行的数据。 
sqlsrv_field_metadata 返回字段元数据。 
sqlsrv_free_stmt 关闭语句。释放与相应语句关联的所有资源。 
sqlsrv_get_config 返回指定配置设置的值。 
sqlsrv_get_field 按索引检索当前行中的字段。可以指定 PHP 返回类型。 
sqlsrv_has_rows 检测结果集是否具有一行或多行。 
sqlsrv_next_result 使下一结果可供处理。 
sqlsrv_num_rows 报告结果集中的行数。 
sqlsrv_num_fields 检索活动结果集中的字段数。 
sqlsrv_prepare 准备 Transact-SQL 查询,但不执行该查询。隐式绑定参数。 
sqlsrv_query 准备 Transact-SQL 查询,并将其执行。 
sqlsrv_rollback 回滚事务。 
sqlsrv_rows_affected 返回有所修改的行的数目。 
sqlsrv_send_stream_data 在每次调用函数时向服务器发送最多八千字节 (8 KB) 的数据。 
sqlsrv_server_info 提供有关服务器的信息。 

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
最近帮朋友改一个小东西的时候才发现的,微软专门为PHP出了个SQL Server的扩展(当然是Windows版本的),用了一下发现还是很好用的,对于Windows下使用php开发SQL Server应用来说,这个扩展有利于兼容性以及充分利用SQL Server特性。 PHP本身有个php_mssql.dll的扩展用来连接Sql server,但是貌似这个dll只是用来连接低版本 Sql server的(2000以下版本),在Sql server 2005以后版本则根本无法使用mssql_connect连接到数据库。 先到微软网站下载 SQL Server Driver for PHP :http://www.microsoft.com/downloads/details.aspx?familyid=CCDF728B-1EA0-48A8-A84A-5052214CAAD9&displaylang=en , 这是一个自解压的EXE文件,解压缩后你会得到这么几个文件: 其中的52、53表示就是php的5.2.x和5.3.x 版本,你必须选择跟你php版本相匹配的; vc6、vc9表示的是编译这个dll所使用的vc++编译器版本,基本上大多数时候,选vc6的; nts、ts表示的是否是 ThreadSafe的,得根据安装的php版本来选择,如果你不确定,就两种情况分别尝试一下好了; 我服务器上安装的是 ThreadSafe版本的php-5.2.x,所以选择的是php_sqlsrv_52_nts_vc6.dll,把这个文件拷贝到php的ext目录,比如: 1 C:\php\ext 然后修改php.ini在适当的地方加上一行: 1 extension=php_sqlsrv_52_nts_vc6.dll 然后重启web服务器就可以了。 运行一个phpinfo看看: 另外需要注意的是,如果使用这个扩展连接Sql server 2005以上版本的sql server,你还需要在机器上先安装 SQL Server Native Client :http://download.microsoft.com/download/0/E/6/0E67502A-22B4-4C47-92D3-0D223F117190/sqlncli.msi 这个扩展为php新增了一系列sqlsrv_开头的函数, 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 sqlsrv_begin_transaction sqlsrv_cancel sqlsrv_client_info sqlsrv_close sqlsrv_commit sqlsrv_configure sqlsrv_connect sqlsrv_errors sqlsrv_execute sqlsrv_fetch sqlsrv_fetch_array sqlsrv_fetch_object sqlsrv_fetch_metadata sqlsrv_free_stmt sqlsrv_get_config sqlsrv_get_field sqlsrv_has_rows sqlsrv_next_result sqlsrv_num_fields sqlsrv_num_rows sqlsrv_prepare sqlsrv_query sqlsrv_rollback sqlsrv_rows_affected sqlsrv_send_stream_data sqlsrv_server_info 详细的使用文档可以在之前下载的自解压文件里面找到。 摘抄一段文档里面的例子: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 /*===================================================================== This file is part of a Microsoft SQL Server Shared Source Application. Copyright (C) Microsoft Corporation. All rights reserved. THIS CODE AND INFORMATION ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR PURPOSE. ======================================================= */ $serverName = "(local)"; $connectionInfo = array( "Database"=>"AdventureWorks"); /* Connect using Windows Authentication. */ $conn = sqlsrv_connect( $serverName, $connectionInfo); if( $conn === false ) { echo "Could not connect.\n"; die( print_r( sqlsrv_errors(), true)); } /* Get the product picture for a given product ID. */ $tsql = "SELECT LargePhoto FROM Production.ProductPhoto AS p JOIN Production.ProductProductPhoto AS q ON p.ProductPhotoID = q.ProductPhotoID WHERE ProductID = ?"; $params = array($_REQUEST['productId']); /* Execute the query. */ $stmt = sqlsrv_query($conn, $tsql, $params); if( $stmt === false ) { echo "Error in statement execution.</br>"; die( print_r( sqlsrv_errors(), true)); } /* Retrieve the image as a binary stream. */ if ( sqlsrv_fetch( $stmt ) ) { $image = sqlsrv_get_field( $stmt, 0, SQLSRV_PHPTYPE_STREAM(SQLSRV_ENC_BINARY)); fpassthru($image); } else { echo "Error in retrieving data.</br>"; die(print_r( sqlsrv_errors(), true)); } /* Free the statement and connectin resources. */ sqlsrv_free_stmt( $stmt ); sqlsrv_close( $conn ); 是不是很简单?跟平时用的mysql、mssql函数差不多的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值