在sp中实现了SQLserver2005 数据库存取

#1 cygsd

一直想用SP存取SQLserver2005,经过一天的鼓捣,成了。

测试环境:WINDOWS7,SQLserver 2005 sp3,SpeedPHP3
其中:SQLserver登录方式为windows登录

第一步:
在PHP服务器上安装:SQLServerDriverForPHP20,并加载到PHP扩展设置中。
下载地址:http://download.microsoft.com/download/5/5/6/556130D8-338E-443F-ABFF-3E3921DD7425/SQLServerDriverForPHP20.exe

第二步:
安装sql native client 2008
下载地址:http://download.microsoft.com/download/B/6/3/B63CAC7F-44BB-41FA-92A3-CBF71360F022/1033/x86/sqlncli.msi

第三步:
如不想破坏原SpeedPHP环境,就新建一个SpeedPHP测试环境,修改设置如下:

spConfig设置:

'db' => array(  // 数据库连接配置
  'driver' => 'mssql2005',   // 驱动类型
  'host' => 'CYGSD\SQL2005', // 数据库地址
  'port' => '',        // 端口
  'login' => '',     // 用户名  //测试环境SQLserver登录方式为windows登录,无需“用户名”和“密码”
  'password' => '',      // 密码
  'database' => 'DaYangDB',      // 库名称
  'prefix' => '',           // 表前缀
  'persistent' => FALSE,    // 是否使用长链接
),
'db_driver_path' => SP_PATH.'/Drivers/mssql2005.php', // 自定义数据库驱动文件地址


第四步:创建SpeedPHP\Drivers\mssql2005.php文件,内容如下:

 
/////////////////////////////////////////////////////////////////
// SpeedPHP中文PHP框架, Copyright (C) 2008 - 2010 SpeedPHP.com //
/////////////////////////////////////////////////////////////////
/**
* db_sqlsrv sqlsrv2005数据库的驱动支持,修改自SpeedPHP MsSQL数据库驱动
* 文件名:mssql2005.php
*/
class db_mssql2005 { //类名作了修改
/**
  * 数据库链接句柄
  */
public $conn;
/**
  * 执行的SQL语句记录
  */
public $arrSql;
/**
  * 按SQL语句获取记录结果,返回数组
  *
  * @param sql  执行的SQL语句
  */
public function getArray($sql)
{
  if( ! $result = $this->exec($sql) )return FALSE;
  if( ! sqlsrv_num_rows($result) )return FALSE; //所有MSSQL函数修改为SQLSRV函数,下同
  $rows = array();
  while($rows[] = sqlsrv_fetch_array($result,SQLSRV_FETCH_ASSOC)){} //原MSSQL_ASSOC,改为SQLSRV_FETCH_ASSOC
  sqlsrv_free_stmt($result); //原为mssql_free_result($result)
  array_pop($rows);
  return $rows;
}

/**
  * 返回当前插入记录的主键ID
  */
public function newinsertid()
{
  $result = $this->getArray("select @@IDENTITY as sptmp_newinsert_id");
  return $result[0]['sptmp_newinsert_id'];
}

/**
  * 格式化带limit的SQL语句。
  */
public function setlimit($sql, $limit)
{
  //if(!eregi(",", $limit))$limit = '0,'.$limit;
  //$sql .= " LIMIT {$limit}";
  //return $this->translimit($sql);
  return $sql; //不作处理,直接返回,以兼容spModel。sql2005不支持limit,此处舍弃
}
/**
  * 执行一个SQL语句
  *
  * @param sql 需要执行的SQL语句
  */
public function exec($sql)
{
  $this->arrSql[] = $sql;
  if( $result = sqlsrv_query($this->conn,$sql, array(), array( "Scrollable" => SQLSRV_CURSOR_KEYSET ))){
   //原为mssql_query($sql, $this->conn),参数次序有变
   return $result;
  }else{
   spError("{$sql}
执行错误. " ); // 这里舍弃了 mssql_get_last_message(),未找到合适函数
  }
}

/**
  * 返回影响行数
  */
public function affected_rows()
{
  return sqlsrv_rows_affected($this->conn);
}
/**
  * 获取数据表结构
  *
  * @param tbl_name  表名称
  */
public function getTable($tbl_name)
{
  $result = $this->getArray("SELECT syscolumns.name FROM syscolumns, systypes WHERE syscolumns.xusertype = systypes.xusertype AND syscolumns.id = object_id('{$tbl_name}')");
  $columns = array();
  foreach( $result as $column )$columns[] = array('Field'=>$column['name']);
  return $columns;
}
/**
  * 构造函数
  *
  * @param dbConfig  数据库配置
  */
public function __construct($dbConfig) //此函数修改多处
{
  if(!function_exists('sqlsrv_connect'))spError('PHP环境未安装sqlsrv函数库!');
  $connstr = array("Database"=>$dbConfig['database'],"ConnectionPooling"=>false,"CharacterSet" => "UTF-8");
  $this->conn = sqlsrv_connect($dbConfig['host'], $connstr) or spError("SQLserver2005数据库链接错误,或无法找到数据库,请确认链接正常,数据库名称正确!" );
}
/**
  * 对特殊字符进行过滤
  *
  * @param value  值
  */
public function __val_escape($value) {
  if(is_null($value))return 'NULL';
  if(is_bool($value))return $value ? 1 : 0;
  if(is_int($value))return (int)$value;
  if(is_float($value))return (float)$value;
  if(@get_magic_quotes_gpc())$value = stripslashes($value);
  $search=array("\\","\0","\n","\r","\x1a","'",'"');
        $replace=array("\\\\","[NULL]","\\n","\\r","\Z","''",'\"');
        return '\''.str_replace($search,$replace,$value).'\'';
}
/**
  * 析构函数
  */
public function __destruct()
{
  if( TRUE != $dbConfig['persistent'] )@sqlsrv_close($this->conn);
}
//function translimit($sql) {...} 此函数舍弃
}



第五步:测试
在SQLserver上新建一个数据库,名字为xiangmu,三个字段:xmID(int,设为自增量),xmName(nchar(50)),xmBianHao(nchar(50))。

创建model\md_xiangmu.php:
 
class md_xiangmu extends spModel{
var $table='xiangmu';
var $pk='xmID';
}


以下为controller\main.php测试代码:
 
class main extends spController
{
function index(){
  //phpinfo();
  //echo "Hello World!
";
  if (!function_exists('sqlsrv_query')) die('PHP环境未安装MSSQL2005函数库!');
  $serverName = "CYGSD\SQL2005";
  $connectionInfo = array("Database"=>"DaYangDB","ConnectionPooling"=>false,"CharacterSet" => "UTF-8");
  $conn = sqlsrv_connect( $serverName,$connectionInfo);
  if( $conn == false){
   echo "连接失败!";
   $error=sqlsrv_errors();
   dump($error);
  }else{
   echo "SQLserver 信息:
";
   $server_info = sqlsrv_server_info($conn);
   dump($server_info);
   echo "SQLclient 信息:
";
   $client_info= sqlsrv_client_info($conn);
   dump($client_info);
   echo "使用SQLserver数据库函数采集的数据:
";
   $sql = "SELECT * FROM xiangmu";
   $data = sqlsrv_query($conn, $sql, array(), array( "Scrollable" => SQLSRV_CURSOR_KEYSET ));
   while($row = sqlsrv_fetch_array($data,SQLSRV_FETCH_ASSOC)) {dump($row);}
   sqlsrv_close($conn);
  }
  echo "SpeedPHP的输出结果:
";
  $datas=array("xmName"=>"测试SpeedPHP的输出结果","xmBianHao"=>"测试号码");
  $newid="新建:". spClass("md_xiangmu")->create($datas);
  dump($newid);
  $list=spClass("md_xiangmu")->findAll();
  dump($list);
  //spClass("md_xiangmu")->update(array("xmID"=>"9"),$datas);
  //$list=spClass("md_xiangmu")->findAll(array("xmID"=>"10"));
  //dump($list);
  //spClass("md_xiangmu")->delete(array("xmID"=>"9"));
  echo "测试结束。
";
}
}


测试输出的结果(节选):
 
SQLserver 信息:
Array
(
    [CurrentDatabase] => DaYangDB
    [SQLServerVersion] => 09.00.4035
    [SQLServerName] => CYGSD\SQL2005
)

SQLclient 信息:
Array
(
    [DriverDllName] => sqlncli10.dll
    [DriverODBCVer] => 03.52
    [DriverVer] => 10.50.1600
    [ExtensionVer] => 1.1.428.1
)

使用SQLserver数据库函数采集的数据:
    [0] => Array
        (
            [xmID] => 1
            [xmName] => test test                                         
            [xmBianHao] => this is a test      
        )

.....

Array
(
    [xmID] => 32
    [xmName] => 测试SpeedPHP的输出结果                                   
    [xmBianHao] => 测试号码               
)

Array
(
    [xmID] => 33
    [xmName] => 测试SpeedPHP的输出结果                                   
    [xmBianHao] => 测试号码               
)

SpeedPHP的输出结果:
Array
(
    [0] => Array
        (
          [xmID] => 1
          [xmName] => test test                                         
          [xmBianHao] => this is a test      
        )
   .....

   [28] => Array
        (
          [xmID] => 35
          [xmName] => 测试SpeedPHP的输出结果                                   
          [xmBianHao] => 测试号码               
        )
    [29] => Array
        (
          [xmID] => 36
          [xmName] => 测试SpeedPHP的输出结果                                   
          [xmBianHao] => 测试号码               
        )
)

2010-11-02 21:45:46

#2 jake

:handshake

不错,楼主很厉害哦

2010-11-03 08:42:02

#3 cygsd

修改了一下,注明:SQLserver登录方式为windows登录

2010-11-03 11:26:15

#4 homexigua

测试了下,limit也可以直接使用

2010-11-11 13:41:35

#5 homexigua

按楼主的修改了下,换成帐号连接数据库,limit正常使用
mssql2005.rar

2010-11-11 17:13:26

#6 prince

这个数据库驱动还有在用吗?我现在安装是安装上了(ms的php驱动我用的是3.0版,),phpinfo也提示已经安装成功,用上面那个测试代码测试不成功:
连接失败!
Array
(
    [0] => Array
        (
            [0] => IMSSP
            [SQLSTATE] => IMSSP
            [1] => -49
            
 => -49
            [2] => This extension requires the Microsoft SQL Server 2012 Native Client. Access the following URL to download the Microsoft SQL Server 2012 Native Client ODBC driver for x86: http://go.microsoft.com/fwlink/?LinkId=163712
            [message] => This extension requires the Microsoft SQL Server 2012 Native Client. Access the following URL to download the Microsoft SQL Server 2012 Native Client ODBC driver for x86: http://go.microsoft.com/fwlink/?LinkId=163712
        )

    [1] => Array
        (
            [0] => IM002
            [SQLSTATE] => IM002
            [1] => 0
            
 => 0
            [2] => [Microsoft][ODBC 驱动程序管理器] 未发现数据源名称并且未指定默认驱动程序
            [message] => [Microsoft][ODBC 驱动程序管理器] 未发现数据源名称并且未指定默认驱动程序
        )

)

2013-07-28 21:11:18

#7 prince

prince 发表于 2013-7-28 21:11
这个数据库驱动还有在用吗?我现在安装是安装上了(ms的php驱动我用的是3.0版,),phpinfo也提示已经安装成功 ...
补上环境:

win server 2003 标准版+phpStudy2013(PHP5.3.27)

2013-07-28 21:13:58

#8 prince

prince 发表于 2013-7-28 21:11
这个数据库驱动还有在用吗?我现在安装是安装上了(ms的php驱动我用的是3.0版,),phpinfo也提示已经安装成功 ...
这个问题已经解决,是MS的页面内容不好找而已,点那个链接上去后把驱动安装好,然后再从这个地址:
http://www.microsoft.com/zh-cn/download/details.aspx?id=29065
的页面上选中文,再点“安装说明"才显示出来好多内容,在里面找到"Microsoft® SQL Server® 2012 Native Client" ->"x64包"(
http://go.microsoft.com/fwlink/?LinkID=239648&clcid=0x804)这项,安装上就行了。
x86包(http://go.microsoft.com/fwlink/?LinkID=239647&clcid=0x804)

2013-08-09 18:13:55

#9 移动互联网团队

真正想连接SQLServer的人还是看这篇文章吧http://www.zzbaike.com/wiki/SpeedPHP/多种类型数据库的配置,别按照这篇文章来做乐,太坑乐

2013-09-17 14:40:23

#10 xpp1000

呵呵,speedphp越来越强大了

2013-11-03 12:44:42