您现在的位置: 365建站网 > 365文章 > php连接mssql(sql server)数据库的方法总结

php连接mssql(sql server)数据库的方法总结

文章来源:365jz.com     点击数:532    更新时间:2018-01-07 09:27   参与评论

php连接mssql(sql server)数据库的方法总结
 

一开始我下载的php版本是5.93的,下载下来添加环境变量等等搞了半天后,phpinfo()这个函数终于成功的运行在浏览器中了。然后当我在满世界的找php_mssql.dll,才发现在5.3以及以上版本的php中已经不是原生态的支持mssql了。

好不容易找到了微软Microsoft Drivers 3.0 for PHP for SQL Server,心想微软的东西应该做的可以,却无奈的发现SQLSRV30.EXE没有办法运行:“SQLSRV30.EXE 不是有效的win32程序”。

 


首先,php.ini文件中;extension=php_pdo_mssql.dll ;extension=php_pdo_odbc.dll 前面的分号去掉,对应的使哪种方式连接mssql。注意要重启服务使其生效。

一、建立连接

1、odbc

首先,在php程序所在的服务器设置odbc。这里32位和64位操作系统有区别。32位的从控制面板中管理工具中的数据源(odbc)直接建立就可以了,64位的要运行C:\Windows\SysWOW64\odbcad32.exe

从这里面设置。注意:上面只的是数据库服务器为32为的,数据源设置服务器为32位和64位两种的情况。只要两个服务器建立的数据源位数一致就好。

下面是odbc建立连接代码。

 

</>code

  1. $con = odbc_connect('odbc名称','用户名','密码');

2、连接mssql2000

 

 

</>code

  1. $con = mssql_connect('数据库地址','用户名','密码');

 

3、连接mssql2008

</>code

  1. $connectionInfo =  array("UID"=>用户名,"PWD"=>密码,"Database"=>"数据库名称");
  2. $con = sqlsrv_connect( 数据库地址,$connectionInfo);

 

二、输入查询代码

这个都一样,可以直接写入,也可以从mssql中验证好后复制过来。简单点说就是把一个sql语句赋值给一个变量。

类似下面代码

</>code

  1. $query = "SELECT top 12 * 数据库名称 order by id desc";

三、建立查询并取出数据

 

1、odbc

</>code

  1. $result = odbc_do($con,$query);
  2. while(odbc_fetch_row($result))
  3. {
  4.     $变量名称 = odbc_result($result, "字段名称");
  5. }

2、连接mssql2000

</>code

  1. $result = mssql_query($con, $query);
  2. while($row =mssql_fetch_array($result))
  3. {
  4.     $变量名称 = $row["字段名称"];
  5. }

3、连接mssql2008

</>code

  1. $result = sqlsrv_query($con, $query);
  2. while($row = sqlsrv_fetch_array($result))
  3. {
  4.     $变量名称 = $row["字段名称"];
  5. }

在php5.3及以后的版本中不附带sqlsrv库了。所以要从微软这里下载。

 

四、关闭连接

这个没有什么区别,分别是odbc_close();和mssql_close()和sqlsrv_close();

 

 为了能让PHP连接MSSQL,系统需要安装MSSQL,PHP,且在PHP.ini中的配置中,将 ;extension=php_mssql.dll前面的;去掉

1.连接MSSQL

</>code

  1. $conn=mssql_connect("实例名或者服务器IP","用户名","密码");
  2. //测试连接
  3. if($conn)
  4. {
  5. echo "连接成功";
  6. }

2.选择要连接的数据库      

</>code

  1. mssql_select_db("dbname");

3.执行查询

</>code

  1. $rs = mssql_query("select top 1 id,username from tbname",$conn);
  2. // 或者直接执行update,insert等语句,可以不用为返回结果赋值
  3. mssql_query("update tbname set username='niunv' where id=1");

 4.获取记录集行数      

</>code

  1. echo mssql_num_rows($rs);

5.获取记录集     

</>code

  1. if($row=mssql_fetch_array($rs))
  2. {
  3. $id = $row[0];//获取ID字段值
  4. $username = $row[1];//获取username字段值
  5. }

6.获取新增记录的ID
       将id字段设置为IDENTITY字段,执行insert语句以后,就会产生一个 @@IDENTITY 全局变量值,查询出来就是最后一条新增记录的ID了.

</>code

  1. mssql_query("insert into tbname(username) values ('nv')",$conn);
  2. $rs = mssql_query("select @@IDENTITY as id",$conn);
  3. if($row=mssql_fetch_array($rs))
  4. {
  5. echo $row[0];
  6. }

7.释放记录集    

</>code

  1. mssql_free_result($rs);

 8.关闭连接    

</>code

  1. mssql_close($conn);

       注:用PHP操作MSSQL比在ASP连接MYSQL要简单,所以,当需要MSSQL与MYSQL并存时,用PHP连接MSSQL来操作MYSQL与MSSQL并存比较简单好用.如果是ASP连接MYSQL,需要安装一个MYSQL驱动,默认windows的ODBC没有安装,很遗憾...   

  •   在web服务器上至少安装了mssql的客户端    
  •   打开php.ini把;extension=php_mssql.dll   前面的分号去掉  
  •       有必要话:需要制定extension_dir  
  •   推荐使用   php<=4.0.9     <=5.0.3目前   我还没有连接成功过4.010和   5.0.3  
  •   数据库的 连接分页可以到phpe.net上获取到相应的class   

  下面是我修改的 一个class   

</>code

  1. <?php
  2. /**
  3. *mssql 数据库连接类
  4. **/
  5. class SQL{
  6. var $server;
  7. var $userName;
  8. var $passWord;
  9. var $dataBase;
  10. var $linkID = 0;
  11. var $queryResult;
  12. var $lastInsertID;
  13. var $pageNum = 0;//分页用---共有几条数据
  14. var $ER;
  15. /**
  16. *构造函数
  17. **/
  18. function SQL($Server='',$UserName='',$PassWord='',$DataBase=''){
  19. $this->server = $Server;
  20. $this->userName = $UserName;
  21. $this->passWord = $PassWord;
  22. $this->dataBase = $DataBase;
  23. }
  24. /**
  25. *数据库连接
  26. **/
  27. function db_connect(){
  28. $this->linkID = mssql_pconnect($this->server,$this->userName,$this->passWord);
  29. if(!$this->linkID){
  30. $this->ER = "db_connect($this->server,$this->userName,$this->passWord) error";
  31. return 0;
  32. }
  33. if (!mssql_select_db($this->dataBase,$this->linkID)) {
  34. $this->ER = "mssql_select_db($this->dataBase,$this->lastInsertID) error";
  35. return 0;
  36. }
  37. return $this->linkID;
  38. }
  39. /**public
  40. * function: Check the database, if exist then select
  41. * exist: return 1
  42. * not exist: return 0
  43. */
  44. function selectDatabase(){
  45. if(mssql_select_db($this->dataBase))
  46. return 1;
  47. else
  48. return 0;
  49. }
  50. /**
  51. *数据操作
  52. **/
  53. function query($Str){
  54. if ($this->linkID == 0) {
  55. $this->ER = "数据库还没有连接!!";
  56. }
  57. $this->queryResult = mssql_query($Str);
  58. //$this->queryResult = mssql_query($Str,$this->linkID);
  59. if (!$this->queryResult) {
  60. $this->ER = "$Str.没有操作成功,query error!!";
  61. return 0;//****************对于php 4.3.9以上版本的错误用1
  62. }
  63. return $this->queryResult;
  64. }
  65. /**
  66. *数据获取
  67. **/
  68. function fetch_array($result){
  69. if($result != "") $this->queryResult = $result;
  70. $rec =mssql_fetch_array($this->queryResult);
  71. if(is_array($rec)){
  72. return $rec;
  73. }
  74. //$this->ER = "没有获取数据!";
  75. return 0;
  76. }
  77. /**public
  78. * function: Free the Query Result
  79. * success return 1
  80. * failed: return 0
  81. */
  82. function freeResult($result=""){
  83. if($result != "") $this->queryResult = $result;
  84. return mssql_free_result($this->queryResult);
  85. }
  86. /**
  87. *获取影响的的行数
  88. *获取操作过的行数
  89. **/
  90. function num_rows($result=""){
  91. if ($result != "") {
  92. $this->queryResult = $result;
  93. $row = mssql_num_rows($this->queryResult);
  94. return $row;
  95. }
  96. }
  97. /**
  98. *获取查询结果---多个
  99. **/
  100. function result_ar($str=''){
  101. if (empty($str)) {
  102. return 0;
  103. }
  104. $back = array();
  105. $this->queryResult = $this->query($str);
  106. while ($row = $this->fetch_array($this->queryResult)) {
  107. $back[] = $row;
  108. }
  109. return $back;
  110. }
  111. /**
  112. *数据库信息分页
  113. *$Result 数据库操作
  114. *str ==sql语句
  115. *page ==第几页
  116. *showNum ==显示几页
  117. */
  118. function page($Str,$Page=0,$ShowNum=5){
  119. $back = array();//返回数据
  120. $maxNum = 0;
  121. if ($Str == "") {
  122. $this->ER = "没有数据";
  123. return 0;
  124. }
  125. $this->queryResult = $this->query($Str);
  126. if($this->queryResult){
  127. if($Page==""){
  128. $nopa=0;
  129. }else{
  130. $nopa = ($Page-1)*$ShowNum;
  131. if ($nopa<0) {
  132. $nopa = 0;
  133. }
  134. }
  135. $maxNum=$this->num_rows($this->queryResult);
  136. $k=0;
  137. $i=0;
  138. $dd=$this->fetch_array($this->queryResult);
  139. while($dd&&$nopa<=$maxNum&&$i<$ShowNum){
  140. if($nopa >= $maxNum) $nopa = $maxNum;
  141. mssql_data_seek($this->queryResult,$nopa);
  142. $row=$this->fetch_array($this->queryResult);
  143. $nopa++;
  144. $i++;
  145. $back[] = $row;
  146. if ($nopa >=$maxNum) {
  147. break;
  148. }
  149. }
  150. }
  151. $this->pageNum = $maxNum;
  152. return $back;
  153. }
  154. /**
  155. *分页的html页码
  156. */
  157. function page_html($DataNum=0,$Page=1,$ShowNum=3,$web,$Post=''){
  158. if ($DataNum == 0) {
  159. $back = "没有要查询的数据";
  160. }else {
  161. if ($ShowNum<=0) {
  162. $ShowNum = 3;
  163. }
  164. if ($Page<=0) {
  165. $Page = 1;
  166. }
  167. if (empty($web)) {
  168. $web = "#";
  169. }
  170. $pageNum = ceil($DataNum/$ShowNum);
  171. if ($Page <= 1) {
  172. $top = "首页<<";
  173. }else {
  174. $top = "<a href='".$web."?page=0&".$Post."' target='_self'>首页<< </a>";
  175. }
  176. if ($Page !==1) {
  177. $upPage = "<a href='".$web."?page=".($Page-1)."&".$Post."' target='_self'>上一页</a>";
  178. }else {
  179. $upPage = "上一页";
  180. }
  181. if ($Page < $pageNum) {
  182. $downPage = "<a href='".$web."?page=".($Page+1)."&".$Post."' target='_self'>下一页</a>";
  183. }else {
  184. $downPage = "下一页";
  185. }
  186. if ($Page == $pageNum) {
  187. $foot = ">>尾页";
  188. }else {
  189. $foot = "<a href='".$web."?page=".$pageNum."&".$Post."' target='_self'> >>尾页</a>";
  190. }
  191. $back = <<<EOT
  192. 共 $pageNum 页   
  193. 第 $Page/$pageNum 页 $top   $upPage   $downPage   $foot
  194. EOT;
  195. }
  196. return $back;
  197. }
  198. }//end class
  199. ?>

 

1、数据库连接失败的问题,提示 Fatal error: Call to undefined function mssql_connect() in。

首先要安装WAMP5(我安装在D:\wamp),该服务器默认是连接My Sql 数据库,所以要想连接SQL 
Server2005数据库,必须修改php.ini。即去掉;extension=php_mssql.dll前的";",再设置 
mssql.secure_connection = On。然后检查 D:/wamp/php/ext/ 中的ntwdblib.dll版本(版本 
2000.2.8.0支持SQL Server2000,版本2000.80.194.0支持SQL Server2005)。修改完后记得重启整个 
WAMP5。

2、PHP页面查询SQL Server2005中数据时,中文显示乱码。

这是因为SQL Server2005默认的是支持gb2312页面编码方式,而且php.ini配置与.php页面编码不一致, 
所以修改两个地方:一是php.ini修改为default_charset = "gb2312";二是将.PHP页面的编码方式修改 
过来即可,即<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />。(注: 
Mysql 数据库既支持gb2312编码又支持utf-8编码)

3、jquery.js放在根目录下的inc文件夹中,但PHP页面无法引用。

WEB页面使用jquery技术不跳转页面实现后台数据库交互,必须引用jquery.js。写法是<script 
type="text/javascript" src="/inc/jquery.js"></script>

4、PHP页面使用header("location:shopping_car.php")定向页面时出错,Warning: Cannot modify 
header information - headers already sent by。

原因:setcookie函数必須在任何资料输出至浏览器前,就先送出。

解决办法:头部最前方设置ob_start(); 打开缓冲区;和尾部ob_end_flush();//输出全部内容到浏览器 

5、如果PHP页面编码方式是utf-8,但是页面中没有<meta http-equiv="Content-Type" 
content="text/html; charset=utf-8" />。用alert()时,中文显示乱码。

解决办法:一定要在网页中指定编码方式为UTF-8,即添加<meta http-equiv="Content-Type" 
content="text/html; charset=utf-8" />,因为有alert()输出中文到浏览器。

 


Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 2611816 
bytes)

今天要用php代码来处理一个580M的日志文件,总共有219万多行记录,因为是.log的文件,在windows下 
面很难将文件按照条数来分割,于是在linux下用split -l 10000 filename 前缀名 将整个文件按10000 
行一个分割成了200多个小文件,之后用php来循环处理这200多个文件,可是执行到后来就出现了题目上 
面的错误:

 

Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 2611816 
bytes)

去百度了一下,原来是php.ini中的内存分配的问题,默认php代码能够申请到的最大内存字节数就是 
134217728 bytes,如果代码执行的时候再需要更多的内存,就会报错了,于是就将php.ini文件中的配 
置改了一下:


memory_limit = 128M;//将128M改成了256M

但是之后一想,一个php脚本一次请求的内存空间就要超过128M,那不管你以后将memory_limit设置成多 
大,以后肯定有出问题的时候。

如对本文有疑问,请提交到交流论坛,广大热心网友会为你解答!! 点击进入论坛

发表评论 (532人查看0条评论)
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
昵称:
最新评论
2018年01月07日 09:35游客

很详细!O(∩_∩)O谢谢~

------分隔线----------------------------

快速入口

· 365软件
· 杰创官网
· 建站工具
· 网站大全

其它栏目

· 建站教程
· 365学习

业务咨询

· 技术支持
· 服务时间:9:00-18:00
365建站网二维码

Powered by 365建站网 RSS地图 HTML地图

copyright © 2013-2024 版权所有 鄂ICP备17013400号