关于PHP读取MSSQL2005字段内有数据输出为空的原因及解决方案

by 清泉 14. 十二月 2009 20:21

    MS对PHP的支持不是太友好,使用微软官方提供的SQLServerDriverForPHP资源包,可以解决PHP读取MSSQL2005过程中遇到的一些问题,(有关,SQLServerDriverForPHP资源的下载,及PHP读取SQL2005数据库的使用方法,可以点击查看相关文章。如:PHP连接SQL Server 2005,php sqlserver2005编程,php sqlserver2005应用编程)但可能因PHP是外家竞争对手,对其的支持也很是有限,在查询数据的时候可能会遇到一些莫名的问题。
    下面是一个使用PHP读取MSSQL2005的实用范例:
 <?php
 $serverName = "www.supidea.com";
 $connectionInfo = array( "Database"=>"AdventureWorks");
 $conn = sqlsrv_connect( $serverName, $connectionInfo);
 if( $conn === false )
 {
  echo "连接数据库失败.\n";
  die( print_r( sqlsrv_errors(), true));
 }
 $tsql = "SELECT id,myName,myContent,dataTime Comments FROM [www.supidea.com]";
 $supidea = sqlsrv_query($conn, $tsql);

 if( sqlsrv_fetch( $supidea ) === false)
 {
  echo "没有数据或查询出错.\n";
  die( print_r( sqlsrv_errors(), true));//输出查询具体出错原因
 }
 else
 {
  id=sqlsrv_get_field($supidea,0);
  myName=sqlsrv_get_field($supidea,1);
  myContent=sqlsrv_get_field($supidea,2);
  dataTime=sqlsrv_get_field($supidea,3);
 }
 ?>
    如果www.supidea.com这个表中的myContent字段类型为ntext,直接使用上面的语句,输出的myContent值将为空,这需要对查询语句进行修改,改为“SELECT id,myName,convert(text,myContent) Comments FROM www.supidea.com”,将其转换成text输出,同时sqlsrv_get_field($supidea,2)需要在sqlsrv_get_field函数调用最后面加入一个参数SQLSRV_PHPTYPE_STREAM(SQLSRV_ENC_CHAR),标明是SQL2005L转换的字符,也就是变为sqlsrv_get_field($supidea,2,SQLSRV_PHPTYPE_STREAM(SQLSRV_ENC_CHAR))。
    如果dataTime读取的对应字段类型在SQL2005里面为时间类型,这样直接输出便会报错,也得将其转换为字符输出sqlsrv_get_field($supidea,3,SQLSRV_PHPTYPE_STREAM(SQLSRV_ENC_CHAR)),不然便会报错。
    下面进入正题:PHP读取MSSQL2005字段内有数据输出为空的原因,在某些时候,PHP使用sqlsrv_get_field读取MSSQL2005数据中某一nvarchar类型的字段的时候,他输出的也是空数据,对应字段里面明明有内容,但却没能读取到内容,使用SQLSRV_PHPTYPE_STREAM(SQLSRV_ENC_CHAR)以在在查询语句里面加入convert(text,field)进行转码,不管怎么试,输出始终为空。
    这就有两原因:
    1、使用sqlsrv_get_field的时候,里面第二个参数,标识第几个字段的数字必须是从小开始,且只能使用一次。即如果你先使用了myName=sqlsrv_get_field($supidea,1)再想在下面的地方调用id=sqlsrv_get_field($supidea,0)的时候,id所得到的数据便是空,没得到正确数据。这点还是可以忍受的。
    2、sqlsrv_get_field读取的字段中的字符长度和MSSQL2005字符限制数相等的时候也会显示为空,这可能是因为你当前PHP执行程序的页面编码方式PHP和MSSQL2005对字符的编码方式不一样,导致SQLServerDriverForPHP误以为是数据溢出,他就给输出为空了,看来SQLServerDriverForPHP的容错性能到是不错,不错就是因为他的这个容错,让人找不出为什么从nvarchar中读取数据也会输出空了,解决办法很简单:进入MSSQL2005中将对应的字段长度加倍加长便可以了。
    由于PHP连接MSSQL2005数据库使用的人比较少,难免会出现一些BUG,大家还是尽量少用PHP连接MSSQL数据库,不过有时候也没办法,网站系统改为使用PHP的,数据库使用了MYSQL,不得不对数据进行转移,把SQL2005的数据转移到MYSQL上面,虽然采集软件可以解决一些问题,但一些逻辑性的问题还是要自己想办法解决。
    本文系本博原创,如有转载,请注明转自晨飞的梦[www.supidea.com],关于PHP读取MSSQL2005字段内有数据输出为空的原因及解决方案
    如果哪个朋友在使用PHP连接MSSQL2005的时候遇到什么问题,请留言大家一起学习,共同进步。

Tags:

PHP技术资料

添加评论



(将显示你的Gravatar头像)  

biuquote
微笑得意调皮害羞酷大笑惊讶发呆喜欢可怜尴尬闭嘴噘嘴皱眉伤心抓狂呕吐坏笑漫骂发怒
Loading



Supidea.com 晨飞的梦 @ All Rights Reserved. Powered by BlogYi.NET ver:1.8.0.0. 苏ICP备09011404号

关于博主

kamau
抱着美好的理想背井离乡,这酸甜苦辣只能默默忍受。既然选择了路,就得风雨兼程……

Calendar

<<  二月 2012  >>
303112345
6789101112
13141516171819
20212223242526
2728291234
567891011

在日历中查看文章

最近的评论

Comment RSS

声明

      本博所发一切破解相关附件只作学习研究交流之用,严禁用于商业用途,请在下载24小时内删除。
      本博所有网友评论不代表本博立场,版权归其作者所有。

© Copyright 2009