英文原文php
從2.2 升級到3.0 更新以前先保證網站處於離線狀態.html
替換 system 目錄下全部文件,而後替換index.php文件,若是以前有更新index.php,請在新的文件上作更改.mysql
你必須先刪除舊的system/目錄,而後把它放到其它 的地方.直接簡單的複製過去可能會致使問題.正則表達式
若是您在這些文件夾中有任何自定義功能的文件,請先複製它們.sql
從CI 3.0開始,全部的類文件名(庫,驅動,控制器,模型)必須首字母大寫的形式,必須大寫字母開頭. 例如:數據庫
application/libraries/mylibrary.php
須要更改爲數組
application/libraries/Mylibrary.php
一樣的有,驅動庫,擴展和對CI 核心庫的擴展瀏覽器
application/libraries/MY_email.php application/core/MY_log.php
上述文件應分別更名爲如下:安全
application/libraries/MY_Email.php application/core/MY_Log.php
控制器:服務器
application/controllers/welcome.php -> application/controllers/Welcome.php
模型:
application/models/misc_model.php -> application/models/Misc_model.php
請注意這並不影響目錄,配置文件,視圖,輔助,鉤子或其它,只是做用於類 你如今必須記住一個簡單規則 -類的文件名首字母大寫,除此以外所有小寫
這個文件更新了更多的用戶mime類型, 請複製這個文件到 應用目錄下/config/mimes.php.
從CI 1.4.1開始$autoload['core'] 配置就已通過時了,如今移除了,使用$autoload['libraries']配置來替代.
日誌類被做爲是一個「核心」類,如今位於system/core/ 目錄下,所以,爲了你的日誌類(重寫或擴展)能工做,必須移動到application/core/目錄下:
application/libraries/Log.php -> application/core/Log.php application/libraries/MY_Log.php -> application/core/MY_Log.php
在CI 3.0中Session庫是徹底重寫的,而且有不少新特性,但也意味着須要做出改變...
最值得注意的地方是,該庫如今使用單獨的存儲驅動程序,而不是始終依賴於(加密)的cookies.事實上,cookies做爲存儲已被刪除,你必須始終使用服務器端存儲引擎,默認的選項是使用文件.
Session 類如今使用PHP自身的機制構建自定義會話句柄,這也意味着,您的會話數據如今能夠經過全局$_SESSION 變量來訪問(雖然,咱們不可能把它做爲「userdata」,就像如今這樣)
幾個配置選項已被刪除,而且也添加了幾個.你應該閱讀整個SESSION庫手冊的詳細資料,下面是一個簡短的列表,變化包括:
$config['sess_driver']
配置的值 默認值爲file
,若是有設置 $config['sess_use_database']
的選項,在這種狀況下它將被設置爲database
.$config['sess_save_path']
配置的值 在database
的驅動中,依賴 $config['sess_table_name']
的配置,不然你須要閱讀其它驅動詳細手冊.只有MySQL和PostgreSQL官方支持.其餘數據庫可能能夠工做,但因爲缺乏協同鎖(Advisory lock)功能,它們是不安全的併發請求,你應該考慮使用其它的驅動程序.
移除 $config['sess_match_useragent'] 配置 用戶user-agent字符串是用戶的瀏覽器輸入的,或者說是客戶端輸入.所以,它的功能意義並不大,已經被移除了.
移除 $config['sess_encrypt_cookie'] 配置 正如上面所說,cookie庫不在做爲一個存儲機制,這個選項也沒有做用了.
移除 $config['sess_expire_on_close'] 配置
此選項仍可使用,但僅用於向後兼容的目的,不然應刪除.經過設置$config['sess_expiration']的值爲0來實現一樣的效果。
flashdata如今只是普通的"userdata"的一部分,只是標記爲在下一個請求時刪除。換句話說,你不能有「userdata」和「flashdata」具備相同的名稱,由於它是同一個內容裏面。
之前,你能夠訪問「session_id','ip_address','user_agent'和'last_activity'元數據項目的用戶數據.如今這是不可能的,若是你的應用程序依賴於這些值,你應該閱讀session元數據的手冊內容。
之前,該方法接受一個關聯數組的'key'=>'value' 多維數組.然而,這是沒有意義的,你如今只有經過keys,做爲數組的元素.
// 之前 $this->session->unset_userdata(array('item' => '', 'item2' => '')); // 如今 $this->session->unset_userdata(array('item', 'item2'));
最後,若是你寫了一個Session 擴展,必須把擴展文件放入 application/libraries/Session/ 目錄下
因爲3.0.0 更換 Active Record 爲 Query Builder,因此在config/database.php文件中,你應該把變量名$active_record更改成$query_builder:
$active_group = 'default'; // $active_record = TRUE; $query_builder = TRUE;
在CI 3.0中,錯誤模板被做爲視圖移動到應用目錄/views/errors* 目錄下. 此外,咱們增長了命令行錯誤模板在普通文本格式的,不像HTML那樣,適用於命令行.這固然須要必定的層次分離. 比較安全的作法是,把之前的模板從應用目錄/errors* 移動到應用目錄/views/errors/html*,可是,你須要從相應CI庫的文件中拷貝放入應用目錄/views/errors/cli* 文件目錄中
#####路由規則包括 :any
一直以來,CI 在路由匹配中已經提供了通配符 :any 來匹配任意字符的的一種方式
然而,通配符 :any 其實只是一個別名爲正則表達式,用於在方法執行.+,這是錯誤的,由於它也包括符號/(斜線)字符,這是URI段分隔符,沒有意義.
在CI 3.0中,通配符 :any 講表明 [^/]+,因此不會匹配到 / (斜線).
有許多開發人員用到了這個功能.若是你是其中的一個,想要匹配一個正斜槓,請使用.+表達式:
(.+) // 匹配任意字符 (:any) // 匹配任意字符,除了'/'
咱們知道,$route['default_controller'] 和 $route['404_override'] 的設置 不只能夠設置爲一個控制器名稱,也能夠設置爲控制器/方法名稱。然而,可能的一些用戶使用 目錄/控制器這種方式來使用.
正如已經說過的,這種行爲是附帶的,不是逾期的,也沒有文檔說明.若是你已經用到它了,你的應用可能影響到CI。
在3.0中的另外一個顯著的變化是,'default_controller'和'404_override'如今支持每一個應用的目錄了,下面來解釋一下,看下面的例子:
$route['default_controller'] = 'main';
如今,假設你的網站是位於example.com,咱們已經知道,若是一個用戶訪問http://example.com, 上面的設置會首先加載 'Main' 控制器.
然而,若是你有一個application/controllers/admin/ 和用戶訪問http://example.com/admin/ 會發生什麼? 在CI 3.0中,路由會首先尋找 admin/ 目錄下的'Main' 控制器爲好,若是未找到,將會觸發 Not Found (404)。
一樣的規則也適用於 '404_override' 設置
須要方法和函數如今在找到不到參數項的時候返回FALSE代替NULL:
在CI的許多方法容許你經過一個布爾參數來決定是否使用XSS過濾器,這個參數的默認值是FALSE,可是如今改爲NULL,而且是由$config['global_xss_filtering']配置的值來決定. 若是你手動改變 $xss_filter 參數的值或者$config['global_xss_filtering']
的值一直設置爲FALSE,那麼這種用法改變不會影響到你.
不然,須要查看如下函數的用法:
//Input Library input->get() input->post() input->get_post() input->cookie() input->server() input->input_stream() //Cookie Helper get_cookie()
另外一個相關的變化是,當全局XSS過濾器打開的時候, $_GET, $_POST, $_COOKIE and $_SERVER superglobals再也不自動覆蓋
URI 庫用來自動轉換在URI中遇到的特殊字符爲HTML轉義字符. 除了在$config['permitted_uri_chars']
中配置內容外,這是爲了提供自動的XSS保護的,但已被證實是有問題的,在CI 3.0中被移除.
若是在你的應用中依賴這個特性,你應該經過$this->security->xss_clean()
來過濾URI段的輸出
xss_clean
用法大量的XSS 清理規則應該做用於輸出,而不是改變輸入數據. 咱們在自動處理和全局XSS處理功能上犯了一些錯誤(參考前面XSS處理部分),因此如今努力阻止這種作法,咱們從驗證規則中移除了xss_clean
處理的這部分功能. 由於Validation 庫主要是處理輸入數據,xss_clean
放在一塊兒不合適,不屬於這裏. 若是你確實須要使用這個功能,你能夠加載 Security 助手,裏面包含xss_clean(),
get_post()
之前,輸入類的方法get_post()首先在POST請求中搜索數據,而後纔是GET請求的數據.這種方法已被修改爲先是GET,而後是POST,正如它的名字同樣,而後增長了一個方法post_get(),先搜索POST,後GET,和之前get_post()的功能同樣.
在數組結果中,目錄如今以一個尾隨目錄分隔符結束(一般爲斜線)
drop_table()
方法到目前爲止,drop_table() 函數默認加上了IF EXISTS,可是大多數數據庫驅動是不能工做的. 在CI 3.0中,默認不會添加 IF EXISTS條件了,而且第二個參數是可選的,默認是FALSE.
若是你的應用是加上了IF EXISTS判斷的話,不用作任何改變.
// 如今只是刪除表'table_name' $this->dbforge->drop_table('table_name'); // 存在表'table_name'的話便刪除 $this->dbforge->drop_table('table_name', TRUE);
示例使用MySQL特定的語法,但它應該工做在除ODBC的之外全部數據庫驅動.
發送郵件成功後會自動清除發送設置的參數,在send()方法中設置的第一參數爲FALSE時,就不會清除設置的參數,以下:
if ($this->email->send(FALSE)) { // Parameters won't be cleared }
對於表單驗證庫的語言包文件和錯誤信息的格式有兩點改進:
form_validation_
// 之前 $lang['rule'] = ... // 如今 $lang['form_validation_rule'] = ...
sprintf()
更靈活些:// 之前 'The %s field does not match the %s field.' // 如今 'The {field} field does not match the {param} field.'
之前的方式還能夠繼續工做,但在CodeIgniter 3.1和之後的版本中,非前綴的索引鍵會被移除,所以應該儘早替換.
除了$autoload['core']配置選項之外,在 CI 3.0.0中移除了大量功能:
之前的SHA1庫被移除了,只能使用php的原生函數sha1()了. 另外 Encrypt庫的sha1()方法也被移除了.
自從放棄支持php4之後,一直不同意使用擴展名常量,如今CI新版本中也不須要有不一樣的文件擴展名了,只使用``.php``來代替了.
表情助手是來自EllisLab's ExpressionEngine的產品,然而對於CI的框架來講做用不大,如今也被移除了. 另外,之前廢棄的函數js_insert_smiley()(從 1.7.2版本開始)如今被移除了.
根據大量漏洞報告,加密庫已通過時了. 新的加密庫使用MCrypt 擴展( /dev/urandom 可用) 或者 PHP 5.3.3 版本以上和 OpenSSL擴展,這彷佛不是比較方便,可是須要咱們使用正確使用的加密功能
加密庫一直會保持向後兼容
儘快使用新的加密庫
購物車庫,對於CI來講,和表情助手同樣,計劃在CI 3.1+版本中移除.
如今仍可以使用,可是儘快移除此功能用法
mysql數據庫驅動使用的最老的mysql擴展,衆所周知,有些許底層問題,在PHP 5.5 和CI 3.0中已通過時了,使用mysqli擴展來代替 請使用'mysqli' 或者 'pdo/mysql' 做爲nysql數據庫驅動,mysql 驅動會在未來版本中移除. 同一緣由,sqlite, mssql 和 pdo/dblib (相似 pdo/mssql or pdo/sybase)驅動和mysql驅動同樣,從php5.3版本以來就沒有了. 所以,在CI 下一版本中,這些過期驅動會移除掉,應該使用sqlite3, sqlsrv or pdo/sqlsrv 更高級的驅動.
這些驅動如今還可使用,可是強烈建議儘快使用其它的.
#####加密助手函數do_hash()
加密助手函數do_hash()只是php原生函數hash()的別名,是過期的而且計劃在CI 3.1版本去掉.
這些函數如今還可使用,可是強烈建議儘早更換
$config['global_xss_filtering']
的設置上面已經描述過,XSS 過濾處理不該該在全部數據輸入的時候,所以 ```$config['global_xss_filtering']```的配置不是一個好策略,而後是過期的. 代替方法就是須要處理用戶端的數據時使用```xss_clean()```函數,或者使用相似HTML Purifier那樣去處理數據.
這些設置如今還可使用,可是強烈建議儘早更換
read_file()
文件助手函數read_file()只是php原生函數file_get_contents()的別名,是過期的而且計劃在CI 3.1版本去掉.
這些函數如今還可使用,可是強烈建議儘早更換
repeater()
字符串助手函數repeater()只是php原生函數str_repeat()的別名,是過期的而且計劃在CI 3.1版本去掉.
這些函數如今還可使用,可是強烈建議儘早更換
trim_slashes()
字符串助手函數trim_slashes()只是php原生函數trim()的別名(第二個參數有變化而已),是過期的而且計劃在CI 3.1+版本移除.
這些函數如今還可使用,可是強烈建議儘早更換
form_prep()
字符串助手函數form_prep()只是php原生函數html_escape()的別名,是過期的而且計劃在CI 3.1版本去掉.
請使用
html_escape()
函數替代
這些函數如今還可使用,可是強烈建議儘早更換
郵件助手函數總只有兩個函數方法
valid_email()
send_email()
兩個函數的別名分別是php原生函數filter_var()
和 mail()
,所以,郵件助手是過期的,而且計劃在CI 3.1+版本移除.
這些函數如今還可使用,可是強烈建議儘早更換
standard_date()
數據助手函數standard_date()是過期的PHP常量,它與函數date() 提供功能是同樣的,此外,名字也相似,下面如何替換的例子:
// 之前方式 standard_date(); // 至關於 standard_date('DATE_RFC822', now()); // 替換方式 date(DATE_RFC822, now()); // 之前方式 standard_date('DATE_ATOM', $time); // 替換方式 date(DATE_ATOM, $time);
這些函數如今還可使用,可是強烈建議儘早更換,而且計劃在CI 3.1+版本移除.
nbs()
, br()
數據助手函數nbs() 和 br() 只是原生函數str_repeat()加上對 和 <br > 字符的處理.
由於只是原生php函數的別名,沒有提供功能做用,是過期的而且計劃在CI 3.1+版本去掉.
這些函數如今還可使用,可是強烈建議儘早更換
分頁庫如今支持添加任何HTML屬性的錨經過attributes設置,裏面已經包含了class設置,單獨的anchor_class設置已經屬於多餘了,正由於如此,'anchor_class'的設置是過期的,而且計劃在CI 3.1+版本移除.
這些函數如今還可使用,可是強烈建議儘早更換
random_string()
字符串助手函數random_string()有兩個類型 'unique' 和 'encrypt'
當使用函數random_string(),兩個類型分別對應 md5 和 sha1的別名,是過期的而且計劃在CI 3.1+版本去掉.
這些選項如今還可使用,可是強烈建議儘早更換
當使用url_title()函數時,你不該該使用長橫線和下劃線做爲單詞的分隔符,這個函數接受任意字符做爲分隔符,你應該用 '-' 代替'dash' 和 '_' 代替 'underscore' 參數.
dash 和 underscore 如今是做爲別名,計劃在CI 3.1+版本移除.
這些選項如今還可使用,可是強烈建議儘早更換
all_userdata()
在變動日誌中看到 Session 庫的方法 userdata() 在沒有參數的狀況下返回全部的用戶session數據:
$this->session->userdata();
這樣的話使得all_userdata()方法是多餘的,只是做爲userdata()的別名而已,是過期的而且計劃在CI 3.1版本去掉.
此方法如今還可使用,可是強烈建議儘早更換
add_column()
的AFTER功能變化若是你使用了add_column()
第三個參數用來定義添加數據庫列的AFTER 功能,須要改變用法. 第三個參數是過期的,計劃在CI 3.1+版本去掉. 你應該把AFTER的定義放在字段的定義數組內,以下例:
// 之前: $field = array( 'new_field' => array('type' => 'TEXT') ); $this->dbforge->add_column('table_name', $field, 'another_field'); // 如今: $field = array( 'new_field' => array('type' => 'TEXT', 'after' => 'another_field') ); $this->dbforge->add_column('table_name', $field);
這個參數如今還可使用,可是強烈建議儘早更換
這個參數只是MYSQL和CUBRID數據庫支持,其它的數據庫不支持,會自動忽略它.
fetch_directory(),fetch_class(),fetch_method()
隨着CI_Router::$directory, CI_Router::$class and CI_Router::$method 變成公開屬性,而後它們的方法fetch_*()只是返回它們的屬性參數,沒有必要保留這些功能了. 它們屬於內部,未公開方法,可是爲了保持向後兼容性咱們須要選擇改變它們,如何有使用它們,能夠經過它們的屬性來替代:
$this->router->directory; $this->router->class; $this->router->method;
這個方法如今還可使用,可是強烈建議儘早更換
is_cli_request()
加載輸入庫以前,CI 內部不少地方須要調用CI_Input::is_cli_request()這個必要的方法,基於此,由一個公用函數is_cli()
來替代它,不過只是一個別名而已.
新的方法能夠在任意地方很是方便的使用
// 之前 $this->input->is_cli_request(); // 如今 is_cli();
CI_Input::is_cli_request() 如今是過期的而且計劃在CI 3.1+版本去掉.
註解
這個方法如今還可使用,可是強烈建議儘早更換
system_url()
CI_Config::system_url()的用法不太恰當,也就是說,從安全的角度講CI 的system 目錄不該該是公開訪問的目錄
因爲這個緣由,這個方法是過期的而且計劃在CI 3.1+版本移除.
這個方法如今還可使用,可是強烈建議儘早更換
JavaScript庫一直是一個「實驗」的狀態,歷來沒有真正有用的,也沒有找到一個恰當的解決辦法.
如今是過期的而且計劃在CI 3.1+版本去掉. 這個庫如今還可使用,可是強烈建議儘早更換
文本助手功能函數highlight_phrase()默認的HTML標籤從<strong>更改成新的HTML5標籤<mark> 除非你已經使用了本身的高亮標籤,這可能會給你的瀏覽者帶來問題,好比使用IE8.所以咱們建議你將下面的代碼添加到你的CSS文件,爲了不與舊的瀏覽器的向後兼容性:
mark { background: #ff0; color: #000; };