blob: 6dd95dc9fbc0b78908e5bb88f9806a91f10c2c69 [file] [log] [blame]
Andrey Andreevc5769952019-01-16 17:49:35 +02001
2
3<!DOCTYPE html>
4<!--[if IE 8]><html class="no-js lt-ie9" lang="en" > <![endif]-->
5<!--[if gt IE 8]><!--> <html class="no-js" lang="en" > <!--<![endif]-->
6<head>
7 <meta charset="utf-8">
8 <meta name="viewport" content="width=device-width, initial-scale=1.0">
9
10 <title>Upgrading from 2.2.x to 3.0.x &mdash; CodeIgniter 3.1.10 documentation</title>
11
12
13
14
15 <link rel="shortcut icon" href="../_static/ci-icon.ico"/>
16
17
18
19 <link href='https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic|Roboto+Slab:400,700|Inconsolata:400,700&subset=latin,cyrillic' rel='stylesheet' type='text/css'>
20
21
22
23
24
25
26
27
28
29 <link rel="stylesheet" href="../_static/css/citheme.css" type="text/css" />
30
31
32
33 <link rel="index" title="Index"
34 href="../genindex.html"/>
35 <link rel="search" title="Search" href="../search.html"/>
36 <link rel="top" title="CodeIgniter 3.1.10 documentation" href="../index.html"/>
37 <link rel="up" title="Upgrading From a Previous Version" href="upgrading.html"/>
38 <link rel="next" title="Upgrading from 2.2.2 to 2.2.3" href="upgrade_223.html"/>
39 <link rel="prev" title="Upgrading from 3.0.0 to 3.0.1" href="upgrade_301.html"/>
40
41
42 <script src="https://cdnjs.cloudflare.com/ajax/libs/modernizr/2.6.2/modernizr.min.js"></script>
43
44</head>
45
46<body class="wy-body-for-nav" role="document">
47
48 <div id="nav">
49 <div id="nav_inner">
50
51
52
53 <div id="pulldown-menu" class="ciNav">
54 <ul>
55<li class="toctree-l1"><a class="reference internal" href="../general/welcome.html">Welcome to CodeIgniter</a></li>
56</ul>
57<ul class="current">
58<li class="toctree-l1 current"><a class="reference internal" href="index.html">Installation Instructions</a><ul class="current">
59<li class="toctree-l2"><a class="reference internal" href="downloads.html">Downloading CodeIgniter</a></li>
60<li class="toctree-l2"><a class="reference internal" href="index.html">Installation Instructions</a></li>
61<li class="toctree-l2 current"><a class="reference internal" href="upgrading.html">Upgrading From a Previous Version</a></li>
62<li class="toctree-l2"><a class="reference internal" href="troubleshooting.html">Troubleshooting</a></li>
63</ul>
64</li>
65</ul>
66<ul>
67<li class="toctree-l1"><a class="reference internal" href="../overview/index.html">CodeIgniter Overview</a><ul>
68<li class="toctree-l2"><a class="reference internal" href="../overview/getting_started.html">Getting Started</a></li>
69<li class="toctree-l2"><a class="reference internal" href="../overview/at_a_glance.html">CodeIgniter at a Glance</a></li>
70<li class="toctree-l2"><a class="reference internal" href="../overview/features.html">Supported Features</a></li>
71<li class="toctree-l2"><a class="reference internal" href="../overview/appflow.html">Application Flow Chart</a></li>
72<li class="toctree-l2"><a class="reference internal" href="../overview/mvc.html">Model-View-Controller</a></li>
73<li class="toctree-l2"><a class="reference internal" href="../overview/goals.html">Architectural Goals</a></li>
74</ul>
75</li>
76</ul>
77<ul>
78<li class="toctree-l1"><a class="reference internal" href="../tutorial/index.html">Tutorial</a><ul>
79<li class="toctree-l2"><a class="reference internal" href="../tutorial/static_pages.html">Static pages</a></li>
80<li class="toctree-l2"><a class="reference internal" href="../tutorial/news_section.html">News section</a></li>
81<li class="toctree-l2"><a class="reference internal" href="../tutorial/create_news_items.html">Create news items</a></li>
82<li class="toctree-l2"><a class="reference internal" href="../tutorial/conclusion.html">Conclusion</a></li>
83</ul>
84</li>
85</ul>
86<ul>
87<li class="toctree-l1"><a class="reference internal" href="../contributing/index.html">Contributing to CodeIgniter</a><ul>
88<li class="toctree-l2"><a class="reference internal" href="../documentation/index.html">Writing CodeIgniter Documentation</a></li>
89<li class="toctree-l2"><a class="reference internal" href="../DCO.html">Developer’s Certificate of Origin 1.1</a></li>
90</ul>
91</li>
92</ul>
93<ul>
94<li class="toctree-l1"><a class="reference internal" href="../general/index.html">General Topics</a><ul>
95<li class="toctree-l2"><a class="reference internal" href="../general/urls.html">CodeIgniter URLs</a></li>
96<li class="toctree-l2"><a class="reference internal" href="../general/controllers.html">Controllers</a></li>
97<li class="toctree-l2"><a class="reference internal" href="../general/reserved_names.html">Reserved Names</a></li>
98<li class="toctree-l2"><a class="reference internal" href="../general/views.html">Views</a></li>
99<li class="toctree-l2"><a class="reference internal" href="../general/models.html">Models</a></li>
100<li class="toctree-l2"><a class="reference internal" href="../general/helpers.html">Helpers</a></li>
101<li class="toctree-l2"><a class="reference internal" href="../general/libraries.html">Using CodeIgniter Libraries</a></li>
102<li class="toctree-l2"><a class="reference internal" href="../general/creating_libraries.html">Creating Libraries</a></li>
103<li class="toctree-l2"><a class="reference internal" href="../general/drivers.html">Using CodeIgniter Drivers</a></li>
104<li class="toctree-l2"><a class="reference internal" href="../general/creating_drivers.html">Creating Drivers</a></li>
105<li class="toctree-l2"><a class="reference internal" href="../general/core_classes.html">Creating Core System Classes</a></li>
106<li class="toctree-l2"><a class="reference internal" href="../general/ancillary_classes.html">Creating Ancillary Classes</a></li>
107<li class="toctree-l2"><a class="reference internal" href="../general/hooks.html">Hooks - Extending the Framework Core</a></li>
108<li class="toctree-l2"><a class="reference internal" href="../general/autoloader.html">Auto-loading Resources</a></li>
109<li class="toctree-l2"><a class="reference internal" href="../general/common_functions.html">Common Functions</a></li>
110<li class="toctree-l2"><a class="reference internal" href="../general/compatibility_functions.html">Compatibility Functions</a></li>
111<li class="toctree-l2"><a class="reference internal" href="../general/routing.html">URI Routing</a></li>
112<li class="toctree-l2"><a class="reference internal" href="../general/errors.html">Error Handling</a></li>
113<li class="toctree-l2"><a class="reference internal" href="../general/caching.html">Caching</a></li>
114<li class="toctree-l2"><a class="reference internal" href="../general/profiling.html">Profiling Your Application</a></li>
115<li class="toctree-l2"><a class="reference internal" href="../general/cli.html">Running via the CLI</a></li>
116<li class="toctree-l2"><a class="reference internal" href="../general/managing_apps.html">Managing your Applications</a></li>
117<li class="toctree-l2"><a class="reference internal" href="../general/environments.html">Handling Multiple Environments</a></li>
118<li class="toctree-l2"><a class="reference internal" href="../general/alternative_php.html">Alternate PHP Syntax for View Files</a></li>
119<li class="toctree-l2"><a class="reference internal" href="../general/security.html">Security</a></li>
120<li class="toctree-l2"><a class="reference internal" href="../general/styleguide.html">PHP Style Guide</a></li>
121</ul>
122</li>
123</ul>
124<ul>
125<li class="toctree-l1"><a class="reference internal" href="../libraries/index.html">Libraries</a><ul>
126<li class="toctree-l2"><a class="reference internal" href="../libraries/benchmark.html">Benchmarking Class</a></li>
127<li class="toctree-l2"><a class="reference internal" href="../libraries/caching.html">Caching Driver</a></li>
128<li class="toctree-l2"><a class="reference internal" href="../libraries/calendar.html">Calendaring Class</a></li>
129<li class="toctree-l2"><a class="reference internal" href="../libraries/cart.html">Shopping Cart Class</a></li>
130<li class="toctree-l2"><a class="reference internal" href="../libraries/config.html">Config Class</a></li>
131<li class="toctree-l2"><a class="reference internal" href="../libraries/email.html">Email Class</a></li>
132<li class="toctree-l2"><a class="reference internal" href="../libraries/encrypt.html">Encrypt Class</a></li>
133<li class="toctree-l2"><a class="reference internal" href="../libraries/encryption.html">Encryption Library</a></li>
134<li class="toctree-l2"><a class="reference internal" href="../libraries/file_uploading.html">File Uploading Class</a></li>
135<li class="toctree-l2"><a class="reference internal" href="../libraries/form_validation.html">Form Validation</a></li>
136<li class="toctree-l2"><a class="reference internal" href="../libraries/ftp.html">FTP Class</a></li>
137<li class="toctree-l2"><a class="reference internal" href="../libraries/image_lib.html">Image Manipulation Class</a></li>
138<li class="toctree-l2"><a class="reference internal" href="../libraries/input.html">Input Class</a></li>
139<li class="toctree-l2"><a class="reference internal" href="../libraries/javascript.html">Javascript Class</a></li>
140<li class="toctree-l2"><a class="reference internal" href="../libraries/language.html">Language Class</a></li>
141<li class="toctree-l2"><a class="reference internal" href="../libraries/loader.html">Loader Class</a></li>
142<li class="toctree-l2"><a class="reference internal" href="../libraries/migration.html">Migrations Class</a></li>
143<li class="toctree-l2"><a class="reference internal" href="../libraries/output.html">Output Class</a></li>
144<li class="toctree-l2"><a class="reference internal" href="../libraries/pagination.html">Pagination Class</a></li>
145<li class="toctree-l2"><a class="reference internal" href="../libraries/parser.html">Template Parser Class</a></li>
146<li class="toctree-l2"><a class="reference internal" href="../libraries/security.html">Security Class</a></li>
147<li class="toctree-l2"><a class="reference internal" href="../libraries/sessions.html">Session Library</a></li>
148<li class="toctree-l2"><a class="reference internal" href="../libraries/table.html">HTML Table Class</a></li>
149<li class="toctree-l2"><a class="reference internal" href="../libraries/trackback.html">Trackback Class</a></li>
150<li class="toctree-l2"><a class="reference internal" href="../libraries/typography.html">Typography Class</a></li>
151<li class="toctree-l2"><a class="reference internal" href="../libraries/unit_testing.html">Unit Testing Class</a></li>
152<li class="toctree-l2"><a class="reference internal" href="../libraries/uri.html">URI Class</a></li>
153<li class="toctree-l2"><a class="reference internal" href="../libraries/user_agent.html">User Agent Class</a></li>
154<li class="toctree-l2"><a class="reference internal" href="../libraries/xmlrpc.html">XML-RPC and XML-RPC Server Classes</a></li>
155<li class="toctree-l2"><a class="reference internal" href="../libraries/zip.html">Zip Encoding Class</a></li>
156</ul>
157</li>
158</ul>
159<ul>
160<li class="toctree-l1"><a class="reference internal" href="../database/index.html">Database Reference</a><ul>
161<li class="toctree-l2"><a class="reference internal" href="../database/examples.html">Quick Start: Usage Examples</a></li>
162<li class="toctree-l2"><a class="reference internal" href="../database/configuration.html">Database Configuration</a></li>
163<li class="toctree-l2"><a class="reference internal" href="../database/connecting.html">Connecting to a Database</a></li>
164<li class="toctree-l2"><a class="reference internal" href="../database/queries.html">Running Queries</a></li>
165<li class="toctree-l2"><a class="reference internal" href="../database/results.html">Generating Query Results</a></li>
166<li class="toctree-l2"><a class="reference internal" href="../database/helpers.html">Query Helper Functions</a></li>
167<li class="toctree-l2"><a class="reference internal" href="../database/query_builder.html">Query Builder Class</a></li>
168<li class="toctree-l2"><a class="reference internal" href="../database/transactions.html">Transactions</a></li>
169<li class="toctree-l2"><a class="reference internal" href="../database/metadata.html">Getting MetaData</a></li>
170<li class="toctree-l2"><a class="reference internal" href="../database/call_function.html">Custom Function Calls</a></li>
171<li class="toctree-l2"><a class="reference internal" href="../database/caching.html">Query Caching</a></li>
172<li class="toctree-l2"><a class="reference internal" href="../database/forge.html">Database Manipulation with Database Forge</a></li>
173<li class="toctree-l2"><a class="reference internal" href="../database/utilities.html">Database Utilities Class</a></li>
174<li class="toctree-l2"><a class="reference internal" href="../database/db_driver_reference.html">Database Driver Reference</a></li>
175</ul>
176</li>
177</ul>
178<ul>
179<li class="toctree-l1"><a class="reference internal" href="../helpers/index.html">Helpers</a><ul>
180<li class="toctree-l2"><a class="reference internal" href="../helpers/array_helper.html">Array Helper</a></li>
181<li class="toctree-l2"><a class="reference internal" href="../helpers/captcha_helper.html">CAPTCHA Helper</a></li>
182<li class="toctree-l2"><a class="reference internal" href="../helpers/cookie_helper.html">Cookie Helper</a></li>
183<li class="toctree-l2"><a class="reference internal" href="../helpers/date_helper.html">Date Helper</a></li>
184<li class="toctree-l2"><a class="reference internal" href="../helpers/directory_helper.html">Directory Helper</a></li>
185<li class="toctree-l2"><a class="reference internal" href="../helpers/download_helper.html">Download Helper</a></li>
186<li class="toctree-l2"><a class="reference internal" href="../helpers/email_helper.html">Email Helper</a></li>
187<li class="toctree-l2"><a class="reference internal" href="../helpers/file_helper.html">File Helper</a></li>
188<li class="toctree-l2"><a class="reference internal" href="../helpers/form_helper.html">Form Helper</a></li>
189<li class="toctree-l2"><a class="reference internal" href="../helpers/html_helper.html">HTML Helper</a></li>
190<li class="toctree-l2"><a class="reference internal" href="../helpers/inflector_helper.html">Inflector Helper</a></li>
191<li class="toctree-l2"><a class="reference internal" href="../helpers/language_helper.html">Language Helper</a></li>
192<li class="toctree-l2"><a class="reference internal" href="../helpers/number_helper.html">Number Helper</a></li>
193<li class="toctree-l2"><a class="reference internal" href="../helpers/path_helper.html">Path Helper</a></li>
194<li class="toctree-l2"><a class="reference internal" href="../helpers/security_helper.html">Security Helper</a></li>
195<li class="toctree-l2"><a class="reference internal" href="../helpers/smiley_helper.html">Smiley Helper</a></li>
196<li class="toctree-l2"><a class="reference internal" href="../helpers/string_helper.html">String Helper</a></li>
197<li class="toctree-l2"><a class="reference internal" href="../helpers/text_helper.html">Text Helper</a></li>
198<li class="toctree-l2"><a class="reference internal" href="../helpers/typography_helper.html">Typography Helper</a></li>
199<li class="toctree-l2"><a class="reference internal" href="../helpers/url_helper.html">URL Helper</a></li>
200<li class="toctree-l2"><a class="reference internal" href="../helpers/xml_helper.html">XML Helper</a></li>
201</ul>
202</li>
203</ul>
204
205 </div>
206
207
208 </div>
209</div>
210<div id="nav2">
211 <a href="#" id="openToc">
212 <img src="data:image/jpeg;base64,/9j/4AAQSkZJRgABAgAAZABkAAD/7AARRHVja3kAAQAEAAAARgAA/+4ADkFkb2JlAGTAAAAAAf/bAIQABAMDAwMDBAMDBAYEAwQGBwUEBAUHCAYGBwYGCAoICQkJCQgKCgwMDAwMCgwMDQ0MDBERERERFBQUFBQUFBQUFAEEBQUIBwgPCgoPFA4ODhQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQU/8AAEQgAKwCaAwERAAIRAQMRAf/EAHsAAQAABwEBAAAAAAAAAAAAAAABAwQFBgcIAgkBAQAAAAAAAAAAAAAAAAAAAAAQAAEDAwICBwYEAgsAAAAAAAIBAwQAEQUSBiEHkROTVNQWGDFBUVIUCHEiMtOUFWGBobHRQlMkZIRVEQEAAAAAAAAAAAAAAAAAAAAA/9oADAMBAAIRAxEAPwDSC+ygkOOaUoKigUCgUCgUCgUCgUCgUCgUCgkuGguIP9FBMFb0Hqg7We+3jlmIqqYFf4ub+/QYlnOR/LqIBKGFUbf8qWv971BytQXXE7Y3Lnm3HsFhp2TaZJAdchRXpIgSpdEJWxJEW3xoKV7F5OMy7JkQn2o7D6w33XGjEAkoiqrJEqIiOIiKuhePCgqp22dyYyS3CyWHnQ5joG61HkRnmnTbaFSMhExRVQRRVJU9iUHjE7ez+fJ0MFipmUNhBV8YUd2SoIV9KkjQla9ltegttBdPLW4/qocL+UTfrMiHW4+P9M71shuyrqaHTcxsl7jegpsji8nh5ZwMvDfgTm0RTjSmjYdFCS6KoOIipdFunCgmNYTMv457MMY6U7iI6oMieDDhRm1VbIhuoOkbqtuK0Hpzb+eZcYZexUxt6UyUqK2cd0SdjtgrhOgijcgERUlJOCIl6CpgbP3blRI8XgMjNARAyKNDfeRBdFDBVUAXgQrqH4pxoJTu2NysY97LP4ac1io5q1InHFeGO24LnVKJuKOkSQ/yKir+rh7aCLG1dzypZQI2FnvTgccYOM3FeN0XWERXAUEFVQgQkUktdLpegm+Td3/Xli/L+S/mYNJIOF9G/wBeLKrZHFb0akG6W1WtQWSg3Dyg5e7V3fipE3O4/wCrktyzYA+ufas2LbZIlmnAT2kvuoN1wft95augilglX/tzP3qCu9O3LL/wV/i5v79BvmTADq14UGu91467Z6U9y0HzH/ncj/U/sT/CgynZG7I2NezpZGUjIycJkYkZSG+uQ81pbBNKLxJfjwoMqZ3/ALYHl35AJ7/cuwHcu5k7r1Q5pHetBjquqVVJWGxj9Zrtcl/Ggy3dHMvauR3HFZj5nHNxSyW5JISYDMoIwx8tFIGHZhPNaykGapr6rUAiicEoMG21lMRj8buPAz8xhJrr7uOeiPTCyAwXUaGR1mgozbTusOsFLEiJ7fbQa/h7gcjy2H3V6xppwDNtUSxCJIqp7valBuWVzJ22xuCROXNNZiJkMtms0DbjUkAZjzoDrTMd9dDRI44ZC2YsrYdKWP2WDT2S3N9dNdlRYrGMYc06IURXSYb0igrpWS485xVNS6nF4rwslkoMwnbpgZLB7bmt5uMweAhDEl4B5uSLzzqTnnyVpW2jaJHRMSIjdDiiotvy3DOE5rYTEbkl5yFn28k7JyG4c7AU2HtLH1uKfaiMPI40CdYbpNtmLdwTSn5rewLNld+7TLdeal4WarWBkbVKBjgdElMJJwAAY5fl4kB3b1fp4XvagsGS3FjJfLzDNtS8aeXx7LzT7TyzByQE5PccRGRC0ZRUDRV6y62vbjagzLmJzS2vuPK43JY6aP1TW6Jz+RIWyFtyC06y3EkiiinAo7YCqfq1AqqnGgsOH3lhZO8d1pmcpB8j5XIm9OYlBJSQ/FSS4427DKO0RC8AlcEMhFdViRR1WDWR5t3WXVuL1d106kG9vdeye2g60+1FDyW0shIcXVpyroXt8I8dfd+NB1vioAdWnD3UF1+gD4UFc6CEKpagxXN43rwJLUHz7yX2c8zokt9uHlsPIhA4aRnnHJTLptIS6CNsY7iASpxUUMkReGpfbQW0vtN5pitvrsN28rwtBD0nc0+/Yft5XhaB6TuaXfsP28rwtA9J3NPv2H7eV4Wgek7mn37D9vK8LQPSdzT79h+3leFoHpO5pd+w/byvC0D0nc0u/Yft5XhaB6TuaXfsP28rwtA9J3NLv2H7eV4Wgek7ml37D9vK8LQPSdzS79h+3leFoHpO5p9+w/byvC0E9r7Reazy2HIYVPxkS/CUHVn26cosxyv2g7h89LYmZSXOenvLEQ1YaQ222RATcQCP8rSGqqA8S02W2pQ6FhMoAIlqCtsnwoCpdKClejI4i3Sgtb+GBxVuNBSFt1pV/RQefLjPyUDy4z8lA8uM/JQPLjPyUDy4z8lA8uM/JQPLjPyUDy4z8lA8uM/JQPLjPyUDy4z8lA8utJ/koJ7WCbBU/LQXOPAFq1koK8B0pag90CggtBBf6qB0UDooHRQOigdFA6KB0UDooHRQOigdFA6KB0UDooI0EaBQf//Z" title="Toggle Table of Contents" alt="Toggle Table of Contents" />
213 </a>
214</div>
215
216 <div class="wy-grid-for-nav">
217
218
219 <nav data-toggle="wy-nav-shift" class="wy-nav-side">
220 <div class="wy-side-nav-search">
221
222 <a href="../index.html" class="fa fa-home"> CodeIgniter</a>
223
224
225<div role="search">
226 <form id="rtd-search-form" class="wy-form" action="../search.html" method="get">
227 <input type="text" name="q" placeholder="Search docs" />
228 <input type="hidden" name="check_keywords" value="yes" />
229 <input type="hidden" name="area" value="default" />
230 </form>
231</div>
232 </div>
233
234 <div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation">
235
236
237
238 <ul>
239<li class="toctree-l1"><a class="reference internal" href="../general/welcome.html">Welcome to CodeIgniter</a></li>
240</ul>
241<ul class="current">
242<li class="toctree-l1 current"><a class="reference internal" href="index.html">Installation Instructions</a><ul class="current">
243<li class="toctree-l2"><a class="reference internal" href="downloads.html">Downloading CodeIgniter</a></li>
244<li class="toctree-l2"><a class="reference internal" href="index.html">Installation Instructions</a></li>
245<li class="toctree-l2 current"><a class="reference internal" href="upgrading.html">Upgrading From a Previous Version</a></li>
246<li class="toctree-l2"><a class="reference internal" href="troubleshooting.html">Troubleshooting</a></li>
247</ul>
248</li>
249</ul>
250<ul>
251<li class="toctree-l1"><a class="reference internal" href="../overview/index.html">CodeIgniter Overview</a><ul>
252<li class="toctree-l2"><a class="reference internal" href="../overview/getting_started.html">Getting Started</a></li>
253<li class="toctree-l2"><a class="reference internal" href="../overview/at_a_glance.html">CodeIgniter at a Glance</a></li>
254<li class="toctree-l2"><a class="reference internal" href="../overview/features.html">Supported Features</a></li>
255<li class="toctree-l2"><a class="reference internal" href="../overview/appflow.html">Application Flow Chart</a></li>
256<li class="toctree-l2"><a class="reference internal" href="../overview/mvc.html">Model-View-Controller</a></li>
257<li class="toctree-l2"><a class="reference internal" href="../overview/goals.html">Architectural Goals</a></li>
258</ul>
259</li>
260</ul>
261<ul>
262<li class="toctree-l1"><a class="reference internal" href="../tutorial/index.html">Tutorial</a><ul>
263<li class="toctree-l2"><a class="reference internal" href="../tutorial/static_pages.html">Static pages</a></li>
264<li class="toctree-l2"><a class="reference internal" href="../tutorial/news_section.html">News section</a></li>
265<li class="toctree-l2"><a class="reference internal" href="../tutorial/create_news_items.html">Create news items</a></li>
266<li class="toctree-l2"><a class="reference internal" href="../tutorial/conclusion.html">Conclusion</a></li>
267</ul>
268</li>
269</ul>
270<ul>
271<li class="toctree-l1"><a class="reference internal" href="../contributing/index.html">Contributing to CodeIgniter</a><ul>
272<li class="toctree-l2"><a class="reference internal" href="../documentation/index.html">Writing CodeIgniter Documentation</a></li>
273<li class="toctree-l2"><a class="reference internal" href="../DCO.html">Developer’s Certificate of Origin 1.1</a></li>
274</ul>
275</li>
276</ul>
277<ul>
278<li class="toctree-l1"><a class="reference internal" href="../general/index.html">General Topics</a><ul>
279<li class="toctree-l2"><a class="reference internal" href="../general/urls.html">CodeIgniter URLs</a></li>
280<li class="toctree-l2"><a class="reference internal" href="../general/controllers.html">Controllers</a></li>
281<li class="toctree-l2"><a class="reference internal" href="../general/reserved_names.html">Reserved Names</a></li>
282<li class="toctree-l2"><a class="reference internal" href="../general/views.html">Views</a></li>
283<li class="toctree-l2"><a class="reference internal" href="../general/models.html">Models</a></li>
284<li class="toctree-l2"><a class="reference internal" href="../general/helpers.html">Helpers</a></li>
285<li class="toctree-l2"><a class="reference internal" href="../general/libraries.html">Using CodeIgniter Libraries</a></li>
286<li class="toctree-l2"><a class="reference internal" href="../general/creating_libraries.html">Creating Libraries</a></li>
287<li class="toctree-l2"><a class="reference internal" href="../general/drivers.html">Using CodeIgniter Drivers</a></li>
288<li class="toctree-l2"><a class="reference internal" href="../general/creating_drivers.html">Creating Drivers</a></li>
289<li class="toctree-l2"><a class="reference internal" href="../general/core_classes.html">Creating Core System Classes</a></li>
290<li class="toctree-l2"><a class="reference internal" href="../general/ancillary_classes.html">Creating Ancillary Classes</a></li>
291<li class="toctree-l2"><a class="reference internal" href="../general/hooks.html">Hooks - Extending the Framework Core</a></li>
292<li class="toctree-l2"><a class="reference internal" href="../general/autoloader.html">Auto-loading Resources</a></li>
293<li class="toctree-l2"><a class="reference internal" href="../general/common_functions.html">Common Functions</a></li>
294<li class="toctree-l2"><a class="reference internal" href="../general/compatibility_functions.html">Compatibility Functions</a></li>
295<li class="toctree-l2"><a class="reference internal" href="../general/routing.html">URI Routing</a></li>
296<li class="toctree-l2"><a class="reference internal" href="../general/errors.html">Error Handling</a></li>
297<li class="toctree-l2"><a class="reference internal" href="../general/caching.html">Caching</a></li>
298<li class="toctree-l2"><a class="reference internal" href="../general/profiling.html">Profiling Your Application</a></li>
299<li class="toctree-l2"><a class="reference internal" href="../general/cli.html">Running via the CLI</a></li>
300<li class="toctree-l2"><a class="reference internal" href="../general/managing_apps.html">Managing your Applications</a></li>
301<li class="toctree-l2"><a class="reference internal" href="../general/environments.html">Handling Multiple Environments</a></li>
302<li class="toctree-l2"><a class="reference internal" href="../general/alternative_php.html">Alternate PHP Syntax for View Files</a></li>
303<li class="toctree-l2"><a class="reference internal" href="../general/security.html">Security</a></li>
304<li class="toctree-l2"><a class="reference internal" href="../general/styleguide.html">PHP Style Guide</a></li>
305</ul>
306</li>
307</ul>
308<ul>
309<li class="toctree-l1"><a class="reference internal" href="../libraries/index.html">Libraries</a><ul>
310<li class="toctree-l2"><a class="reference internal" href="../libraries/benchmark.html">Benchmarking Class</a></li>
311<li class="toctree-l2"><a class="reference internal" href="../libraries/caching.html">Caching Driver</a></li>
312<li class="toctree-l2"><a class="reference internal" href="../libraries/calendar.html">Calendaring Class</a></li>
313<li class="toctree-l2"><a class="reference internal" href="../libraries/cart.html">Shopping Cart Class</a></li>
314<li class="toctree-l2"><a class="reference internal" href="../libraries/config.html">Config Class</a></li>
315<li class="toctree-l2"><a class="reference internal" href="../libraries/email.html">Email Class</a></li>
316<li class="toctree-l2"><a class="reference internal" href="../libraries/encrypt.html">Encrypt Class</a></li>
317<li class="toctree-l2"><a class="reference internal" href="../libraries/encryption.html">Encryption Library</a></li>
318<li class="toctree-l2"><a class="reference internal" href="../libraries/file_uploading.html">File Uploading Class</a></li>
319<li class="toctree-l2"><a class="reference internal" href="../libraries/form_validation.html">Form Validation</a></li>
320<li class="toctree-l2"><a class="reference internal" href="../libraries/ftp.html">FTP Class</a></li>
321<li class="toctree-l2"><a class="reference internal" href="../libraries/image_lib.html">Image Manipulation Class</a></li>
322<li class="toctree-l2"><a class="reference internal" href="../libraries/input.html">Input Class</a></li>
323<li class="toctree-l2"><a class="reference internal" href="../libraries/javascript.html">Javascript Class</a></li>
324<li class="toctree-l2"><a class="reference internal" href="../libraries/language.html">Language Class</a></li>
325<li class="toctree-l2"><a class="reference internal" href="../libraries/loader.html">Loader Class</a></li>
326<li class="toctree-l2"><a class="reference internal" href="../libraries/migration.html">Migrations Class</a></li>
327<li class="toctree-l2"><a class="reference internal" href="../libraries/output.html">Output Class</a></li>
328<li class="toctree-l2"><a class="reference internal" href="../libraries/pagination.html">Pagination Class</a></li>
329<li class="toctree-l2"><a class="reference internal" href="../libraries/parser.html">Template Parser Class</a></li>
330<li class="toctree-l2"><a class="reference internal" href="../libraries/security.html">Security Class</a></li>
331<li class="toctree-l2"><a class="reference internal" href="../libraries/sessions.html">Session Library</a></li>
332<li class="toctree-l2"><a class="reference internal" href="../libraries/table.html">HTML Table Class</a></li>
333<li class="toctree-l2"><a class="reference internal" href="../libraries/trackback.html">Trackback Class</a></li>
334<li class="toctree-l2"><a class="reference internal" href="../libraries/typography.html">Typography Class</a></li>
335<li class="toctree-l2"><a class="reference internal" href="../libraries/unit_testing.html">Unit Testing Class</a></li>
336<li class="toctree-l2"><a class="reference internal" href="../libraries/uri.html">URI Class</a></li>
337<li class="toctree-l2"><a class="reference internal" href="../libraries/user_agent.html">User Agent Class</a></li>
338<li class="toctree-l2"><a class="reference internal" href="../libraries/xmlrpc.html">XML-RPC and XML-RPC Server Classes</a></li>
339<li class="toctree-l2"><a class="reference internal" href="../libraries/zip.html">Zip Encoding Class</a></li>
340</ul>
341</li>
342</ul>
343<ul>
344<li class="toctree-l1"><a class="reference internal" href="../database/index.html">Database Reference</a><ul>
345<li class="toctree-l2"><a class="reference internal" href="../database/examples.html">Quick Start: Usage Examples</a></li>
346<li class="toctree-l2"><a class="reference internal" href="../database/configuration.html">Database Configuration</a></li>
347<li class="toctree-l2"><a class="reference internal" href="../database/connecting.html">Connecting to a Database</a></li>
348<li class="toctree-l2"><a class="reference internal" href="../database/queries.html">Running Queries</a></li>
349<li class="toctree-l2"><a class="reference internal" href="../database/results.html">Generating Query Results</a></li>
350<li class="toctree-l2"><a class="reference internal" href="../database/helpers.html">Query Helper Functions</a></li>
351<li class="toctree-l2"><a class="reference internal" href="../database/query_builder.html">Query Builder Class</a></li>
352<li class="toctree-l2"><a class="reference internal" href="../database/transactions.html">Transactions</a></li>
353<li class="toctree-l2"><a class="reference internal" href="../database/metadata.html">Getting MetaData</a></li>
354<li class="toctree-l2"><a class="reference internal" href="../database/call_function.html">Custom Function Calls</a></li>
355<li class="toctree-l2"><a class="reference internal" href="../database/caching.html">Query Caching</a></li>
356<li class="toctree-l2"><a class="reference internal" href="../database/forge.html">Database Manipulation with Database Forge</a></li>
357<li class="toctree-l2"><a class="reference internal" href="../database/utilities.html">Database Utilities Class</a></li>
358<li class="toctree-l2"><a class="reference internal" href="../database/db_driver_reference.html">Database Driver Reference</a></li>
359</ul>
360</li>
361</ul>
362<ul>
363<li class="toctree-l1"><a class="reference internal" href="../helpers/index.html">Helpers</a><ul>
364<li class="toctree-l2"><a class="reference internal" href="../helpers/array_helper.html">Array Helper</a></li>
365<li class="toctree-l2"><a class="reference internal" href="../helpers/captcha_helper.html">CAPTCHA Helper</a></li>
366<li class="toctree-l2"><a class="reference internal" href="../helpers/cookie_helper.html">Cookie Helper</a></li>
367<li class="toctree-l2"><a class="reference internal" href="../helpers/date_helper.html">Date Helper</a></li>
368<li class="toctree-l2"><a class="reference internal" href="../helpers/directory_helper.html">Directory Helper</a></li>
369<li class="toctree-l2"><a class="reference internal" href="../helpers/download_helper.html">Download Helper</a></li>
370<li class="toctree-l2"><a class="reference internal" href="../helpers/email_helper.html">Email Helper</a></li>
371<li class="toctree-l2"><a class="reference internal" href="../helpers/file_helper.html">File Helper</a></li>
372<li class="toctree-l2"><a class="reference internal" href="../helpers/form_helper.html">Form Helper</a></li>
373<li class="toctree-l2"><a class="reference internal" href="../helpers/html_helper.html">HTML Helper</a></li>
374<li class="toctree-l2"><a class="reference internal" href="../helpers/inflector_helper.html">Inflector Helper</a></li>
375<li class="toctree-l2"><a class="reference internal" href="../helpers/language_helper.html">Language Helper</a></li>
376<li class="toctree-l2"><a class="reference internal" href="../helpers/number_helper.html">Number Helper</a></li>
377<li class="toctree-l2"><a class="reference internal" href="../helpers/path_helper.html">Path Helper</a></li>
378<li class="toctree-l2"><a class="reference internal" href="../helpers/security_helper.html">Security Helper</a></li>
379<li class="toctree-l2"><a class="reference internal" href="../helpers/smiley_helper.html">Smiley Helper</a></li>
380<li class="toctree-l2"><a class="reference internal" href="../helpers/string_helper.html">String Helper</a></li>
381<li class="toctree-l2"><a class="reference internal" href="../helpers/text_helper.html">Text Helper</a></li>
382<li class="toctree-l2"><a class="reference internal" href="../helpers/typography_helper.html">Typography Helper</a></li>
383<li class="toctree-l2"><a class="reference internal" href="../helpers/url_helper.html">URL Helper</a></li>
384<li class="toctree-l2"><a class="reference internal" href="../helpers/xml_helper.html">XML Helper</a></li>
385</ul>
386</li>
387</ul>
388
389
390
391 </div>
392 &nbsp;
393 </nav>
394
395 <section data-toggle="wy-nav-shift" class="wy-nav-content-wrap">
396
397
398 <nav class="wy-nav-top" role="navigation" aria-label="top navigation">
399 <i data-toggle="wy-nav-top" class="fa fa-bars"></i>
400 <a href="../index.html">CodeIgniter</a>
401 </nav>
402
403
404
405 <div class="wy-nav-content">
406 <div class="rst-content">
407 <div role="navigation" aria-label="breadcrumbs navigation">
408 <ul class="wy-breadcrumbs">
409 <li><a href="../index.html">Docs</a> &raquo;</li>
410
411 <li><a href="index.html">Installation Instructions</a> &raquo;</li>
412
413 <li><a href="upgrading.html">Upgrading From a Previous Version</a> &raquo;</li>
414
415 <li>Upgrading from 2.2.x to 3.0.x</li>
416 <li class="wy-breadcrumbs-aside">
417
418 </li>
419 <div style="float:right;margin-left:5px;" id="closeMe">
420 <img title="Classic Layout" alt="classic layout" src="data:image/gif;base64,R0lGODlhFAAUAJEAAAAAADMzM////wAAACH5BAUUAAIALAAAAAAUABQAAAImlI+py+0PU5gRBRDM3DxbWoXis42X13USOLauUIqnlsaH/eY6UwAAOw==" />
421 </div>
422 </ul>
423 <hr/>
424</div>
425 <div role="main" class="document">
426
427 <div class="section" id="upgrading-from-2-2-x-to-3-0-x">
428<h1>Upgrading from 2.2.x to 3.0.x<a class="headerlink" href="#upgrading-from-2-2-x-to-3-0-x" title="Permalink to this headline"></a></h1>
429<p>Before performing an update you should take your site offline by replacing the index.php file with a static one.</p>
430<div class="section" id="step-1-update-your-codeigniter-files">
431<h2>Step 1: Update your CodeIgniter files<a class="headerlink" href="#step-1-update-your-codeigniter-files" title="Permalink to this headline"></a></h2>
432<p><strong>Replace</strong> all files and directories in your <em>system/</em> directory and
433replace your index.php file. If any modifications were made to your
434index.php they will need to be made fresh in this new one.</p>
435<div class="admonition important">
436<p class="first admonition-title">Important</p>
437<p class="last">You have to delete the old <em>system/</em> directory first and
438then put the new one in its place. A simple copy-paste may cause
439issues.</p>
440</div>
441<div class="admonition note">
442<p class="first admonition-title">Note</p>
443<p class="last">If you have any custom developed files in these folders please
444make copies of them first.</p>
445</div>
446</div>
447<div class="section" id="step-2-update-your-classes-file-names">
448<h2>Step 2: Update your classes file names<a class="headerlink" href="#step-2-update-your-classes-file-names" title="Permalink to this headline"></a></h2>
449<p>Starting with CodeIgniter 3.0, all class filenames (libraries, drivers, controllers
450and models) must be named in a Ucfirst-like manner or in other words - they must
451start with a capital letter.</p>
452<p>For example, if you have the following library file:</p>
453<blockquote>
454<div>application/libraries/mylibrary.php</div></blockquote>
455<p>… then you’ll have to rename it to:</p>
456<blockquote>
457<div>application/libraries/Mylibrary.php</div></blockquote>
458<p>The same goes for driver libraries and extensions and/or overrides of CodeIgniter’s
459own libraries and core classes.</p>
460<blockquote>
461<div>application/libraries/MY_email.php
462application/core/MY_log.php</div></blockquote>
463<p>The above files should respectively be renamed to the following:</p>
464<blockquote>
465<div>application/libraries/MY_Email.php
466application/core/MY_Log.php</div></blockquote>
467<p>Controllers:</p>
468<blockquote>
469<div>application/controllers/welcome.php -&gt; application/controllers/Welcome.php</div></blockquote>
470<p>Models:</p>
471<blockquote>
472<div>application/models/misc_model.php -&gt; application/models/Misc_model.php</div></blockquote>
473<p>Please note that this DOES NOT affect directories, configuration files, views,
474helpers, hooks and anything else - it is only applied to classes.</p>
475<p>You must now follow just one simple rule - class names in Ucfirst and everything else
476in lowercase.</p>
477</div>
478<div class="section" id="step-3-replace-config-mimes-php">
479<h2>Step 3: Replace config/mimes.php<a class="headerlink" href="#step-3-replace-config-mimes-php" title="Permalink to this headline"></a></h2>
480<p>This config file has been updated to contain more user mime-types, please copy
481it to <em>application/config/mimes.php</em>.</p>
482</div>
483<div class="section" id="step-4-remove-autoload-core-from-your-config-autoload-php">
484<h2>Step 4: Remove $autoload[‘core’] from your config/autoload.php<a class="headerlink" href="#step-4-remove-autoload-core-from-your-config-autoload-php" title="Permalink to this headline"></a></h2>
485<p>Use of the <code class="docutils literal"><span class="pre">$autoload['core']</span></code> config array has been deprecated as of CodeIgniter 1.4.1 and is now removed.
486Move any entries that you might have listed there to <code class="docutils literal"><span class="pre">$autoload['libraries']</span></code> instead.</p>
487</div>
488<div class="section" id="step-5-move-your-log-class-overrides-or-extensions">
489<h2>Step 5: Move your Log class overrides or extensions<a class="headerlink" href="#step-5-move-your-log-class-overrides-or-extensions" title="Permalink to this headline"></a></h2>
490<p>The Log Class is considered as a “core” class and is now located in the
491<strong>system/core/</strong> directory. Therefore, in order for your Log class overrides
492or extensions to work, you need to move them to <strong>application/core/</strong>:</p>
493<blockquote>
494<div>application/libraries/Log.php -&gt; application/core/Log.php
495application/libraries/MY_Log.php -&gt; application/core/MY_Log.php</div></blockquote>
496</div>
497<div class="section" id="step-6-update-your-session-library-usage">
498<h2>Step 6: Update your Session library usage<a class="headerlink" href="#step-6-update-your-session-library-usage" title="Permalink to this headline"></a></h2>
499<p>The <a class="reference internal" href="../libraries/sessions.html"><span class="doc">Session Library</span></a> has been completely
500re-written in CodeIgniter 3 and now comes with a bunch of new features,
501but that also means that there are changes that you should make …</p>
502<p>Most notably, the library now uses separate storage drivers instead of
503always relying on (encrypted) cookies.
504In fact, cookies as storage have now been removed and you must always use
505some kind of server-side storage engine, with the file-system being the
506default option.</p>
507<p>The Session Class now utilizes PHP’s own mechanisms for building custom
508session handlers, which also means that your session data is now
509accessible via the <code class="docutils literal"><span class="pre">$_SESSION</span></code> superglobal (though, we’ve kept the
510possibility to use it as “userdata”, like you’ve done until now).</p>
511<p>A few configuration options have been removed and a few have been added.
512You should really read the whole <a class="reference internal" href="../libraries/sessions.html"><span class="doc">Session library manual</span></a> for the details, but here’s a short list of changes
513that you should make:</p>
514<blockquote>
515<div><ul>
516<li><p class="first">Set your <code class="docutils literal"><span class="pre">$config['sess_driver']</span></code> value</p>
517<p>It will default to ‘files’, unless you’ve previously used
518<code class="docutils literal"><span class="pre">$config['sess_use_database']</span></code>, in which case it will be set to
519‘database’.</p>
520</li>
521<li><p class="first">Set a <code class="docutils literal"><span class="pre">$config['sess_save_path']</span></code> value</p>
522<p>For the ‘database’ driver, a fallback to <code class="docutils literal"><span class="pre">$config['sess_table_name']</span></code>
523is in place, but otherwise requires you to read the manual for the
524specific driver of your choice.</p>
525</li>
526<li><p class="first">Update your <code class="docutils literal"><span class="pre">ci_sessions</span></code> table (‘database’ driver only)</p>
527<p>The table structure has changed a bit, and more specifically:</p>
528<blockquote>
529<div><ul class="simple">
530<li><code class="docutils literal"><span class="pre">session_id</span></code> field is renamed to <code class="docutils literal"><span class="pre">id</span></code></li>
531<li><code class="docutils literal"><span class="pre">user_agent</span></code> field is dropped</li>
532<li><code class="docutils literal"><span class="pre">user_data</span></code> field is renamed to <code class="docutils literal"><span class="pre">data</span></code> and under MySQL is now of type BLOB</li>
533<li><code class="docutils literal"><span class="pre">last_activity</span></code> field is renamed to <code class="docutils literal"><span class="pre">timestamp</span></code></li>
534</ul>
535</div></blockquote>
536<p>This is accompanied by a slight change in the table indexes too, so
537please read the manual about the <a class="reference external" href="../libraries/sessions.html#database-driver">Session Database Driver</a> for more information.</p>
538<div class="admonition important">
539<p class="first admonition-title">Important</p>
540<p class="last">Only MySQL and PostgreSQL are officially supported
541now. Other databases may still work, but due to lack of advisory
542locking features, they are unsafe for concurrent requests and
543you should consider using another driver instead.</p>
544</div>
545</li>
546<li><p class="first">Remove <code class="docutils literal"><span class="pre">$config['sess_match_useragent']</span></code></p>
547<p>The user-agent string is input supplied by the user’s browser, or in
548other words: client side input. As such, it is an ineffective feature
549and hence why it has been removed.</p>
550</li>
551<li><p class="first">Remove <code class="docutils literal"><span class="pre">$config['sess_encrypt_cookie']</span></code></p>
552<p>As already noted, the library no longer uses cookies as a storage
553mechanism, which renders this option useless.</p>
554</li>
555<li><p class="first">Remove <code class="docutils literal"><span class="pre">$config['sess_expire_on_close']</span></code></p>
556<p>This option is still usable, but only for backwards compatibility
557purposes and it should be otherwise removed. The same effect is
558achieved by setting <code class="docutils literal"><span class="pre">$config['sess_expiration']</span></code> to 0.</p>
559</li>
560<li><p class="first">Check “flashdata” for collisions with “userdata”</p>
561<p>Flashdata is now just regular “userdata”, only marked for deletion on
562the next request. In other words: you can’t have both “userdata” and
563“flashdata” with the same name, because it’s the same thing.</p>
564</li>
565<li><p class="first">Check usage of session metadata</p>
566<p>Previously, you could access the ‘session_id’, ‘ip_address’,
567‘user_agent’ and ‘last_activity’ metadata items as userdata.
568This is no longer possible, and you should read the notes about
569<a class="reference external" href="../libraries/sessions.html#accessing-session-metadata">Session Metadata</a>
570if your application relies on those values.</p>
571</li>
572<li><p class="first">Check <code class="docutils literal"><span class="pre">unset_userdata()</span></code> usage</p>
573<p>Previously, this method used to accept an associative array of
574<code class="docutils literal"><span class="pre">'key'</span> <span class="pre">=&gt;</span> <span class="pre">'dummy</span> <span class="pre">value'</span></code> pairs for unsetting multiple keys. That
575however makes no sense and you now have to pass <em>only</em> the keys, as
576the elements of an array.</p>
577<div class="highlight-ci"><div class="highlight"><pre><span></span><span class="c1">// Old</span>
578<span class="nv">$this</span><span class="o">-&gt;</span><span class="na">session</span><span class="o">-&gt;</span><span class="na">unset_userdata</span><span class="p">(</span><span class="k">array</span><span class="p">(</span><span class="s1">&#39;item&#39;</span> <span class="o">=&gt;</span> <span class="s1">&#39;&#39;</span><span class="p">,</span> <span class="s1">&#39;item2&#39;</span> <span class="o">=&gt;</span> <span class="s1">&#39;&#39;</span><span class="p">));</span>
579
580<span class="c1">// New</span>
581<span class="nv">$this</span><span class="o">-&gt;</span><span class="na">session</span><span class="o">-&gt;</span><span class="na">unset_userdata</span><span class="p">(</span><span class="k">array</span><span class="p">(</span><span class="s1">&#39;item&#39;</span><span class="p">,</span> <span class="s1">&#39;item2&#39;</span><span class="p">));</span>
582</pre></div>
583</div>
584</li>
585</ul>
586</div></blockquote>
587<p>Finally, if you have written a Session extension, you must now move it to
588the <em>application/libraries/Session/</em> directory, although chances are that
589it will now also have to be re-factored.</p>
590</div>
591<div class="section" id="step-7-update-your-config-database-php">
592<h2>Step 7: Update your config/database.php<a class="headerlink" href="#step-7-update-your-config-database-php" title="Permalink to this headline"></a></h2>
593<p>Due to 3.0.0’s renaming of Active Record to Query Builder, inside your
594<strong>config/database.php</strong>, you will need to rename the <code class="docutils literal"><span class="pre">$active_record</span></code>
595variable to <code class="docutils literal"><span class="pre">$query_builder</span></code>:</p>
596<div class="highlight-ci"><div class="highlight"><pre><span></span><span class="nv">$active_group</span> <span class="o">=</span> <span class="s1">&#39;default&#39;</span><span class="p">;</span>
597<span class="c1">// $active_record = TRUE;</span>
598<span class="nv">$query_builder</span> <span class="o">=</span> <span class="k">TRUE</span><span class="p">;</span>
599</pre></div>
600</div>
601</div>
602<div class="section" id="step-8-replace-your-error-templates">
603<h2>Step 8: Replace your error templates<a class="headerlink" href="#step-8-replace-your-error-templates" title="Permalink to this headline"></a></h2>
604<p>In CodeIgniter 3.0, the error templates are now considered as views and have been moved to the
605<em>application/views/errors</em> directory.</p>
606<p>Furthermore, we’ve added support for CLI error templates in plain-text format that unlike HTML,
607is suitable for the command line. This of course requires another level of separation.</p>
608<p>It is safe to move your old templates from <em>application/errors</em> to <em>application/views/errors/html</em>,
609but you’ll have to copy the new <em>application/views/errors/cli</em> directory from the CodeIgniter archive.</p>
610</div>
611<div class="section" id="step-9-update-your-config-routes-php-file">
612<h2>Step 9: Update your config/routes.php file<a class="headerlink" href="#step-9-update-your-config-routes-php-file" title="Permalink to this headline"></a></h2>
613<div class="section" id="routes-containing-any">
614<h3>Routes containing :any<a class="headerlink" href="#routes-containing-any" title="Permalink to this headline"></a></h3>
615<p>Historically, CodeIgniter has always provided the <strong>:any</strong> wildcard in
616routing, with the intention of providing a way to match any character
617<strong>within</strong> an URI segment.</p>
618<p>However, the <strong>:any</strong> wildcard is actually just an alias for a regular
619expression and used to be executed in that manner as <strong>.+</strong>. This is
620considered a bug, as it also matches the / (forward slash) character, which
621is the URI segment delimiter and that was never the intention.</p>
622<p>In CodeIgniter 3, the <strong>:any</strong> wildcard will now represent <strong>[^/]+</strong>, so
623that it will not match a forward slash.</p>
624<p>There are certainly many developers that have utilized this bug as an actual
625feature. If you’re one of them and want to match a forward slash, please use
626the <strong>.+</strong> regular expression:</p>
627<div class="highlight-ci"><div class="highlight"><pre><span></span><span class="p">(</span><span class="o">.+</span><span class="p">)</span> <span class="c1">// matches ANYTHING</span>
628<span class="p">(</span><span class="o">:</span><span class="nx">any</span><span class="p">)</span> <span class="c1">// matches any character, except for &#39;/&#39;</span>
629</pre></div>
630</div>
631</div>
632<div class="section" id="directories-and-default-controller-404-override">
633<h3>Directories and ‘default_controller’, ‘404_override’<a class="headerlink" href="#directories-and-default-controller-404-override" title="Permalink to this headline"></a></h3>
634<p>As you should know, the <code class="docutils literal"><span class="pre">$route['default_controller']</span></code> and
635<code class="docutils literal"><span class="pre">$route['404_override']</span></code> settings accept not only a controller name, but
636also <em>controller/method</em> pairs. However, a bug in the routing logic has
637made it possible for some users to use that as <em>directory/controller</em>
638instead.</p>
639<p>As already said, this behavior was incidental and was never intended, nor
640documented. If you’ve relied on it, your application will break with
641CodeIgniter 3.0.</p>
642<p>Another notable change in version 3 is that ‘default_controller’ and
643‘404_override’ are now applied <em>per directory</em>. To explain what this means,
644let’s take the following example:</p>
645<div class="highlight-ci"><div class="highlight"><pre><span></span><span class="nv">$route</span><span class="p">[</span><span class="s1">&#39;default_controller&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="s1">&#39;main&#39;</span><span class="p">;</span>
646</pre></div>
647</div>
648<p>Now, assuming that your website is located at <em>example.com</em>, you already
649know that if a user visits <code class="docutils literal"><span class="pre">http://example.com/</span></code>, the above setting will
650cause your ‘Main’ controller to be loaded.</p>
651<p>However, what happens if you have an <em>application/controllers/admin/</em>
652directory and the user visits <code class="docutils literal"><span class="pre">http://example.com/admin/</span></code>?
653In CodeIgniter 3, the router will look for a ‘Main’ controller under the
654admin/ directory as well. If not found, a Not Found (404) will be triggered.</p>
655<p>The same rule applies to the ‘404_override’ setting.</p>
656</div>
657</div>
658<div class="section" id="step-10-many-functions-now-return-null-instead-of-false-on-missing-items">
659<h2>Step 10: Many functions now return NULL instead of FALSE on missing items<a class="headerlink" href="#step-10-many-functions-now-return-null-instead-of-false-on-missing-items" title="Permalink to this headline"></a></h2>
660<p>Many methods and functions now return NULL instead of FALSE when the required items don’t exist:</p>
661<blockquote>
662<div><ul class="simple">
663<li><a class="reference internal" href="../general/common_functions.html"><span class="doc">Common functions</span></a><ul>
664<li>config_item()</li>
665</ul>
666</li>
667<li><a class="reference internal" href="../libraries/config.html"><span class="doc">Config Class</span></a><ul>
668<li>config-&gt;item()</li>
669<li>config-&gt;slash_item()</li>
670</ul>
671</li>
672<li><a class="reference internal" href="../libraries/input.html"><span class="doc">Input Class</span></a><ul>
673<li>input-&gt;get()</li>
674<li>input-&gt;post()</li>
675<li>input-&gt;get_post()</li>
676<li>input-&gt;cookie()</li>
677<li>input-&gt;server()</li>
678<li>input-&gt;input_stream()</li>
679<li>input-&gt;get_request_header()</li>
680</ul>
681</li>
682<li><a class="reference internal" href="../libraries/sessions.html"><span class="doc">Session Class</span></a><ul>
683<li>session-&gt;userdata()</li>
684<li>session-&gt;flashdata()</li>
685</ul>
686</li>
687<li><a class="reference internal" href="../libraries/uri.html"><span class="doc">URI Class</span></a><ul>
688<li>uri-&gt;segment()</li>
689<li>uri-&gt;rsegment()</li>
690</ul>
691</li>
692<li><a class="reference internal" href="../helpers/array_helper.html"><span class="doc">Array Helper</span></a><ul>
693<li>element()</li>
694<li>elements()</li>
695</ul>
696</li>
697</ul>
698</div></blockquote>
699</div>
700<div class="section" id="step-11-usage-of-xss-filtering">
701<h2>Step 11: Usage of XSS filtering<a class="headerlink" href="#step-11-usage-of-xss-filtering" title="Permalink to this headline"></a></h2>
702<p>Many functions in CodeIgniter allow you to use its XSS filtering feature
703on demand by passing a boolean parameter. The default value of that
704parameter used to be boolean FALSE, but it is now changed to NULL and it
705will be dynamically determined by your <code class="docutils literal"><span class="pre">$config['global_xss_filtering']</span></code>
706value.</p>
707<p>If you used to manually pass a boolean value for the <code class="docutils literal"><span class="pre">$xss_filter</span></code>
708parameter or if you’ve always had <code class="docutils literal"><span class="pre">$config['global_xss_filtering']</span></code> set
709to FALSE, then this change doesn’t concern you.</p>
710<p>Otherwise however, please review your usage of the following functions:</p>
711<blockquote>
712<div><ul class="simple">
713<li><a class="reference internal" href="../libraries/input.html"><span class="doc">Input Library</span></a><ul>
714<li>input-&gt;get()</li>
715<li>input-&gt;post()</li>
716<li>input-&gt;get_post()</li>
717<li>input-&gt;cookie()</li>
718<li>input-&gt;server()</li>
719<li>input-&gt;input_stream()</li>
720</ul>
721</li>
722<li><a class="reference internal" href="../helpers/cookie_helper.html"><span class="doc">Cookie Helper</span></a> <a class="reference internal" href="../helpers/cookie_helper.html#get_cookie" title="get_cookie"><code class="xref php php-func docutils literal"><span class="pre">get_cookie()</span></code></a></li>
723</ul>
724</div></blockquote>
725<div class="admonition important">
726<p class="first admonition-title">Important</p>
727<p class="last">Another related change is that the <code class="docutils literal"><span class="pre">$_GET</span></code>, <code class="docutils literal"><span class="pre">$_POST</span></code>,
728<code class="docutils literal"><span class="pre">$_COOKIE</span></code> and <code class="docutils literal"><span class="pre">$_SERVER</span></code> superglobals are no longer
729automatically overwritten when global XSS filtering is turned on.</p>
730</div>
731</div>
732<div class="section" id="step-12-check-for-potential-xss-issues-with-uris">
733<h2>Step 12: Check for potential XSS issues with URIs<a class="headerlink" href="#step-12-check-for-potential-xss-issues-with-uris" title="Permalink to this headline"></a></h2>
734<p>The <a class="reference internal" href="../libraries/uri.html"><span class="doc">URI Library</span></a> used to automatically convert
735a certain set of “programmatic characters” to HTML entities when they
736are encountered in a URI segment.</p>
737<p>This was aimed at providing some automatic XSS protection, in addition
738to the <code class="docutils literal"><span class="pre">$config['permitted_uri_chars']</span></code> setting, but has proven to be
739problematic and is now removed in CodeIgniter 3.0.</p>
740<p>If your application has relied on this feature, you should update it to
741filter URI segments through <code class="docutils literal"><span class="pre">$this-&gt;security-&gt;xss_clean()</span></code> whenever you
742output them.</p>
743</div>
744<div class="section" id="step-13-check-for-usage-of-the-xss-clean-form-validation-rule">
745<h2>Step 13: Check for usage of the ‘xss_clean’ Form validation rule<a class="headerlink" href="#step-13-check-for-usage-of-the-xss-clean-form-validation-rule" title="Permalink to this headline"></a></h2>
746<p>A largely unknown rule about XSS cleaning is that it should <em>only be
747applied to output</em>, as opposed to input data.</p>
748<p>We’ve made that mistake ourselves with our automatic and global XSS cleaning
749feature (see previous step about XSS above), so now in an effort to discourage that
750practice, we’re also removing ‘xss_clean’ from the officially supported
751list of <a class="reference internal" href="../libraries/form_validation.html"><span class="doc">form validation</span></a> rules.</p>
752<p>Because the <a class="reference internal" href="../libraries/form_validation.html"><span class="doc">Form Validation library</span></a>
753generally validates <em>input</em> data, the ‘xss_clean’ rule simply doesn’t
754belong in it.</p>
755<p>If you really, really need to apply that rule, you should now also load the
756<a class="reference internal" href="../helpers/security_helper.html"><span class="doc">Security Helper</span></a>, which contains
757<code class="docutils literal"><span class="pre">xss_clean()</span></code> as a regular function and therefore can be also used as
758a validation rule.</p>
759</div>
760<div class="section" id="step-14-update-usage-of-input-class-s-get-post-method">
761<h2>Step 14: Update usage of Input Class’s get_post() method<a class="headerlink" href="#step-14-update-usage-of-input-class-s-get-post-method" title="Permalink to this headline"></a></h2>
762<p>Previously, the <a class="reference internal" href="../libraries/input.html"><span class="doc">Input Class</span></a> method <code class="docutils literal"><span class="pre">get_post()</span></code>
763was searching first in POST data, then in GET data. This method has been
764modified so that it searches in GET then in POST, as its name suggests.</p>
765<p>A method has been added, <code class="docutils literal"><span class="pre">post_get()</span></code>, which searches in POST then in GET, as
766<code class="docutils literal"><span class="pre">get_post()</span></code> was doing before.</p>
767</div>
768<div class="section" id="step-15-update-usage-of-directory-helper-s-directory-map-function">
769<h2>Step 15: Update usage of Directory Helper’s directory_map() function<a class="headerlink" href="#step-15-update-usage-of-directory-helper-s-directory-map-function" title="Permalink to this headline"></a></h2>
770<p>In the resulting array, directories now end with a trailing directory
771separator (i.e. a slash, usually).</p>
772</div>
773<div class="section" id="step-16-update-usage-of-database-forge-s-drop-table-method">
774<h2>Step 16: Update usage of Database Forge’s drop_table() method<a class="headerlink" href="#step-16-update-usage-of-database-forge-s-drop-table-method" title="Permalink to this headline"></a></h2>
775<p>Up until now, <code class="docutils literal"><span class="pre">drop_table()</span></code> added an IF EXISTS clause by default or it didn’t work
776at all with some drivers. In CodeIgniter 3.0, the IF EXISTS condition is no longer added
777by default and has an optional second parameter that allows that instead and is set to
778FALSE by default.</p>
779<p>If your application relies on IF EXISTS, you’ll have to change its usage.</p>
780<div class="highlight-ci"><div class="highlight"><pre><span></span><span class="c1">// Now produces just DROP TABLE `table_name`</span>
781<span class="nv">$this</span><span class="o">-&gt;</span><span class="na">dbforge</span><span class="o">-&gt;</span><span class="na">drop_table</span><span class="p">(</span><span class="s1">&#39;table_name&#39;</span><span class="p">);</span>
782
783<span class="c1">// Produces DROP TABLE IF EXISTS `table_name`</span>
784<span class="nv">$this</span><span class="o">-&gt;</span><span class="na">dbforge</span><span class="o">-&gt;</span><span class="na">drop_table</span><span class="p">(</span><span class="s1">&#39;table_name&#39;</span><span class="p">,</span> <span class="k">TRUE</span><span class="p">);</span>
785</pre></div>
786</div>
787<div class="admonition note">
788<p class="first admonition-title">Note</p>
789<p class="last">The given example uses MySQL-specific syntax, but it should work across
790all drivers with the exception of ODBC.</p>
791</div>
792</div>
793<div class="section" id="step-17-change-usage-of-email-library-with-multiple-emails">
794<h2>Step 17: Change usage of Email library with multiple emails<a class="headerlink" href="#step-17-change-usage-of-email-library-with-multiple-emails" title="Permalink to this headline"></a></h2>
795<p>The <a class="reference internal" href="../libraries/email.html"><span class="doc">Email Library</span></a> will automatically clear the
796set parameters after successfully sending emails. To override this behaviour,
797pass FALSE as the first parameter in the <code class="docutils literal"><span class="pre">send()</span></code> method:</p>
798<div class="highlight-ci"><div class="highlight"><pre><span></span><span class="k">if</span> <span class="p">(</span><span class="nv">$this</span><span class="o">-&gt;</span><span class="na">email</span><span class="o">-&gt;</span><span class="na">send</span><span class="p">(</span><span class="k">FALSE</span><span class="p">))</span>
799<span class="p">{</span>
800 <span class="c1">// Parameters won&#39;t be cleared</span>
801<span class="p">}</span>
802</pre></div>
803</div>
804</div>
805<div class="section" id="step-18-update-your-form-validation-language-lines">
806<h2>Step 18: Update your Form_validation language lines<a class="headerlink" href="#step-18-update-your-form-validation-language-lines" title="Permalink to this headline"></a></h2>
807<p>Two improvements have been made to the <a class="reference internal" href="../libraries/form_validation.html"><span class="doc">Form Validation Library</span></a>’s <a class="reference internal" href="../libraries/language.html"><span class="doc">language</span></a>
808files and error messages format:</p>
809<blockquote>
810<div><ul>
811<li><p class="first"><a class="reference internal" href="../libraries/language.html"><span class="doc">Language Library</span></a> line keys now must be
812prefixed with <strong>form_validation_</strong> in order to avoid collisions:</p>
813<div class="highlight-ci"><div class="highlight"><pre><span></span><span class="c1">// Old</span>
814<span class="nv">$lang</span><span class="p">[</span><span class="s1">&#39;rule&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="o">...</span>
815
816<span class="c1">// New</span>
817<span class="nv">$lang</span><span class="p">[</span><span class="s1">&#39;form_validation_rule&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="o">...</span>
818</pre></div>
819</div>
820</li>
821<li><p class="first">The error messages format has been changed to use named parameters, to
822allow more flexibility than what <cite>sprintf()</cite> offers:</p>
823<div class="highlight-ci"><div class="highlight"><pre><span></span><span class="c1">// Old</span>
824<span class="s1">&#39;The %s field does not match the %s field.&#39;</span>
825
826<span class="c1">// New</span>
827<span class="s1">&#39;The {field} field does not match the {param} field.&#39;</span>
828</pre></div>
829</div>
830</li>
831</ul>
832</div></blockquote>
833<div class="admonition note">
834<p class="first admonition-title">Note</p>
835<p class="last">The old formatting still works, but the non-prefixed line keys
836are DEPRECATED and scheduled for removal in CodeIgniter 3.1+.
837Therefore you’re encouraged to update its usage sooner rather than
838later.</p>
839</div>
840</div>
841<div class="section" id="step-19-make-sure-your-base-url-config-value-is-not-empty">
842<h2>Step 19: Make sure your ‘base_url’ config value is not empty<a class="headerlink" href="#step-19-make-sure-your-base-url-config-value-is-not-empty" title="Permalink to this headline"></a></h2>
843<p>When <code class="docutils literal"><span class="pre">$config['base_url']</span></code> is not set, CodeIgniter tries to automatically
844detect what your website’s base URL is. This is done purely for convenience
845when you are starting development of a new application.</p>
846<p>Auto-detection is never reliable and also has security implications, which
847is why you should <strong>always</strong> have it manually configured!</p>
848<p>One of the changes in CodeIgniter 3.0.3 is how this auto-detection works,
849and more specifically it now falls back to the server’s IP address instead
850of the hostname requested by the client. Therefore, if you’ve ever relied
851on auto-detection, it will change how your website works now.</p>
852<p>In case you need to allow e.g. multiple domains, or both <a class="reference external" href="http://">http://</a> and
853<a class="reference external" href="https://">https://</a> prefixes to be dynamically used depending on the request,
854remember that <em>application/config/config.php</em> is still a PHP script, in
855which you can create this logic with a few lines of code. For example:</p>
856<div class="highlight-ci"><div class="highlight"><pre><span></span><span class="nv">$allowed_domains</span> <span class="o">=</span> <span class="k">array</span><span class="p">(</span><span class="s1">&#39;domain1.tld&#39;</span><span class="p">,</span> <span class="s1">&#39;domain2.tld&#39;</span><span class="p">);</span>
857<span class="nv">$default_domain</span> <span class="o">=</span> <span class="s1">&#39;domain1.tld&#39;</span><span class="p">;</span>
858
859<span class="k">if</span> <span class="p">(</span><span class="nb">in_array</span><span class="p">(</span><span class="nv">$_SERVER</span><span class="p">[</span><span class="s1">&#39;HTTP_HOST&#39;</span><span class="p">],</span> <span class="nv">$allowed_domains</span><span class="p">,</span> <span class="k">TRUE</span><span class="p">))</span>
860<span class="p">{</span>
861 <span class="nv">$domain</span> <span class="o">=</span> <span class="nv">$_SERVER</span><span class="p">[</span><span class="s1">&#39;HTTP_HOST&#39;</span><span class="p">];</span>
862<span class="p">}</span>
863<span class="k">else</span>
864<span class="p">{</span>
865 <span class="nv">$domain</span> <span class="o">=</span> <span class="nv">$default_domain</span><span class="p">;</span>
866<span class="p">}</span>
867
868<span class="k">if</span> <span class="p">(</span> <span class="o">!</span> <span class="k">empty</span><span class="p">(</span><span class="nv">$_SERVER</span><span class="p">[</span><span class="s1">&#39;HTTPS&#39;</span><span class="p">]))</span>
869<span class="p">{</span>
870 <span class="nv">$config</span><span class="p">[</span><span class="s1">&#39;base_url&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="s1">&#39;https://&#39;</span><span class="o">.</span><span class="nv">$domain</span><span class="p">;</span>
871<span class="p">}</span>
872<span class="k">else</span>
873<span class="p">{</span>
874 <span class="nv">$config</span><span class="p">[</span><span class="s1">&#39;base_url&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="s1">&#39;http://&#39;</span><span class="o">.</span><span class="nv">$domain</span><span class="p">;</span>
875<span class="p">}</span>
876</pre></div>
877</div>
878</div>
879<div class="section" id="step-20-remove-usage-of-previously-deprecated-functionalities">
880<h2>Step 20: Remove usage of (previously) deprecated functionalities<a class="headerlink" href="#step-20-remove-usage-of-previously-deprecated-functionalities" title="Permalink to this headline"></a></h2>
881<p>In addition to the <code class="docutils literal"><span class="pre">$autoload['core']</span></code> configuration setting, there’s a
882number of other functionalities that have been removed in CodeIgniter 3.0.0:</p>
883<div class="section" id="the-sha1-library">
884<h3>The SHA1 library<a class="headerlink" href="#the-sha1-library" title="Permalink to this headline"></a></h3>
885<p>The previously deprecated SHA1 library has been removed, alter your code to use PHP’s native
886<code class="docutils literal"><span class="pre">sha1()</span></code> function to generate a SHA1 hash.</p>
887<p>Additionally, the <code class="docutils literal"><span class="pre">sha1()</span></code> method in the <a class="reference internal" href="../libraries/encrypt.html"><span class="doc">Encrypt Library</span></a> has been removed.</p>
888</div>
889<div class="section" id="the-ext-constant">
890<h3>The EXT constant<a class="headerlink" href="#the-ext-constant" title="Permalink to this headline"></a></h3>
891<p>Usage of the <code class="docutils literal"><span class="pre">EXT</span></code> constant has been deprecated since dropping support for PHP 4. There’s no
892longer a need to maintain different filename extensions and in this new CodeIgniter version,
893the <code class="docutils literal"><span class="pre">EXT</span></code> constant has been removed. Use just ‘.php’ instead.</p>
894</div>
895<div class="section" id="smiley-helper">
896<h3>Smiley helper<a class="headerlink" href="#smiley-helper" title="Permalink to this headline"></a></h3>
897<p>The <a class="reference internal" href="../helpers/smiley_helper.html"><span class="doc">Smiley Helper</span></a> is a legacy feature from EllisLab’s
898ExpressionEngine product. However, it is too specific for a general purpose framework like
899CodeIgniter and as such it is now deprecated.</p>
900<p>Also, the previously deprecated <code class="docutils literal"><span class="pre">js_insert_smiley()</span></code> (since version 1.7.2) is now removed.</p>
901</div>
902<div class="section" id="the-encrypt-library">
903<h3>The Encrypt library<a class="headerlink" href="#the-encrypt-library" title="Permalink to this headline"></a></h3>
904<p>Following numerous vulnerability reports, the <a class="reference internal" href="../libraries/encrypt.html"><span class="doc">Encrypt Library</span></a> has
905been deprecated and a new, <a class="reference internal" href="../libraries/encryption.html"><span class="doc">Encryption Library</span></a> is added to take
906its place.</p>
907<p>The new library requires either the <a class="reference external" href="http://php.net/mcrypt">MCrypt extension</a> (and /dev/urandom
908availability) or PHP 5.3.3 and the <a class="reference external" href="http://php.net/openssl">OpenSSL extension</a>.
909While this might be rather inconvenient, it is a requirement that allows us to have properly
910implemented cryptographic functions.</p>
911<div class="admonition note">
912<p class="first admonition-title">Note</p>
913<p class="last">The <a class="reference internal" href="../libraries/encrypt.html"><span class="doc">Encrypt Library</span></a> is still available for the purpose
914of keeping backwards compatibility.</p>
915</div>
916<div class="admonition important">
917<p class="first admonition-title">Important</p>
918<p class="last">You are strongly encouraged to switch to the new <a class="reference internal" href="../libraries/encryption.html"><span class="doc">Encryption Library</span></a> as soon as possible!</p>
919</div>
920</div>
921<div class="section" id="the-cart-library">
922<h3>The Cart library<a class="headerlink" href="#the-cart-library" title="Permalink to this headline"></a></h3>
923<p>The <a class="reference internal" href="../libraries/cart.html"><span class="doc">Cart Library</span></a>, similarly to the <a class="reference internal" href="../helpers/smiley_helper.html"><span class="doc">Smiley Helper</span></a> is too specific for CodeIgniter. It is now deprecated
924and scheduled for removal in CodeIgniter 3.1+.</p>
925<div class="admonition note">
926<p class="first admonition-title">Note</p>
927<p class="last">The library is still available, but you’re strongly encouraged to remove its usage sooner
928rather than later.</p>
929</div>
930</div>
931<div class="section" id="database-drivers-mysql-sqlite-mssql-pdo-dblib">
932<h3>Database drivers ‘mysql’, ‘sqlite’, ‘mssql’, ‘pdo/dblib’<a class="headerlink" href="#database-drivers-mysql-sqlite-mssql-pdo-dblib" title="Permalink to this headline"></a></h3>
933<p>The <strong>mysql</strong> driver utilizes the old ‘mysql’ PHP extension, known for its aging code base and
934many low-level problems. The extension is deprecated as of PHP 5.5 and CodeIgniter deprecates
935it in version 3.0, switching the default configured MySQL driver to <strong>mysqli</strong>.</p>
936<p>Please use either the ‘mysqli’ or ‘pdo/mysql’ drivers for MySQL. The old ‘mysql’ driver will be
937removed at some point in the future.</p>
938<p>The <strong>sqlite</strong>, <strong>mssql</strong> and <strong>pdo/dblib</strong> (also known as pdo/mssql or pdo/sybase) drivers
939all depend on PHP extensions that for different reasons no longer exist since PHP 5.3.</p>
940<p>Therefore we are now deprecating these drivers as we will have to remove them in one of the next
941CodeIgniter versions. You should use the more advanced, <strong>sqlite3</strong>, <strong>sqlsrv</strong> or <strong>pdo/sqlsrv</strong>
942drivers respectively.</p>
943<div class="admonition note">
944<p class="first admonition-title">Note</p>
945<p class="last">These drivers are still available, but you’re strongly encouraged to switch to other ones
946sooner rather than later.</p>
947</div>
948</div>
949<div class="section" id="security-helper-do-hash">
950<h3>Security helper do_hash()<a class="headerlink" href="#security-helper-do-hash" title="Permalink to this headline"></a></h3>
951<p><a class="reference internal" href="../helpers/security_helper.html"><span class="doc">Security Helper</span></a> function <code class="docutils literal"><span class="pre">do_hash()</span></code> is now just an alias for
952PHP’s native <code class="docutils literal"><span class="pre">hash()</span></code> function. It is deprecated and scheduled for removal in CodeIgniter 3.1+.</p>
953<div class="admonition note">
954<p class="first admonition-title">Note</p>
955<p class="last">This function is still available, but you’re strongly encouraged to remove its usage sooner
956rather than later.</p>
957</div>
958</div>
959<div class="section" id="the-config-global-xss-filtering-setting">
960<h3>The $config[‘global_xss_filtering’] setting<a class="headerlink" href="#the-config-global-xss-filtering-setting" title="Permalink to this headline"></a></h3>
961<p>As already explained above, XSS filtering should not be done on input data,
962but on output instead. Therefore, the <code class="docutils literal"><span class="pre">$config['global_xss_filtering']</span></code>,
963which automatically filters <em>input</em> data, is considered a bad practice and
964is now deprecated.</p>
965<p>Instead, you should manually escape any user-provided data via the
966<a class="reference internal" href="../helpers/security_helper.html#xss_clean" title="xss_clean"><code class="xref php php-func docutils literal"><span class="pre">xss_clean()</span></code></a> function when you need to output it, or use a
967library like <a class="reference external" href="http://htmlpurifier.org/">HTML Purifier</a> that does that
968for you.</p>
969<div class="admonition note">
970<p class="first admonition-title">Note</p>
971<p class="last">The setting is still available, but you’re strongly encouraged to
972remove its usage sooner rather than later.</p>
973</div>
974</div>
975<div class="section" id="file-helper-read-file">
976<h3>File helper read_file()<a class="headerlink" href="#file-helper-read-file" title="Permalink to this headline"></a></h3>
977<p><a class="reference internal" href="../helpers/file_helper.html"><span class="doc">File Helper</span></a> function <code class="docutils literal"><span class="pre">read_file()</span></code> is now just an alias for
978PHP’s native <code class="docutils literal"><span class="pre">file_get_contents()</span></code> function. It is deprecated and scheduled for removal in
979CodeIgniter 3.1+.</p>
980<div class="admonition note">
981<p class="first admonition-title">Note</p>
982<p class="last">This function is still available, but you’re strongly encouraged to remove its usage sooner
983rather than later.</p>
984</div>
985</div>
986<div class="section" id="string-helper-repeater">
987<h3>String helper repeater()<a class="headerlink" href="#string-helper-repeater" title="Permalink to this headline"></a></h3>
988<p><a class="reference internal" href="../helpers/string_helper.html"><span class="doc">String Helper</span></a> function <a class="reference internal" href="../helpers/string_helper.html#repeater" title="repeater"><code class="xref php php-func docutils literal"><span class="pre">repeater()</span></code></a> is now just an alias for
989PHP’s native <code class="docutils literal"><span class="pre">str_repeat()</span></code> function. It is deprecated and scheduled for removal in CodeIgniter 3.1+.</p>
990<div class="admonition note">
991<p class="first admonition-title">Note</p>
992<p class="last">This function is still available, but you’re strongly encouraged to remove its usage sooner
993rather than later.</p>
994</div>
995</div>
996<div class="section" id="string-helper-trim-slashes">
997<h3>String helper trim_slashes()<a class="headerlink" href="#string-helper-trim-slashes" title="Permalink to this headline"></a></h3>
998<p><a class="reference internal" href="../helpers/string_helper.html"><span class="doc">String Helper</span></a> function <a class="reference internal" href="../helpers/string_helper.html#trim_slashes" title="trim_slashes"><code class="xref php php-func docutils literal"><span class="pre">trim_slashes()</span></code></a> is now just an alias
999for PHP’s native <code class="docutils literal"><span class="pre">trim()</span></code> function (with a slash passed as its second argument). It is deprecated and
1000scheduled for removal in CodeIgniter 3.1+.</p>
1001<div class="admonition note">
1002<p class="first admonition-title">Note</p>
1003<p class="last">This function is still available, but you’re strongly encouraged to remove its usage sooner
1004rather than later.</p>
1005</div>
1006</div>
1007<div class="section" id="form-helper-form-prep">
1008<h3>Form helper form_prep()<a class="headerlink" href="#form-helper-form-prep" title="Permalink to this headline"></a></h3>
1009<p><a class="reference internal" href="../helpers/form_helper.html"><span class="doc">Form Helper</span></a> function <a class="reference internal" href="../helpers/form_helper.html#form_prep" title="form_prep"><code class="xref php php-func docutils literal"><span class="pre">form_prep()</span></code></a>
1010is now just an alias for <a class="reference internal" href="../general/common_functions.html"><span class="doc">common function</span></a>
1011<code class="xref py py-func docutils literal"><span class="pre">html_escape()</span></code>. It is deprecated and will be removed in the future.</p>
1012<p>Please use <a class="reference internal" href="../general/common_functions.html#html_escape" title="html_escape"><code class="xref php php-func docutils literal"><span class="pre">html_escape()</span></code></a> instead.</p>
1013<div class="admonition note">
1014<p class="first admonition-title">Note</p>
1015<p class="last">This function is still available, but you’re strongly encouraged
1016to remove its usage sooner rather than later.</p>
1017</div>
1018</div>
1019<div class="section" id="email-helper-functions">
1020<h3>Email helper functions<a class="headerlink" href="#email-helper-functions" title="Permalink to this headline"></a></h3>
1021<p><a class="reference internal" href="../helpers/email_helper.html"><span class="doc">Email Helper</span></a> only has two functions</p>
1022<blockquote>
1023<div><ul class="simple">
1024<li><a class="reference internal" href="../helpers/email_helper.html#valid_email" title="valid_email"><code class="xref php php-func docutils literal"><span class="pre">valid_email()</span></code></a></li>
1025<li><a class="reference internal" href="../helpers/email_helper.html#send_email" title="send_email"><code class="xref php php-func docutils literal"><span class="pre">send_email()</span></code></a></li>
1026</ul>
1027</div></blockquote>
1028<p>Both of them are now aliases for PHP’s native <code class="docutils literal"><span class="pre">filter_var()</span></code> and <code class="docutils literal"><span class="pre">mail()</span></code> functions, respectively.
1029Therefore the <a class="reference internal" href="../helpers/email_helper.html"><span class="doc">Email Helper</span></a> altogether is being deprecated and
1030is scheduled for removal in CodeIgniter 3.1+.</p>
1031<div class="admonition note">
1032<p class="first admonition-title">Note</p>
1033<p class="last">These functions are still available, but you’re strongly encouraged to remove their usage
1034sooner rather than later.</p>
1035</div>
1036</div>
1037<div class="section" id="date-helper-standard-date">
1038<h3>Date helper standard_date()<a class="headerlink" href="#date-helper-standard-date" title="Permalink to this headline"></a></h3>
1039<p><a class="reference internal" href="../helpers/date_helper.html"><span class="doc">Date Helper</span></a> function <code class="docutils literal"><span class="pre">standard_date()</span></code> is being deprecated due
1040to the availability of native PHP <a class="reference external" href="http://php.net/manual/en/class.datetime.php#datetime.constants.types">constants</a>,
1041which when combined with <code class="docutils literal"><span class="pre">date()</span></code> provide the same functionality. Furthermore, they have the
1042exact same names as the ones supported by <code class="docutils literal"><span class="pre">standard_date()</span></code>. Here are examples of how to replace
1043its usage:</p>
1044<div class="highlight-ci"><div class="highlight"><pre><span></span><span class="c1">// Old way</span>
1045<span class="nx">standard_date</span><span class="p">();</span> <span class="c1">// defaults to standard_date(&#39;DATE_RFC822&#39;, now());</span>
1046
1047<span class="c1">// Replacement</span>
1048<span class="nb">date</span><span class="p">(</span><span class="nx">DATE_RFC822</span><span class="p">,</span> <span class="nx">now</span><span class="p">());</span>
1049
1050<span class="c1">// Old way</span>
1051<span class="nx">standard_date</span><span class="p">(</span><span class="s1">&#39;DATE_ATOM&#39;</span><span class="p">,</span> <span class="nv">$time</span><span class="p">);</span>
1052
1053<span class="c1">// Replacement</span>
1054<span class="nb">date</span><span class="p">(</span><span class="nx">DATE_ATOM</span><span class="p">,</span> <span class="nv">$time</span><span class="p">);</span>
1055</pre></div>
1056</div>
1057<div class="admonition note">
1058<p class="first admonition-title">Note</p>
1059<p class="last">This function is still available, but you’re strongly encouraged to remove its usage sooner
1060rather than later as it is scheduled for removal in CodeIgniter 3.1+.</p>
1061</div>
1062</div>
1063<div class="section" id="html-helpers-nbs-br">
1064<h3>HTML helpers nbs(), br()<a class="headerlink" href="#html-helpers-nbs-br" title="Permalink to this headline"></a></h3>
1065<p><a class="reference internal" href="../helpers/html_helper.html"><span class="doc">HTML Helper</span></a> functions <code class="docutils literal"><span class="pre">nbs()</span></code> and <code class="docutils literal"><span class="pre">br()</span></code> are just aliases
1066for the native <code class="docutils literal"><span class="pre">str_repeat()</span></code> function used with <code class="docutils literal"><span class="pre">&amp;nbsp;</span></code> and <code class="docutils literal"><span class="pre">&lt;br</span> <span class="pre">&gt;</span></code> respectively.</p>
1067<p>Because there’s no point in just aliasing native PHP functions, they are now deprecated and
1068scheduled for removal in CodeIgniter 3.1+.</p>
1069<div class="admonition note">
1070<p class="first admonition-title">Note</p>
1071<p class="last">These functions are still available, but you’re strongly encouraged to remove their usage
1072sooner rather than later.</p>
1073</div>
1074</div>
1075<div class="section" id="pagination-library-anchor-class-setting">
1076<h3>Pagination library ‘anchor_class’ setting<a class="headerlink" href="#pagination-library-anchor-class-setting" title="Permalink to this headline"></a></h3>
1077<p>The <a class="reference internal" href="../libraries/pagination.html"><span class="doc">Pagination Library</span></a> now supports adding pretty much any HTML
1078attribute to your anchors via the ‘attributes’ configuration setting. This includes passing the
1079‘class’ attribute and using the separate ‘anchor_class’ setting no longer makes sense.
1080As a result of that, the ‘anchor_class’ setting is now deprecated and scheduled for removal in
1081CodeIgniter 3.1+.</p>
1082<div class="admonition note">
1083<p class="first admonition-title">Note</p>
1084<p class="last">This setting is still available, but you’re strongly encouraged to remove its usage sooner
1085rather than later.</p>
1086</div>
1087</div>
1088<div class="section" id="string-helper-random-string-types-unique-and-encrypt">
1089<h3>String helper random_string() types ‘unique’ and ‘encrypt’<a class="headerlink" href="#string-helper-random-string-types-unique-and-encrypt" title="Permalink to this headline"></a></h3>
1090<p>When using the <a class="reference internal" href="../helpers/string_helper.html"><span class="doc">String Helper</span></a> function <a class="reference internal" href="../helpers/string_helper.html#random_string" title="random_string"><code class="xref php php-func docutils literal"><span class="pre">random_string()</span></code></a>,
1091you should no longer pass the <strong>unique</strong> and <strong>encrypt</strong> randomization types. They are only
1092aliases for <strong>md5</strong> and <strong>sha1</strong> respectively and are now deprecated and scheduled for removal
1093in CodeIgniter 3.1+.</p>
1094<div class="admonition note">
1095<p class="first admonition-title">Note</p>
1096<p class="last">These options are still available, but you’re strongly encouraged to remove their usage
1097sooner rather than later.</p>
1098</div>
1099</div>
1100<div class="section" id="url-helper-url-title-separators-dash-and-underscore">
1101<h3>URL helper url_title() separators ‘dash’ and ‘underscore’<a class="headerlink" href="#url-helper-url-title-separators-dash-and-underscore" title="Permalink to this headline"></a></h3>
1102<p>When using the <a class="reference internal" href="../helpers/url_helper.html"><span class="doc">URL Helper</span></a> function <a class="reference internal" href="../helpers/url_helper.html#url_title" title="url_title"><code class="xref php php-func docutils literal"><span class="pre">url_title()</span></code></a>, you
1103should no longer pass <strong>dash</strong> or <strong>underscore</strong> as the word separator. This function will
1104now accept any character and you should just pass the chosen character directly, so you
1105should write ‘-‘ instead of ‘dash’ and ‘_’ instead of ‘underscore’.</p>
1106<p><strong>dash</strong> and <strong>underscore</strong> now act as aliases and are deprecated and scheduled for removal
1107in CodeIgniter 3.1+.</p>
1108<div class="admonition note">
1109<p class="first admonition-title">Note</p>
1110<p class="last">These options are still available, but you’re strongly encouraged to remove their usage
1111sooner rather than later.</p>
1112</div>
1113</div>
1114<div class="section" id="session-library-method-all-userdata">
1115<h3>Session Library method all_userdata()<a class="headerlink" href="#session-library-method-all-userdata" title="Permalink to this headline"></a></h3>
1116<p>As seen in the <a class="reference internal" href="../changelog.html"><span class="doc">Change Log</span></a>, <a class="reference internal" href="../libraries/sessions.html"><span class="doc">Session Library</span></a>
1117method <code class="docutils literal"><span class="pre">userdata()</span></code> now allows you to fetch all userdata by simply omitting its parameter:</p>
1118<div class="highlight-ci"><div class="highlight"><pre><span></span><span class="nv">$this</span><span class="o">-&gt;</span><span class="na">session</span><span class="o">-&gt;</span><span class="na">userdata</span><span class="p">();</span>
1119</pre></div>
1120</div>
1121<p>This makes the <code class="docutils literal"><span class="pre">all_userdata()</span></code> method redudant and therefore it is now just an alias for
1122<code class="docutils literal"><span class="pre">userdata()</span></code> with the above shown usage and is being deprecated and scheduled for removal
1123in CodeIgniter 3.1+.</p>
1124<div class="admonition note">
1125<p class="first admonition-title">Note</p>
1126<p class="last">This method is still available, but you’re strongly encouraged to remove its usage
1127sooner rather than later.</p>
1128</div>
1129</div>
1130<div class="section" id="database-forge-method-add-column-with-an-after-clause">
1131<h3>Database Forge method add_column() with an AFTER clause<a class="headerlink" href="#database-forge-method-add-column-with-an-after-clause" title="Permalink to this headline"></a></h3>
1132<p>If you have used the <strong>third parameter</strong> for <a class="reference internal" href="../database/forge.html"><span class="doc">Database Forge</span></a> method
1133<code class="docutils literal"><span class="pre">add_column()</span></code> to add a field for an AFTER clause, then you should change its usage.</p>
1134<p>That third parameter has been deprecated and scheduled for removal in CodeIgniter 3.1+.</p>
1135<p>You should now put AFTER clause field names in the field definition array instead:</p>
1136<div class="highlight-ci"><div class="highlight"><pre><span></span><span class="c1">// Old usage:</span>
1137<span class="nv">$field</span> <span class="o">=</span> <span class="k">array</span><span class="p">(</span>
1138 <span class="s1">&#39;new_field&#39;</span> <span class="o">=&gt;</span> <span class="k">array</span><span class="p">(</span><span class="s1">&#39;type&#39;</span> <span class="o">=&gt;</span> <span class="s1">&#39;TEXT&#39;</span><span class="p">)</span>
1139<span class="p">);</span>
1140
1141<span class="nv">$this</span><span class="o">-&gt;</span><span class="na">dbforge</span><span class="o">-&gt;</span><span class="na">add_column</span><span class="p">(</span><span class="s1">&#39;table_name&#39;</span><span class="p">,</span> <span class="nv">$field</span><span class="p">,</span> <span class="s1">&#39;another_field&#39;</span><span class="p">);</span>
1142
1143<span class="c1">// New usage:</span>
1144<span class="nv">$field</span> <span class="o">=</span> <span class="k">array</span><span class="p">(</span>
1145 <span class="s1">&#39;new_field&#39;</span> <span class="o">=&gt;</span> <span class="k">array</span><span class="p">(</span><span class="s1">&#39;type&#39;</span> <span class="o">=&gt;</span> <span class="s1">&#39;TEXT&#39;</span><span class="p">,</span> <span class="s1">&#39;after&#39;</span> <span class="o">=&gt;</span> <span class="s1">&#39;another_field&#39;</span><span class="p">)</span>
1146<span class="p">);</span>
1147
1148<span class="nv">$this</span><span class="o">-&gt;</span><span class="na">dbforge</span><span class="o">-&gt;</span><span class="na">add_column</span><span class="p">(</span><span class="s1">&#39;table_name&#39;</span><span class="p">,</span> <span class="nv">$field</span><span class="p">);</span>
1149</pre></div>
1150</div>
1151<div class="admonition note">
1152<p class="first admonition-title">Note</p>
1153<p class="last">The parameter is still available, but you’re strongly encouraged to remove its usage
1154sooner rather than later.</p>
1155</div>
1156<div class="admonition note">
1157<p class="first admonition-title">Note</p>
1158<p class="last">This is for MySQL and CUBRID databases only! Other drivers don’t support this
1159clause and will silently ignore it.</p>
1160</div>
1161</div>
1162<div class="section" id="uri-routing-methods-fetch-directory-fetch-class-fetch-method">
1163<h3>URI Routing methods fetch_directory(), fetch_class(), fetch_method()<a class="headerlink" href="#uri-routing-methods-fetch-directory-fetch-class-fetch-method" title="Permalink to this headline"></a></h3>
1164<p>With properties <code class="docutils literal"><span class="pre">CI_Router::$directory</span></code>, <code class="docutils literal"><span class="pre">CI_Router::$class</span></code> and <code class="docutils literal"><span class="pre">CI_Router::$method</span></code>
1165being public and their respective <code class="docutils literal"><span class="pre">fetch_*()</span></code> no longer doing anything else to just return
1166the properties - it doesn’t make sense to keep them.</p>
1167<p>Those are all internal, undocumented methods, but we’ve opted to deprecate them for now
1168in order to maintain backwards-compatibility just in case. If some of you have utilized them,
1169then you can now just access the properties instead:</p>
1170<div class="highlight-ci"><div class="highlight"><pre><span></span><span class="nv">$this</span><span class="o">-&gt;</span><span class="na">router</span><span class="o">-&gt;</span><span class="na">directory</span><span class="p">;</span>
1171<span class="nv">$this</span><span class="o">-&gt;</span><span class="na">router</span><span class="o">-&gt;</span><span class="na">class</span><span class="p">;</span>
1172<span class="nv">$this</span><span class="o">-&gt;</span><span class="na">router</span><span class="o">-&gt;</span><span class="na">method</span><span class="p">;</span>
1173</pre></div>
1174</div>
1175<div class="admonition note">
1176<p class="first admonition-title">Note</p>
1177<p class="last">Those methods are still available, but you’re strongly encouraged to remove their usage
1178sooner rather than later.</p>
1179</div>
1180</div>
1181<div class="section" id="input-library-method-is-cli-request">
1182<h3>Input library method is_cli_request()<a class="headerlink" href="#input-library-method-is-cli-request" title="Permalink to this headline"></a></h3>
1183<p>Calls to the <code class="docutils literal"><span class="pre">CI_Input::is_cli_request()</span></code> method are necessary at many places
1184in the CodeIgniter internals and this is often before the <a class="reference internal" href="../libraries/input.html"><span class="doc">Input Library</span></a> is loaded. Because of that, it is being replaced by a common
1185function named <a class="reference internal" href="../general/common_functions.html#is_cli" title="is_cli"><code class="xref php php-func docutils literal"><span class="pre">is_cli()</span></code></a> and this method is now just an alias.</p>
1186<p>The new function is both available at all times for you to use and shorter to type.</p>
1187<div class="highlight-ci"><div class="highlight"><pre><span></span><span class="c1">// Old</span>
1188<span class="nv">$this</span><span class="o">-&gt;</span><span class="na">input</span><span class="o">-&gt;</span><span class="na">is_cli_request</span><span class="p">();</span>
1189
1190<span class="c1">// New</span>
1191<span class="nx">is_cli</span><span class="p">();</span>
1192</pre></div>
1193</div>
1194<p><code class="docutils literal"><span class="pre">CI_Input::is_cli_request()</span></code> is now now deprecated and scheduled for removal in
1195CodeIgniter 3.1+.</p>
1196<div class="admonition note">
1197<p class="first admonition-title">Note</p>
1198<p class="last">This method is still available, but you’re strongly encouraged to remove its usage
1199sooner rather than later.</p>
1200</div>
1201</div>
1202<div class="section" id="config-library-method-system-url">
1203<h3>Config library method system_url()<a class="headerlink" href="#config-library-method-system-url" title="Permalink to this headline"></a></h3>
1204<p>Usage of <code class="docutils literal"><span class="pre">CI_Config::system_url()</span></code> encourages insecure coding practices.
1205Namely, your CodeIgniter <em>system/</em> directory shouldn’t be publicly accessible
1206from a security point of view.</p>
1207<p>Because of this, this method is now deprecated and scheduled for removal in
1208CodeIgniter 3.1+.</p>
1209<div class="admonition note">
1210<p class="first admonition-title">Note</p>
1211<p class="last">This method is still available, but you’re strongly encouraged to remove its usage
1212sooner rather than later.</p>
1213</div>
1214</div>
1215<div class="section" id="the-javascript-library">
1216<h3>The Javascript library<a class="headerlink" href="#the-javascript-library" title="Permalink to this headline"></a></h3>
1217<p>The <a class="reference internal" href="../libraries/javascript.html"><span class="doc">Javascript Library</span></a> has always had an
1218‘experimental’ status and was never really useful, nor a proper solution.</p>
1219<p>It is now deprecated and scheduled for removal in CodeIgniter 3.1+.</p>
1220<div class="admonition note">
1221<p class="first admonition-title">Note</p>
1222<p class="last">This library is still available, but you’re strongly encouraged to remove its usage
1223sooner rather than later.</p>
1224</div>
1225</div>
1226<div class="section" id="form-validation-method-prep-for-form">
1227<h3>Form Validation method prep_for_form()<a class="headerlink" href="#form-validation-method-prep-for-form" title="Permalink to this headline"></a></h3>
1228<p>The <a class="reference internal" href="../libraries/form_validation.html"><span class="doc">Form Validation Library</span></a> has a
1229<code class="docutils literal"><span class="pre">prep_for_form()</span></code> method, which is/can also be used as a rule in
1230<code class="docutils literal"><span class="pre">set_rules()</span></code> to automatically perform HTML encoding on input data.</p>
1231<p>Automatically encoding input (instead of output) data is a bad practice in
1232the first place, and CodeIgniter and PHP itself offer other alternatives
1233to this method anyway.
1234For example, <a class="reference internal" href="../helpers/form_helper.html"><span class="doc">Form Helper</span></a> functions will
1235automatically perform HTML escaping when necessary.</p>
1236<p>Therefore, the <em>prep_for_form</em> method/rule is pretty much useless and is now
1237deprecated and scheduled for removal in 3.1+.</p>
1238<div class="admonition note">
1239<p class="first admonition-title">Note</p>
1240<p class="last">The method is still available, but you’re strongly encouraged to
1241remove its usage sooner rather than later.</p>
1242</div>
1243</div>
1244</div>
1245<div class="section" id="step-21-check-your-usage-of-text-helper-highlight-phrase">
1246<h2>Step 21: Check your usage of Text helper highlight_phrase()<a class="headerlink" href="#step-21-check-your-usage-of-text-helper-highlight-phrase" title="Permalink to this headline"></a></h2>
1247<p>The default HTML tag used by <a class="reference internal" href="../helpers/text_helper.html"><span class="doc">Text Helper</span></a> function
1248<code class="xref py py-func docutils literal"><span class="pre">highlight_phrase()</span></code> has been changed from <code class="docutils literal"><span class="pre">&lt;strong&gt;</span></code> to the new HTML5
1249tag <code class="docutils literal"><span class="pre">&lt;mark&gt;</span></code>.</p>
1250<p>Unless you’ve used your own highlighting tags, this might cause trouble
1251for your visitors who use older web browsers such as Internet Explorer 8.
1252We therefore suggest that you add the following code to your CSS files
1253in order to avoid backwards compatibility with old browsers:</p>
1254<div class="highlight-ci"><div class="highlight"><pre><span></span><span class="nx">mark</span> <span class="p">{</span>
1255 <span class="nx">background</span><span class="o">:</span> <span class="c1">#ff0;</span>
1256 <span class="nx">color</span><span class="o">:</span> <span class="c1">#000;</span>
1257<span class="p">};</span>
1258</pre></div>
1259</div>
1260</div>
1261</div>
1262
1263
1264 </div>
1265 <footer>
1266
1267 <div class="rst-footer-buttons" role="navigation" aria-label="footer navigation">
1268
1269 <a href="upgrade_223.html" class="btn btn-neutral float-right" title="Upgrading from 2.2.2 to 2.2.3">Next <span class="fa fa-arrow-circle-right"></span></a>
1270
1271
1272 <a href="upgrade_301.html" class="btn btn-neutral" title="Upgrading from 3.0.0 to 3.0.1"><span class="fa fa-arrow-circle-left"></span> Previous</a>
1273
1274 </div>
1275
1276
1277 <hr/>
1278
1279 <div role="contentinfo">
1280 <p>
1281 &copy; Copyright 2014 - 2019, British Columbia Institute of Technology.
1282 Last updated on Jan 16, 2019.
1283 </p>
1284 </div>
1285
1286 Built with <a href="http://sphinx-doc.org/">Sphinx</a> using a <a href="https://github.com/snide/sphinx_rtd_theme">theme</a> provided by <a href="https://readthedocs.org">Read the Docs</a>.
1287
1288</footer>
1289 </div>
1290 </div>
1291
1292 </section>
1293
1294 </div>
1295
1296
1297
1298
1299
1300 <script type="text/javascript">
1301 var DOCUMENTATION_OPTIONS = {
1302 URL_ROOT:'../',
1303 VERSION:'3.1.10',
1304 COLLAPSE_INDEX:false,
1305 FILE_SUFFIX:'.html',
1306 HAS_SOURCE: false
1307 };
1308 </script>
1309 <script type="text/javascript" src="../_static/jquery.js"></script>
1310 <script type="text/javascript" src="../_static/underscore.js"></script>
1311 <script type="text/javascript" src="../_static/doctools.js"></script>
1312
1313
1314
1315
1316
1317 <script type="text/javascript" src="../_static/js/theme.js"></script>
1318
1319
1320
1321
1322 <script type="text/javascript">
1323 jQuery(function () {
1324 SphinxRtdTheme.StickyNav.enable();
1325 });
1326 </script>
1327
1328
1329</body>
1330</html>