Upgrading from 2.2.x to 3.0.x
*****************************

Before performing an update you should take your site offline by
replacing the index.php file with a static one.


Step 1: Update your CodeIgniter files
=====================================

**Replace** all files and directories in your *system/* directory and
replace your index.php file. If any modifications were made to your
index.php they will need to be made fresh in this new one.

Important:

  You have to delete the old *system/* directory first and then put
  the new one in its place. A simple copy-paste may cause issues.

Note:

  If you have any custom developed files in these folders please make
  copies of them first.


Step 2: Update your classes file names
======================================

Starting with CodeIgniter 3.0, all class filenames (libraries,
drivers, controllers and models) must be named in a Ucfirst-like
manner or in other words - they must start with a capital letter.

For example, if you have the following library file:

   application/libraries/mylibrary.php

… then you’ll have to rename it to:

   application/libraries/Mylibrary.php

The same goes for driver libraries and extensions and/or overrides of
CodeIgniter’s own libraries and core classes.

   application/libraries/MY_email.php application/core/MY_log.php

The above files should respectively be renamed to the following:

   application/libraries/MY_Email.php application/core/MY_Log.php

Controllers:

   application/controllers/welcome.php     ->
   application/controllers/Welcome.php

Models:

   application/models/misc_model.php       ->
   application/models/Misc_model.php

Please note that this DOES NOT affect directories, configuration
files, views, helpers, hooks and anything else - it is only applied to
classes.

You must now follow just one simple rule - class names in Ucfirst and
everything else in lowercase.


Step 3: Replace config/mimes.php
================================

This config file has been updated to contain more user mime-types,
please copy it to *application/config/mimes.php*.


Step 4: Remove $autoload[‘core’] from your config/autoload.php
==============================================================

Use of the "$autoload['core']" config array has been deprecated as of
CodeIgniter 1.4.1 and is now removed. Move any entries that you might
have listed there to "$autoload['libraries']" instead.


Step 5: Move your Log class overrides or extensions
===================================================

The Log Class is considered as a “core” class and is now located in
the **system/core/** directory. Therefore, in order for your Log class
overrides or extensions to work, you need to move them to
**application/core/**:

   application/libraries/Log.php -> application/core/Log.php
   application/libraries/MY_Log.php -> application/core/MY_Log.php


Step 6: Update your Session library usage
=========================================

The Session Library has been completely re-written in CodeIgniter 3
and now comes with a bunch of new features, but that also means that
there are changes that you should make …

Most notably, the library now uses separate storage drivers instead of
always relying on (encrypted) cookies. In fact, cookies as storage
have now been removed and you must always use some kind of server-side
storage engine, with the file-system being the default option.

The Session Class now utilizes PHP’s own mechanisms for building
custom session handlers, which also means that your session data is
now accessible via the "$_SESSION" superglobal (though, we’ve kept the
possibility to use it as “userdata”, like you’ve done until now).

A few configuration options have been removed and a few have been
added. You should really read the whole Session library manual for the
details, but here’s a short list of changes that you should make:

   * Set your "$config['sess_driver']" value

     It will default to ‘files’, unless you’ve previously used
     "$config['sess_use_database']", in which case it will be set to
     ‘database’.

   * Set a "$config['sess_save_path']" value

     For the ‘database’ driver, a fallback to
     "$config['sess_table_name']" is in place, but otherwise requires
     you to read the manual for the specific driver of your choice.

   * Update your "ci_sessions" table (‘database’ driver only)

     The table structure has changed a bit, and more specifically:

        * "session_id" field is renamed to "id"

        * "user_agent" field is dropped

        * "user_data" field is renamed to "data" and under MySQL is
          now of type BLOB

        * "last_activity" field is renamed to "timestamp"

     This is accompanied by a slight change in the table indexes too,
     so please read the manual about the Session Database Driver for
     more information.

     Important:

       Only MySQL and PostgreSQL are officially supported now. Other
       databases may still work, but due to lack of advisory locking
       features, they are unsafe for concurrent requests and you
       should consider using another driver instead.

   * Remove "$config['sess_match_useragent']"

     The user-agent string is input supplied by the user’s browser, or
     in other words: client side input. As such, it is an ineffective
     feature and hence why it has been removed.

   * Remove "$config['sess_encrypt_cookie']"

     As already noted, the library no longer uses cookies as a storage
     mechanism, which renders this option useless.

   * Remove "$config['sess_expire_on_close']"

     This option is still usable, but only for backwards compatibility
     purposes and it should be otherwise removed. The same effect is
     achieved by setting "$config['sess_expiration']" to 0.

   * Check “flashdata” for collisions with “userdata”

     Flashdata is now just regular “userdata”, only marked for
     deletion on the next request. In other words: you can’t have both
     “userdata” and “flashdata” with the same name, because it’s the
     same thing.

   * Check usage of session metadata

     Previously, you could access the ‘session_id’, ‘ip_address’,
     ‘user_agent’ and ‘last_activity’ metadata items as userdata. This
     is no longer possible, and you should read the notes about
     Session Metadata if your application relies on those values.

   * Check "unset_userdata()" usage

     Previously, this method used to accept an associative array of
     "'key' => 'dummy value'" pairs for unsetting multiple keys. That
     however makes no sense and you now have to pass *only* the keys,
     as the elements of an array.

        // Old
        $this->session->unset_userdata(array('item' => '', 'item2' => ''));

        // New
        $this->session->unset_userdata(array('item', 'item2'));

Finally, if you have written a Session extension, you must now move it
to the *application/libraries/Session/* directory, although chances
are that it will now also have to be re-factored.


Step 7: Update your config/database.php
=======================================

Due to 3.0.0’s renaming of Active Record to Query Builder, inside your
**config/database.php**, you will need to rename the "$active_record"
variable to "$query_builder":

   $active_group = 'default';
   // $active_record = TRUE;
   $query_builder = TRUE;


Step 8: Replace your error templates
====================================

In CodeIgniter 3.0, the error templates are now considered as views
and have been moved to the *application/views/errors* directory.

Furthermore, we’ve added support for CLI error templates in plain-text
format that unlike HTML, is suitable for the command line. This of
course requires another level of separation.

It is safe to move your old templates from *application/errors* to
*application/views/errors/html*, but you’ll have to copy the new
*application/views/errors/cli* directory from the CodeIgniter archive.


Step 9: Update your config/routes.php file
==========================================


Routes containing :any
----------------------

Historically, CodeIgniter has always provided the **:any** wildcard in
routing, with the intention of providing a way to match any character
**within** an URI segment.

However, the **:any** wildcard is actually just an alias for a regular
expression and used to be executed in that manner as **.+**. This is
considered a bug, as it also matches the / (forward slash) character,
which is the URI segment delimiter and that was never the intention.

In CodeIgniter 3, the **:any** wildcard will now represent **[^/]+**,
so that it will not match a forward slash.

There are certainly many developers that have utilized this bug as an
actual feature. If you’re one of them and want to match a forward
slash, please use the **.+** regular expression:

   (.+)    // matches ANYTHING
   (:any)  // matches any character, except for '/'


Directories and ‘default_controller’, ‘404_override’
----------------------------------------------------

As you should know, the "$route['default_controller']" and
"$route['404_override']" settings accept not only a controller name,
but also *controller/method* pairs. However, a bug in the routing
logic has made it possible for some users to use that as
*directory/controller* instead.

As already said, this behavior was incidental and was never intended,
nor documented. If you’ve relied on it, your application will break
with CodeIgniter 3.0.

Another notable change in version 3 is that ‘default_controller’ and
‘404_override’ are now applied *per directory*. To explain what this
means, let’s take the following example:

   $route['default_controller'] = 'main';

Now, assuming that your website is located at *example.com*, you
already know that if a user visits "http://example.com/", the above
setting will cause your ‘Main’ controller to be loaded.

However, what happens if you have an *application/controllers/admin/*
directory and the user visits "http://example.com/admin/"? In
CodeIgniter 3, the router will look for a ‘Main’ controller under the
admin/ directory as well. If not found, a Not Found (404) will be
triggered.

The same rule applies to the ‘404_override’ setting.


Step 10: Many functions now return NULL instead of FALSE on missing items
=========================================================================

Many methods and functions now return NULL instead of FALSE when the
required items don’t exist:

   * Common functions

     * config_item()

   * Config Class

     * config->item()

     * config->slash_item()

   * Input Class

     * input->get()

     * input->post()

     * input->get_post()

     * input->cookie()

     * input->server()

     * input->input_stream()

     * input->get_request_header()

   * Session Class

     * session->userdata()

     * session->flashdata()

   * URI Class

     * uri->segment()

     * uri->rsegment()

   * Array Helper

     * element()

     * elements()


Step 11: Usage of XSS filtering
===============================

Many functions in CodeIgniter allow you to use its XSS filtering
feature on demand by passing a boolean parameter. The default value of
that parameter used to be boolean FALSE, but it is now changed to NULL
and it will be dynamically determined by your
"$config['global_xss_filtering']" value.

If you used to manually pass a boolean value for the "$xss_filter"
parameter or if you’ve always had "$config['global_xss_filtering']"
set to FALSE, then this change doesn’t concern you.

Otherwise however, please review your usage of the following
functions:

   * Input Library

     * input->get()

     * input->post()

     * input->get_post()

     * input->cookie()

     * input->server()

     * input->input_stream()

   * Cookie Helper "get_cookie()"

Important:

  Another related change is that the "$_GET", "$_POST", "$_COOKIE" and
  "$_SERVER" superglobals are no longer automatically overwritten when
  global XSS filtering is turned on.


Step 12: Check for potential XSS issues with URIs
=================================================

The URI Library used to automatically convert a certain set of
“programmatic characters” to HTML entities when they are encountered
in a URI segment.

This was aimed at providing some automatic XSS protection, in addition
to the "$config['permitted_uri_chars']" setting, but has proven to be
problematic and is now removed in CodeIgniter 3.0.

If your application has relied on this feature, you should update it
to filter URI segments through "$this->security->xss_clean()" whenever
you output them.


Step 13: Check for usage of the ‘xss_clean’ Form validation rule
================================================================

A largely unknown rule about XSS cleaning is that it should *only be
applied to output*, as opposed to input data.

We’ve made that mistake ourselves with our automatic and global XSS
cleaning feature (see previous step about XSS above), so now in an
effort to discourage that practice, we’re also removing ‘xss_clean’
from the officially supported list of form validation rules.

Because the Form Validation library generally validates *input* data,
the ‘xss_clean’ rule simply doesn’t belong in it.

If you really, really need to apply that rule, you should now also
load the Security Helper, which contains "xss_clean()" as a regular
function and therefore can be also used as a validation rule.


Step 14: Update usage of Input Class’s get_post() method
========================================================

Previously, the Input Class method "get_post()" was searching first in
POST data, then in GET data. This method has been modified so that it
searches in GET then in POST, as its name suggests.

A method has been added, "post_get()", which searches in POST then in
GET, as "get_post()" was doing before.


Step 15: Update usage of Directory Helper’s directory_map() function
====================================================================

In the resulting array, directories now end with a trailing directory
separator (i.e. a slash, usually).


Step 16: Update usage of Database Forge’s drop_table() method
=============================================================

Up until now, "drop_table()" added an IF EXISTS clause by default or
it didn’t work at all with some drivers. In CodeIgniter 3.0, the IF
EXISTS condition is no longer added by default and has an optional
second parameter that allows that instead and is set to FALSE by
default.

If your application relies on IF EXISTS, you’ll have to change its
usage.

   // Now produces just DROP TABLE `table_name`
   $this->dbforge->drop_table('table_name');

   // Produces DROP TABLE IF EXISTS `table_name`
   $this->dbforge->drop_table('table_name', TRUE);

Note:

  The given example uses MySQL-specific syntax, but it should work
  across all drivers with the exception of ODBC.


Step 17: Change usage of Email library with multiple emails
===========================================================

The Email Library will automatically clear the set parameters after
successfully sending emails. To override this behaviour, pass FALSE as
the first parameter in the "send()" method:

   if ($this->email->send(FALSE))
   {
           // Parameters won't be cleared
   }


Step 18: Update your Form_validation language lines
===================================================

Two improvements have been made to the Form Validation Library’s
language files and error messages format:

   * Language Library line keys now must be prefixed with
     **form_validation_** in order to avoid collisions:

        // Old
        $lang['rule'] = ...

        // New
        $lang['form_validation_rule'] = ...

   * The error messages format has been changed to use named
     parameters, to allow more flexibility than what *sprintf()*
     offers:

        // Old
        'The %s field does not match the %s field.'

        // New
        'The {field} field does not match the {param} field.'

Note:

  The old formatting still works, but the non-prefixed line keys are
  DEPRECATED and scheduled for removal in CodeIgniter 3.1+. Therefore
  you’re encouraged to update its usage sooner rather than later.


Step 19: Make sure your ‘base_url’ config value is not empty
============================================================

When "$config['base_url']" is not set, CodeIgniter tries to
automatically detect what your website’s base URL is. This is done
purely for convenience when you are starting development of a new
application.

Auto-detection is never reliable and also has security implications,
which is why you should **always** have it manually configured!

One of the changes in CodeIgniter 3.0.3 is how this auto-detection
works, and more specifically it now falls back to the server’s IP
address instead of the hostname requested by the client. Therefore, if
you’ve ever relied on auto-detection, it will change how your website
works now.

In case you need to allow e.g. multiple domains, or both http:// and
https:// prefixes to be dynamically used depending on the request,
remember that *application/config/config.php* is still a PHP script,
in which you can create this logic with a few lines of code. For
example:

   $allowed_domains = array('domain1.tld', 'domain2.tld');
   $default_domain  = 'domain1.tld';

   if (in_array($_SERVER['HTTP_HOST'], $allowed_domains, TRUE))
   {
           $domain = $_SERVER['HTTP_HOST'];
   }
   else
   {
           $domain = $default_domain;
   }

   if ( ! empty($_SERVER['HTTPS']))
   {
           $config['base_url'] = 'https://'.$domain;
   }
   else
   {
           $config['base_url'] = 'http://'.$domain;
   }


Step 20: Remove usage of (previously) deprecated functionalities
================================================================

In addition to the "$autoload['core']" configuration setting, there’s
a number of other functionalities that have been removed in
CodeIgniter 3.0.0:


The SHA1 library
----------------

The previously deprecated SHA1 library has been removed, alter your
code to use PHP’s native "sha1()" function to generate a SHA1 hash.

Additionally, the "sha1()" method in the Encrypt Library has been
removed.


The EXT constant
----------------

Usage of the "EXT" constant has been deprecated since dropping support
for PHP 4. There’s no longer a need to maintain different filename
extensions and in this new CodeIgniter version, the "EXT" constant has
been removed. Use just ‘.php’ instead.


Smiley helper
-------------

The Smiley Helper is a legacy feature from EllisLab’s ExpressionEngine
product. However, it is too specific for a general purpose framework
like CodeIgniter and as such it is now deprecated.

Also, the previously deprecated "js_insert_smiley()" (since version
1.7.2) is now removed.


The Encrypt library
-------------------

Following numerous vulnerability reports, the Encrypt Library has been
deprecated and a new, Encryption Library is added to take its place.

The new library requires either the MCrypt extension (and /dev/urandom
availability) or PHP 5.3.3 and the OpenSSL extension. While this might
be rather inconvenient, it is a requirement that allows us to have
properly implemented cryptographic functions.

Note:

  The Encrypt Library is still available for the purpose of keeping
  backwards compatibility.

Important:

  You are strongly encouraged to switch to the new Encryption Library
  as soon as possible!


The Cart library
----------------

The Cart Library, similarly to the Smiley Helper is too specific for
CodeIgniter. It is now deprecated and scheduled for removal in
CodeIgniter 3.1+.

Note:

  The library is still available, but you’re strongly encouraged to
  remove its usage sooner rather than later.


Database drivers ‘mysql’, ‘sqlite’, ‘mssql’, ‘pdo/dblib’
--------------------------------------------------------

The **mysql** driver utilizes the old ‘mysql’ PHP extension, known for
its aging code base and many low-level problems. The extension is
deprecated as of PHP 5.5 and CodeIgniter deprecates it in version 3.0,
switching the default configured MySQL driver to **mysqli**.

Please use either the ‘mysqli’ or ‘pdo/mysql’ drivers for MySQL. The
old ‘mysql’ driver will be removed at some point in the future.

The **sqlite**, **mssql** and **pdo/dblib** (also known as pdo/mssql
or pdo/sybase) drivers all depend on PHP extensions that for different
reasons no longer exist since PHP 5.3.

Therefore we are now deprecating these drivers as we will have to
remove them in one of the next CodeIgniter versions. You should use
the more advanced, **sqlite3**, **sqlsrv** or **pdo/sqlsrv** drivers
respectively.

Note:

  These drivers are still available, but you’re strongly encouraged to
  switch to other ones sooner rather than later.


Security helper do_hash()
-------------------------

Security Helper function "do_hash()" is now just an alias for PHP’s
native "hash()" function. It is deprecated and scheduled for removal
in CodeIgniter 3.1+.

Note:

  This function is still available, but you’re strongly encouraged to
  remove its usage sooner rather than later.


The $config[‘global_xss_filtering’] setting
-------------------------------------------

As already explained above, XSS filtering should not be done on input
data, but on output instead. Therefore, the
"$config['global_xss_filtering']", which automatically filters *input*
data, is considered a bad practice and is now deprecated.

Instead, you should manually escape any user-provided data via the
"xss_clean()" function when you need to output it, or use a library
like HTML Purifier that does that for you.

Note:

  The setting is still available, but you’re strongly encouraged to
  remove its usage sooner rather than later.


File helper read_file()
-----------------------

File Helper function "read_file()" is now just an alias for PHP’s
native "file_get_contents()" function. It is deprecated and scheduled
for removal in CodeIgniter 3.1+.

Note:

  This function is still available, but you’re strongly encouraged to
  remove its usage sooner rather than later.


String helper repeater()
------------------------

String Helper function "repeater()" is now just an alias for PHP’s
native "str_repeat()" function. It is deprecated and scheduled for
removal in CodeIgniter 3.1+.

Note:

  This function is still available, but you’re strongly encouraged to
  remove its usage sooner rather than later.


String helper trim_slashes()
----------------------------

String Helper function "trim_slashes()" is now just an alias for PHP’s
native "trim()" function (with a slash passed as its second argument).
It is deprecated and scheduled for removal in CodeIgniter 3.1+.

Note:

  This function is still available, but you’re strongly encouraged to
  remove its usage sooner rather than later.


Form helper form_prep()
-----------------------

Form Helper function "form_prep()" is now just an alias for common
function "html_escape()". It is deprecated and will be removed in the
future.

Please use "html_escape()" instead.

Note:

  This function is still available, but you’re strongly encouraged to
  remove its usage sooner rather than later.


Email helper functions
----------------------

Email Helper only has two functions

   * "valid_email()"

   * "send_email()"

Both of them are now aliases for PHP’s native "filter_var()" and
"mail()" functions, respectively. Therefore the Email Helper
altogether is being deprecated and is scheduled for removal in
CodeIgniter 3.1+.

Note:

  These functions are still available, but you’re strongly encouraged
  to remove their usage sooner rather than later.


Date helper standard_date()
---------------------------

Date Helper function "standard_date()" is being deprecated due to the
availability of native PHP constants, which when combined with
"date()" provide the same functionality. Furthermore, they have the
exact same names as the ones supported by "standard_date()". Here are
examples of how to replace its usage:

   // Old way
   standard_date(); // defaults to standard_date('DATE_RFC822', now());

   // Replacement
   date(DATE_RFC822, now());

   // Old way
   standard_date('DATE_ATOM', $time);

   // Replacement
   date(DATE_ATOM, $time);

Note:

  This function is still available, but you’re strongly encouraged to
  remove its usage sooner rather than later as it is scheduled for
  removal in CodeIgniter 3.1+.


HTML helpers nbs(), br()
------------------------

HTML Helper functions "nbs()" and "br()" are just aliases for the
native "str_repeat()" function used with "&nbsp;" and "<br >"
respectively.

Because there’s no point in just aliasing native PHP functions, they
are now deprecated and scheduled for removal in CodeIgniter 3.1+.

Note:

  These functions are still available, but you’re strongly encouraged
  to remove their usage sooner rather than later.


Pagination library ‘anchor_class’ setting
-----------------------------------------

The Pagination Library now supports adding pretty much any HTML
attribute to your anchors via the ‘attributes’ configuration setting.
This includes passing the ‘class’ attribute and using the separate
‘anchor_class’ setting no longer makes sense. As a result of that, the
‘anchor_class’ setting is now deprecated and scheduled for removal in
CodeIgniter 3.1+.

Note:

  This setting is still available, but you’re strongly encouraged to
  remove its usage sooner rather than later.


String helper random_string() types ‘unique’ and ‘encrypt’
----------------------------------------------------------

When using the String Helper function "random_string()", you should no
longer pass the **unique** and **encrypt** randomization types. They
are only aliases for **md5** and **sha1** respectively and are now
deprecated and scheduled for removal in CodeIgniter 3.1+.

Note:

  These options are still available, but you’re strongly encouraged to
  remove their usage sooner rather than later.


URL helper url_title() separators ‘dash’ and ‘underscore’
---------------------------------------------------------

When using the URL Helper function "url_title()", you should no longer
pass **dash** or **underscore** as the word separator. This function
will now accept any character and you should just pass the chosen
character directly, so you should write ‘-’ instead of ‘dash’ and ‘_’
instead of ‘underscore’.

**dash** and **underscore** now act as aliases and are deprecated and
scheduled for removal in CodeIgniter 3.1+.

Note:

  These options are still available, but you’re strongly encouraged to
  remove their usage sooner rather than later.


Session Library method all_userdata()
-------------------------------------

As seen in the Change Log, Session Library method "userdata()" now
allows you to fetch all userdata by simply omitting its parameter:

   $this->session->userdata();

This makes the "all_userdata()" method redudant and therefore it is
now just an alias for "userdata()" with the above shown usage and is
being deprecated and scheduled for removal in CodeIgniter 3.1+.

Note:

  This method is still available, but you’re strongly encouraged to
  remove its usage sooner rather than later.


Database Forge method add_column() with an AFTER clause
-------------------------------------------------------

If you have used the **third parameter** for Database Forge method
"add_column()" to add a field for an AFTER clause, then you should
change its usage.

That third parameter has been deprecated and scheduled for removal in
CodeIgniter 3.1+.

You should now put AFTER clause field names in the field definition
array instead:

   // Old usage:
   $field = array(
           'new_field' => array('type' => 'TEXT')
   );

   $this->dbforge->add_column('table_name', $field, 'another_field');

   // New usage:
   $field = array(
           'new_field' => array('type' => 'TEXT', 'after' => 'another_field')
   );

   $this->dbforge->add_column('table_name', $field);

Note:

  The parameter is still available, but you’re strongly encouraged to
  remove its usage sooner rather than later.

Note:

  This is for MySQL and CUBRID databases only! Other drivers don’t
  support this clause and will silently ignore it.


URI Routing methods fetch_directory(), fetch_class(), fetch_method()
--------------------------------------------------------------------

With properties "CI_Router::$directory", "CI_Router::$class" and
"CI_Router::$method" being public and their respective "fetch_*()" no
longer doing anything else to just return the properties - it doesn’t
make sense to keep them.

Those are all internal, undocumented methods, but we’ve opted to
deprecate them for now in order to maintain backwards-compatibility
just in case. If some of you have utilized them, then you can now just
access the properties instead:

   $this->router->directory;
   $this->router->class;
   $this->router->method;

Note:

  Those methods are still available, but you’re strongly encouraged to
  remove their usage sooner rather than later.


Input library method is_cli_request()
-------------------------------------

Calls to the "CI_Input::is_cli_request()" method are necessary at many
places in the CodeIgniter internals and this is often before the Input
Library is loaded. Because of that, it is being replaced by a common
function named "is_cli()" and this method is now just an alias.

The new function is both available at all times for you to use and
shorter to type.

   // Old
   $this->input->is_cli_request();

   // New
   is_cli();

"CI_Input::is_cli_request()" is now now deprecated and scheduled for
removal in CodeIgniter 3.1+.

Note:

  This method is still available, but you’re strongly encouraged to
  remove its usage sooner rather than later.


Config library method system_url()
----------------------------------

Usage of "CI_Config::system_url()" encourages insecure coding
practices. Namely, your CodeIgniter *system/* directory shouldn’t be
publicly accessible from a security point of view.

Because of this, this method is now deprecated and scheduled for
removal in CodeIgniter 3.1+.

Note:

  This method is still available, but you’re strongly encouraged to
  remove its usage sooner rather than later.


The Javascript library
----------------------

The Javascript Library has always had an ‘experimental’ status and was
never really useful, nor a proper solution.

It is now deprecated and scheduled for removal in CodeIgniter 3.1+.

Note:

  This library is still available, but you’re strongly encouraged to
  remove its usage sooner rather than later.


Form Validation method prep_for_form()
--------------------------------------

The Form Validation Library has a "prep_for_form()" method, which
is/can also be used as a rule in "set_rules()" to automatically
perform HTML encoding on input data.

Automatically encoding input (instead of output) data is a bad
practice in the first place, and CodeIgniter and PHP itself offer
other alternatives to this method anyway. For example, Form Helper
functions will automatically perform HTML escaping when necessary.

Therefore, the *prep_for_form* method/rule is pretty much useless and
is now deprecated and scheduled for removal in 3.1+.

Note:

  The method is still available, but you’re strongly encouraged to
  remove its usage sooner rather than later.


Step 21: Check your usage of Text helper highlight_phrase()
===========================================================

The default HTML tag used by Text Helper function "highlight_phrase()"
has been changed from "<strong>" to the new HTML5 tag "<mark>".

Unless you’ve used your own highlighting tags, this might cause
trouble for your visitors who use older web browsers such as Internet
Explorer 8. We therefore suggest that you add the following code to
your CSS files in order to avoid backwards compatibility with old
browsers:

   mark {
           background: #ff0;
           color: #000;
   };
