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的时候遇到什么问题,请留言大家一起学习,共同进步。