php ci 连接sqlserver,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版这里是默认关闭的,正式版这里默认就是开启状态,所以没这个问题。

sqlservertcpip.png

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

sqlserverdsn.png

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

sqlserversa.png

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

sqlservertest.png

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

odbcdsn.png

第二步: 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,控制器代码如下:

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/,你应该可以看到输出结果了!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值