Codeigniter 框架开启PDO查询方式、多库连接实现、多语言网站开发配置、以及捕获页面最后报错
一、Codeigniter 框架开启PDO查询方式及实现多库连接
CI接触时间不久,也不知道CI是从什么时候开始支持PDO连接的,在网上查了几条资料,2014年发的贴子还有人在说CI里好像不支持PDO连接,估计也有可能,CI后期版本基本处于无更新状态,直到不久前更新了3.0版本,现在外面的开源产品很多还不支持PDO。
但现在新开发程序估计没有几个人还喜欢用N年前的老连接方式吧,CI前面的版本不知道,但3.0版本是支持PDO连接的。数据库的配置文件在application/config/database.php文件中,如下截图:
CI默认使用的是mysqli连接方式,一目了然配置文件中罗列了数据库的各项连接必要参数,如果我们按下图进行配置(我本机使用mysql,所以把dbdriver改成mysql。),截图如下:
在控制器中打印出$this->db时就会看到连接所使用的连接方式,截图如下:
而这个类是system/database/drivers/mysql/mysql_driver.php的实例,而其使用的是mysql_pconnect,并非PDO方式。使用pdo方式也非常简单,将dbdriver里的mysql改成pdo即可。改成之后再打印出$this->db则会显示:
这里采用的就是pdo的连接了。另外可以注意一下CI数据库配置中DB数组变量:$db['default'],这里采用数组的形式是为了在使用时可以定义多个数据库,然后连接时传入数组索引值,这样就可以实现多库连接了。
默认的数据库连接使用的就是$active_group变量设置的值,在控制器中加载数据库时使用$this->load->database('数据库配置索引值');即可取得对应数据库的连接。
附: CodeIgniter PHP程序开发框架 用户手册 chm版本 2.1.3.rar
publish:April 17, 2015 -Friday
二、CI框架3.0(Codeigniter)多语言网站的开发配置
publish:May 4, 2015 -Monday
语言包实现是一个很简单的事情,将页面中需要使用不同语言展示的元素都放到一起,然后一种语言一个文件,展示时根据数组索引读取对应语言包里的设置值。不用框架实现起来也不复杂。
如果网站内容量较大,需要用语言展示的较多的话,这时就需要将语言文件分开了,一般的结构就是每个语言包里放一个全局使用的语言文件(基本每个页面都会使用、或者大多数页面要使用的,比如网站顶部和底部要展示的内容)。其它不同的页面可根据控制器的名称来自动调用对应的语言包。
在CI里语言包默认统一放在appliacation/language/下,每个文件名就是一个语言包,结构就和上面讲的一样,你可以配置一个global_lang.php文件,然后每个控制器写一个controller_name_lang.php,注意了,语言包文件的命名都是以_lang.php为结尾的。
语言包的结构可参考CI框架里system/language下框架语言包文件,另外在application/config/config.php 配置文件中有一行:
$config['language'] = 'english';
默认语言配置,可更改网站的默认语言。语言调用也很简单:
$this->lang->load(array('filename1', 'filename2')); #语言调用,一次调用多个语言包
$this->lang->load('filename', 'language');#调用一个指定语言的语言包
$this->lang->line('language_key');#提取语言包文件中数组的值,language_key为对应的索引。
$this->lang->line('misc_key', FALSE); #如果不确定KEY是否存在,可在第二个参数中传入false参数。告诉框架是否记录找不到key的错误信息
提取语言值:line方法如果取到值就返回,取不到则返回false;在CI控制器里调用语言包时,如果要分控制器调用,可以在控制器的__construct()方法里加入对本控制器语言包的调用。
public function __construct(){parent::construct();$this->lang->load($this->router->class, 'language');
}
这样每个控制器初始化时就可以自动加载本控制器的语言包文件。如果一个语言包在全局中都要加载,比如上面的global_lang.php,可以在CI的自动加载中添加上,就可以在程序里省掉这一步了。找到application/config/autoload.php
/*
| -------------------------------------------------------------------
| Auto-load Language files
| -------------------------------------------------------------------
| Prototype:
|
*/
$autoload['language'] = array('lang1', 'lang2');
lang1和lang2只需要填写global。不需要带上后面的_lang.php字符串。
三、CodeIgniter框架通过register_shutdown_function和error_get_last函数捕获页面最后报错
CodeIgniter (CI)框架core核心文件夹中的:CodeIgniter.php里有几句代码来进行自定义异常控制,如下图:
其中:register_shutdown_function函数注册了一个_shutdown_handler回调方法,register_shutdown_function的作用是设置当页面执行完毕或者执行exit页面时执行的回调方法,CI中的异常输出时最后总会调用一个 exit 方法,而这样即会同时引起_shutdown_handler方法执行,在 common.php 中是这样定义_shutdown_handler的方法的:
function _shutdown_handler()
{$last_error = error_get_last();if (isset($last_error) &&($last_error['type'] & (E_ERROR | E_PARSE | E_CORE_ERROR | E_CORE_WARNING | E_COMPILE_ERROR | E_COMPILE_WARNING))){_error_handler($last_error['type'], $last_error['message'], $last_error['file'], $last_error['line']);}
}
通过error_get_last获取页面最后停止时的错误状态,如果发生错误并且在报错状态设置中则会调用_error_handler显示错误。