我们都知道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版这里是默认关闭的,正式版这里默认就是开启状态,所以没这个问题。
设置ODBC的系统DSN,在ODBC数据管理器中新建一个系统DSN,名称叫test1,服务器是localhost,我是连接本机的Sql Server服务。
下一步,输入SQL Server的用户名密码,我用的是SQL Server验证:
填入SQL Server的用户名密码之后要求选择默认的数据库,在下一步点击完成,然后测试一下这个连接:
点击测试数据源,之后提示你测试成功,ODBC到SQL Server的连接就建立好了。然后我们得到了这个系统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,控制器代码如下:
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/,你应该可以看到输出结果了!