nav-left cat-right
cat-right
PHP+ADODB+MSSQL支持UTF8的2种解决方案

由于公司的项目都是用sql server 2005来开发的,所以最近的php项目为求简便都用了adodb库来操作数据库,鉴于有很多Ajax应用,所以所有编码都统一使用UTF8,连接数据库代码如下:

$db = &NewADOConnection('mssql');
$db->debug = 0;
$ADODB_FETCH_MODE = ADODB_FETCH_BOTH;
$db->Connect($db_host, $db_user, $db_pass, $db_name) or die("Connect database failed");

但实际使用中发现mssql读取数据无法设置字符集和编码,最后把所有adodb的驱动库搜索了一遍发现了2个解决方案,第一个方案是使用ado_mssql来连接数据库,这样就可以支持charPage参数了,连接数据库代码如下:

$db = &ADONewConnection('ado_mssql');//这里将mssql改成ado_mssql
$ADODB_FETCH_MODE = ADODB_FETCH_BOTH;
$db->charPage=CP_UTF8;//这里是关键
$myDSN="PROVIDER=MSDASQL;DRIVER={SQL Server};SERVER=$db_host;DATABASE=$db_name;UID=$db_user;PWD=$db_pass;";
$db->Connect($myDSN) or die("Connect database failed");

第二个方法是安装SQL Server Driver for PHP,早就知道微软除了这个驱动,一直么有尝试,这次在adodb类库里看到有mssqlnative的驱动,发现备注里说明要用到SQL Server Driver for PHP,下载地址:http://www.microsoft.com/Sqlserver/2005/en/us/php-driver.aspx
这是微软提供一套操作mssql2005/2008的PHP函数库,要使用这套操作函数库请保证PHP版本在5.2以上,下载解压后会看到dll文件,根据自己的php版本及环境来选择正确的dll文件放到php/ext/下, 更多说明请参考文档。 然后在php.ini中添加一行“extension=xxx.dll”,重启IIS后phpinfo()如果现实有“sqlsrv”扩展就说明安装成功了。Unix下安装请参照:http://phpbuilder.com/columns/alberto20000919.php3
接下来就可以使用新的驱动来操作数据库了,文档里有详细的操作方法,可以研究一下,总之就是操作数据库可以设置”CharacterSet” = “UTF-8″了,这里根据网上的方法把adodb库做简单的修改就可以了,adodb已经封装了大部分的操作方法,我们只需让adodb的mssqlnvtive支持设置Character就可以了,方法如下:打开adodb/driver/adodb-mssqlnative.inc.php,找到function _connect这个函数,在参数里添加CharacterSet,代码如下:

function _connect($argHostname, $argUsername, $argPassword, $argDatabasename,$CharacterSet="UTF-8")
{
    if (!function_exists('sqlsrv_connect')) return null;
    $connectionInfo = array("Database"=>$argDatabasename,'UID'=>$argUsername,'PWD'=>$argPassword,'CharacterSet'=>$CharacterSet);

这样我们连接数据库是的代码对应修改为:

$db = &ADONewConnection('mssqlnative');//这里将mssql改成mssqlnative
$ADODB_FETCH_MODE = ADODB_FETCH_BOTH;
$db->Connect($db_host, $db_user, $db_pass, $db_name,$CharacterSet="UTF8")  or die("Connect database failed");
//当然你也可以使用别的编码。

用adodb的好处就是不用去学习微软提供的操作函数。

adodb中qstr的妙处

使用adodb库的好处就在于里面会有很多好用的函数,今天说的就是qstr的用法,此函数会再提交到数据库之前将字符串里的引号转义,并用引号来包裹,比用addslashes要方便很多。
function qstr($s,$magic_quotes=false)
{
if (!$magic_quotes) {

if ($this->replaceQuote[0] == ‘\\’){
// only since php 4.0.5
$s = adodb_str_replace(array(‘\\’,”\0″),array(‘\\\\’,”\\\0″),$s);
//$s = str_replace(“\0″,”\\\0″, str_replace(‘\\’,'\\\\’,$s));
}
return “‘”.str_replace(“‘”,$this->replaceQuote,$s).”‘”;
}

// undo magic quotes for ”
$s = str_replace(‘\\”‘,’”‘,$s);

if ($this->replaceQuote == “\\’”) // ‘ already quoted, no need to change anything
return “‘$s’”;
else {// change \’ to ” for sybase/mssql
$s = str_replace(‘\\\\’,'\\’,$s);
return “‘”.str_replace(“\\’”,$this->replaceQuote,$s).”‘”;
}
}

XajaxBook By PHP+Mysql+Xajax+Adodb+Smarty

历时三天的XajaxBook终于发布了,这只是一个学习的作品,所以用到了一些类库和框架,先放出这个带分页功能不带管理功能的Ajax留言本程序,程序中已经有较详细的注释,本作品供初学Xajax+Adodb+Smarty 开发的朋友参考,欢迎达人对这个本本抛砖。
演示:http://www.797audio.com/gb/
下载:在全文最下面
废话少说,看目录结构:

|+adodb
|+smarty
|+templates
|+templates_c
|+xajax
|-init.php
|-db.config.php
|-index.php

db.config.php

/**
* XajaxBook 留言簿数据库配置文件
* ============================================================================
* 版权所有 (C) 2007 im502@126.com,并保留所有权利。
* 网站地址: http://www.im502.com
* ============================================================================
* @file: db.config.php
* @author: im502
* @version: V1.0 Beta
* @update: 2007-10-26
* ———————————————
*/
// database host
$db_host = ‘localhost’;

// database name
$db_name = ‘mydb’;

// database username
$db_user = ‘root’;

// database password
$db_pass = ‘password’;
?>

init.php

/**
* XajaxBook 留言簿公用文件
* ============================================================================
* 版权所有 (C) 2007 im502@126.com,并保留所有权利。
* 网站地址: http://www.im502.com
* ============================================================================
* @file: init.php
* @author: im502
* @version: V1.0 Beta
* @update: 2007-10-26
* ———————————————
*/

/*包含数据库连接文件,adodb类库,Smarty类库,xajax类库*/
include_once(“db.config.php”);
require_once(“adodb/adodb.inc.php”);
require_once(“smarty/Smarty.class.php”);
require_once(“xajax/xajax.inc.php”);

/* 初始化数据库类 */
$db = &NewADOConnection(‘mysql’);
$db->Connect($db_host, $db_user, $db_pass, $db_name) or die(“Connect database failed”);
$db->query(“SET NAMES ‘gb2312′;”);
$db->debug = 0;//是否开启mysql侦错

/* 创建 Smarty 对象。*/
$smarty = new Smarty;
if (!file_exists(‘templates/caches’))
{
@mkdir(‘templates/caches’);
@chmod(‘templates/caches’, 0777);
}
if (!file_exists(‘templates_c’))
{
@mkdir(‘templates_c’);
@chmod(‘templates_c’, 0777);
}
clearstatcache();
$smarty->template_dir = ‘templates’;
$smarty->cache_dir = ‘templates/caches’;
$smarty->compile_dir = ‘templates_c’;
$smarty->caching = false;
$smarty->compile_force = false;
$smarty->left_delimiter = “<{“; //为防止与js冲突,使用<{}> 这样的定界符 替换默认的{}
$smarty->right_delimiter = “}>”;
$smarty->compile_check = 1;
$smarty->register_resource(“db”, array(“db_get_template”, “db_get_timestamp”, “db_get_secure”, “db_get_trusted”));
?>
阅读全部

Adodb+Smarty中文手册下载

最近一直在学习用Adodb+Smarty进行数据库网站开发,网上的教程挺多的,一搜一大堆,使用中发现真的很省事。
这里放俩个中文手册提供给大家下载。

adodb中文手册

smarty手册中英文对照