TP+MSSQL经验分享

1、TP连接MSSQL
装的是ComsenzEXP_GBK.exe,可以到ComsenzEXP官网去下载。里面的php是5.2.17,比较稳定。可以在32位和64位的操作系统下连接MSSQL。(后来做Oracle项目的时候也用这个作为web服务器)
安装好之后,默认配置是开启mssql的,将附件 中 ntwdblib.dll 放到以下目录:
(1)Windows/System32/ 下
(2)安装的PHP目录下用 ComsenzEXP_GBK 即(\ComsenzEXP\PHP5)
(3)安装的apache目录下 ComsenzEXP_GBK 即(\ComsenzEXP\Apache\bin)
然后重启apache即可
配置文件跟连接mysql类似

附件:ntwdblib

2、发布文章,大量内容(字段类型为text)添加,点击提交,提示成功。但是显示的时候发现只有一部分。
原因:php.ini 针对mssql最大字符做了限制 
修改:
打开php.ini,看到mssql.textsize,mssql.textlimit两个选项:
; Valid range 0 – 2147483647. Default = 4096.
;mssql.textlimit = 4096

; Valid range 0 – 2147483647. Default = 4096.
;mssql.textsize = 4096

可以看到默认配置为4096字节,也就是经常碰到的被截断为4K,将之改为合适的大小,去掉前面的分号,然后保存并重起WEB服务器。
我修改为65536即64K


1、插入数据库数据为乱码
 ThinkPHP/Lib/Think/Db/Db.class.php下:
 修改insert方法:
 public function insert($data,$options=array())
 $values[] = $this->conv2gbk($value); //自定义转码操作for mssql
 //$values[] = $value; //原操作
 /**
 * utf-8 to gb2312 编码转换 for mssql
 * 自定义方法
 */
 public function conv2utf8($string)
 {
 return iconv(“gb2312″,”utf-8″,$string);
 }
 public function conv2gbk($string)
 {
 return iconv(“utf-8″,”gb2312″,$string);
 }
 2、查找数据为乱码
 ThinkPHP/Lib/Think/Db/Db.class.php下:
 添加如下方法:
 /**
 * gb2312 to utf-8 数组方式编码转换 for mssql
 * 自定义方法
 */
 public function conv2utf8Array($Row){
 //$ResultSet = array();
 $RowSet = array();
 foreach($Row as $key=>$RowPerValue){
 $RowSet[$key] = iconv(“gb2312″,”utf-8″,$RowPerValue);
 }
 return $RowSet;
 }
 ThinkPHP\Lib\Think\Db\Driver\DbMssql.class.php下:
 修改getAll()方法
 $result[] = $this->conv2utf8Array($row); //为mssql实现转码
 //$result[] = $row; //原操作
 3、findall()方法执行只查询出一条语句:
MSSQL驱动的paresLimit函数的问题.
 public function parseLimit($limit) {
 if(empty($limit)) $limit=1;
 改成if(empty($limit)) return ’1=1′;
 4、save()修改数据不成功:
a\Model.class.php:
 // 主键名称
 protected $pk = ‘Id’;
 Id为数据表主键名称(严格区分大小写)
b\Db.class.php:
 将order、limit注释
 * 更新记录
 +———————————————————-
 * @access public
 +———————————————————-
 * @param mixed $data 数据
 * @param array $options 表达式
 +———————————————————-
 * @return false | integer
 +———————————————————-
 */
 public function update($data,$options) {
 //.$this->parseOrder(isset($options['order'])?$options['order']:”)
 //.$this->parseLimit(isset($options['limit'])?$options['limit']:”)
 5、save()修改数据后乱码解决问题:
 Db.class.php:添加函数
 /**
 * utf-8 to gb2312 数组方式编码转换 for mssql
 * 自定义方法
 */
 public function conv2gbkArray($Row){
 //$ResultSet = array();
 $RowSet = array();
 foreach($Row as $key=>$RowPerValue){
 $RowSet[$key] = iconv(“utf-8″,”gb2312″,$RowPerValue);
 }
 return $RowSet;
 }
 Model.class.php:添加转码代码
 public function save($data=”,$options=array()) {
 // 数据转码
 $data = $this->db->conv2gbkArray($data);
 6、删除不成功问题解决:
 Db.class.php:
 注释limit、order
 /**
 +———————————————————-
 * 删除记录
 +———————————————————-
 * @access public
 +———————————————————-
 * @param array $options 表达式
 +———————————————————-
 * @return false | integer
 +———————————————————-
 */
 public function delete($options=array())
 // .$this->parseOrder(isset($options['order'])?$options['order']:”)
 // .$this->parseLimit(isset($options['limit'])?$options['limit']:”)

注意:
比如计算用户积分的时候,mysql的时候会写:
data[‘score’] = array(‘exp’,’score+1′);// 用户的积分加1
但是使用mssql的时候,最好写成并且字段默认值为0:
$data[‘login_count’] = $authInfo[‘login_count’]+1;

TP+MSSQL经验分享》有2个想法

发表评论

邮箱地址不会被公开。