标签: CodeIgniter

CodeIgniter 通过ODBC连接 SqlServer的方法实例

我们都知道PHP跟MySql是最佳拍档,但是有些时候,出于种种原因,还是需要让PHP连接一下其他数据库的,比如微软的SQL Server。原生的PHP本身也提供了各种函数连接SQL Server,包括直连或通过ODBC连接。不过现在开发PHP项目很少不用框架,国内来讲,CodeIgniter这个开源框架因为架构清晰,文档丰富,所以很容易上手快,

而这次将要描述的就是在CodeIgniter 框架下,如何通过ODBC连接SQL Server数据库。

可能有人会问了,为啥不直连SQL Server,偏要绕道ODBC呢? 其实我不相瞒,要是能痛痛快快的直连上SQL Server我也就不用舍近求远走ODBC了。当时是想直连来着,不过没搞定,走ODBC则成功了。其实,通过ODBC连SQL Server还有一个好处是,ODBC是一个通用的数据库连接接口,它并不关注要连接的数据库的实例是什么类型或什么版本,因此,只要你的代码连接上了ODBC,理论上你就可以通过ODBC的系统DSN得到任何你想要的其他数据库连接实例,而不需要对你的代码进行太多改写。本着实用主义的原则,既然通过ODBC能连上,那么我就来总结一下连接的步骤。

首先介绍一下我的运行环境:

• wamp 的apache,php,MySql集成安装环境

• CodeIgniter 2.02版

• Microsoft SQL Server 2008 Express版(当然正式版的更好)

• Windows7 操作系统

第一步:SQL Server 2008连接到ODBC

这里罗嗦一句,要保证SQL Server 2008 Express能正常连接到ODBC,先看一下是否已经开启了SQL Server网络配置里的TCP/IP。Express版这里是默认关闭的,正式版这里默认就是开启状态,所以没这个问题。

sqlserver tcpip设置

设置ODBC的系统DSN,在ODBC数据管理器中新建一个系统DSN,名称叫test1,服务器是localhost,我是连接本机的Sql Server服务。

odbc建立连接sqlserver的dsn

下一步,输入SQL Server的用户名密码,我用的是SQL Server验证:

odbc连接sqlserver需要 用户名密码

填入SQL Server的用户名密码之后要求选择默认的数据库,在下一步点击完成,然后测试一下这个连接:

点击测试数据源,之后提示你测试成功,ODBC到SQL Server的连接就建立好了。然后我们得到了这个系统DSN:

已经建立好的系统dsn

第二步: CodeIgniter配置和连接ODBC:

为能连上ODBC数据源,CI的数据库配置文件database.php需配置如下:

$db['default']['hostname'] = 'test1';

$db['default']['username'] = 'sa';

$db['default']['password'] = '123456';

$db['default']['dbdriver'] = 'odbc';

$db['default']['dbprefix'] = '';

$db['default']['pconnect'] = TRUE;

$db['default']['db_debug'] = TRUE;

说明:hostname是系统DSN的名字,username是SQL Server超管名字,password的123456是其超管密码,表前缀我保持为空,最后两个参数pconnect和db_debug,以及我没列出来的其他参数,对于是否能连接成功来讲,都无关紧要,我不确认是否有必要填写。而且我提供的这个配置方案,一方面是可以连接到ODBC的,另一方面,对于玩儿法很多的CI来讲,可以肯定不是唯一可行的面向ODBC的配置,只是给大家提供一个实例,有兴趣大家可以另行寻找可行的配置。

好的,现在配置文件完成了。

第三步:修改CodeIgniter源文件:

为了让上述配置文件能够连接成功ODBC,有个源文件必须修改,我并不确认这是否是CI的一个bug,不过,不修改就无法连接,修改了就可以连接上,且没发现有什么问题。

要修改的是system\database\drivers\odbc\odbc_driver.php这个文件,需要屏蔽掉下述代码:

function CI_DB_odbc_driver($params)

{

parent::CI_DB($params);

$this->_random_keyword = ' RND('.time().')'; // database specific random keyword

}

你也可以先不屏蔽,直到最后连接时,若出现报错,再回过头来找到这个文件进行这步操作。

这个解决方案也是从CI英文官网论坛上找到的一个解决办法。

第三步:编写代码连接ODBC:

作为一个例子,我们直接在控制器进行编码,不涉及视图和模型,新建一个控制器叫testodbc.php,控制器代码如下:

<!--?php class testodbc extends CI_Controller { //put your code here public function __construct() { parent::__construct(); } public function connect(){ $this--->load->database();
$sql = "SELECT ID,Title,convert(text,Content)as Content,Aboutusorder FROM dbo.Aboutus";
$query = $this->db->query($sql);
$result = $query->result_array();
foreach($result as $value){
var_dump($value);
}
}
}

?>

上面要注意两点:

○ sql语句中将content字段的数据类型显示转换成了text类型。如果你的表中有字段不经过此转换,直接读取中文出现乱码的话,可尝试此转换。

○ 使用result_array(),而不是result(),来得到数据集的内容。

好了,现在执行你的这个控制器http://localhost/index.php/testodbc/connect/,你应该可以看到输出结果了!

CodeIgniter: 帮助你编写 Web 应用程序的敏捷开源 PHP 框架

CodeIgniter 是一套给 PHP 网站开发者使用的应用程序开发框架和工具包。它提供一套丰富的标准库以及简单的接口和逻辑结构,其目的是使开发人员更快速地进行项目开发。使用 CodeIgniter 可以减少代码的编写量,并将你的精力投入到项目的创造性开发上。

CodeIgniter 就是你所需要的,如果…

  • 你想要一个小巧的框架。
  • 你需要出色的性能。
  • 你需要广泛兼容标准主机上的各种 PHP 版本和配置。
  • 你想要一个几乎只需 0 配置的框架。
  • 你想要一个不需使用命令行的框架。
  • 你想要一个不需坚守限制性编码规则的框架。
  • 你不希望被迫学习一门模板语言(虽然可以选择你喜欢的模板解析器)。
  • 你不喜欢复杂,热爱简单。
  • 你需要清晰、完整的文档。

官方网站:http://codeigniter.org.cn/

使用手册:http://codeigniter.org.cn/user_guide/index.html

CodeIgniter_2.1.3.zip下载:http://pan.baidu.com/share/link?shareid=432131&uk=1010090726

CodeIgniter中文手册 .CHM:http://pan.baidu.com/share/link?shareid=432136&uk=1010090726