I really should explore using a framework. Every time I sit down to do it however I discover how freaking difficult it is to wrap the framework around our insanely horrible database. I don't see too many advantages of frameworks without a database that fits easily into a MVC design. 
We didn't build the database, we can't modify the database's design, but we have to use it. It's not that I don't want to explore frameworks, it's that the effort to cram this thing into a framework is way more then just continuing to do everything 'from scratch'.
		
		
	 
I think that is a false assumption. Anything you do by hand can be done easier in a framework if you know how to do object oriented coding in php5 properly.
For instance my CRUDForm library exists to DRY out controllers. It isn't perfectly DRY but its getting closer with each revision. Here is an example for CodeIgniter running on top of PHP5:
	
	
	
		Code:
	
	
		CREATE TABLE `products` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `vendor_id` int(10) NOT NULL,
  `product_type_id` int(10) NOT NULL,
  `gallery_id` int(10) NOT NULL,
  `item` varchar(150) NOT NULL,
  `is_active` tinyint(1) NOT NULL DEFAULT '0',
  `description` text NOT NULL,
  `created_on` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `updated_on` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
	 
 
A child class of CRUDForm would hold metadata that explains what models to load, tables to expect and what views to send them too and it would look like this:
	
	
	
		PHP:
	
	
		<?php if( ! defined('BASEPATH')) exit ('No direct script access allowed');
class Products extends CRUDForm {
    /**
    | Page name that is passed into the parent controller. The Data array in
    |   class variable array contains elements that are array. These arrays represent tables
    |   in the database. Non array elements in the data array are for logic and view
    |   workflow.
    |
    */
    protected $schema = array(
        'page_url' => 'products',
        'model' => 'Products_m',
        'data' => array(
            'id' => array('value' => '', 'type' => 'int'),
            'vendor_id' => array('value' => '', 'type' => 'int'),
            'gallery_id' => array('value' => '', 'type' => 'int'),
            'product_type_id' => array('value' => '', 'type' => 'int'),
            'item' => array('value' => '', 'type' => 'char'),
            'is_active' => array('value' => 0, 'type' => 'bool'),
            'description' => array('value' => '', 'type' => 'char'),
            'page' => 'products', //body tag id
            'message' => '', //this is specifically for the view
            'action' => 'create' //this is specifically for the controller
            ),
        'views' => array('edit' => 'admin/products/edit', 'listing' => 'admin/products/listing'
            )
        );
    function __construct()
    {   
        parent::__construct();
        $this->load->model('Vendors_m');
        $this->load->model('Product_types_m');
        $this->load->model('Image_gallery_m');
        if( ! $vendors = $this->Vendors_m->get()) {
            $this->session->set_flashdata('message', 'Before you add products you must at least have 1 vendor available.');
            redirect('/admin');
        }
        if( ! $types = $this->Product_types_m->get()) {
            $this->session->set_flashdata('message', 'Before you add products you must at least have 1 product type available.');
            redirect('/admin');
        }
        if( ! $galleries = $this->Image_gallery_m->get()) {
            $this->session->set_flashdata('message', 'Before you add products you must at least have 1 picture uploaded into a gallery.');
            redirect('/admin');
        }
        foreach($vendors as $row) {
            $this->schema['data']['dropdown']['vendors'][$row->id] = $row->company;
        }
        foreach($types as $row) {
            $this->schema['data']['dropdown']['types'][$row->id] = $row->type;
        }
        foreach($galleries as $row) {
            $this->schema['data']['dropdown']['galleries'][$row->id] = $row->name;
        }
    }
}
	 
 
The model, which is child of a class ( MY_Model ) that extends the CI's model class and has abstract DB calls based on CodeIgniter's own ActiveRecord library. You only need metadata in the form of a protected class variable 
 
	
	
	
		PHP:
	
	
		<?php if( ! defined('BASEPATH')) exit ('No direct script access allowed');
class Products_m extends MY_Model {
    protected $model_schema = array (
        'table' => 'products',
        'join' => array(
            'vendors' => "products.vendor_id = vendors.id",
            'product_types' => 'products.product_type_id = product_types.id',
            ),
        'select' => 'products.id, products.vendor_id, products.item, products.is_active, products.picture, products.description, product_types.type, vendors.company'
    );
    function __construct() {
        parent::__construct();
    }
    function get_dropdown() {
        $this->model_schema['select'] = 'products.id, products.item';
        return parent::get();
    }
    public function is_active($id = '') {
        $this->model_schema['select'] = 'id';
        $field = 'is_active';
        return parent::bool_check($id, $field);
    }
    public function get_for_public() {
        $this->model_schema['where'] = array('products.is_active' => '1');
        $this->model_schema['order_by'] = 'product_type_id';
        return parent::get();
    }
}
	 
 
The Edit View would look like this:
	
	
	
		PHP:
	
	
		<?php $this->load->view('admin/admin_header'); ?>
<?php
    $hidden = array(
        'id' => $id['value'],
        'action' => $action);
    $form['item'] = array(
        'name' => 'item',
        'id' => 'item',
        'maxlength' => '50',
        'size' => '50',
        'value' => htmlspecialchars_decode($item['value']));
    $form['is_active'] = array(
        'name' => 'is_active',
        'id' => 'is_active',
        'value' => 'yes',
        'checked' => process_checkbox($is_active['value']));
    $form['description'] = array(
        'name' => 'description',
        'id' => 'description',
        'rows' => '7',
        'cols' => '50',
        'value' => htmlspecialchars_decode($description['value']));
?>
            <div id="content" class="grid_16">
                    <h1>Product Edit Page</h1>
                    <div id="error"><?php
                        if($message) {
                            echo $message;
                        }
                        elseif($this->session->flashdata('message')) {
                            echo $this->session->flashdata('message');
                        }
                    ?></div>
                    <p class="infoBox">Please enter the following information.</p>
                    <?php echo form_open('products/edit'); ?>
                    <?php echo form_hidden($hidden); ?>
                    <div class="row1"><label for="vendor">Vendor: </label><?php echo form_dropdown('type_id', $dropdown['vendors'], $vendor_id['value']) ?></div>
                    <div class="row2"><label for="type">Product Type: </label><?php echo form_dropdown('status_id', $dropdown['types'], $product_type_id['value']) ?></div>
                    <div class="row1"><label for="gallery">Image Gallery: </label><?php echo form_dropdown('status_id', $dropdown['galleries'], $gallery_id['value']) ?></div>
                    <div class="row2"><label for="is_active">Check to Activate Item: <em>(Required)</em></label><?php echo form_checkbox($form['is_active']) ?></div>
                    <div class="row1"><label for="item">Item: <em>(Required)</em></label><?php echo form_input($form['item']); ?></div>
                    <div class="row2"><label for="description">Description: <em>(Required)</em></label><?php echo form_textarea($form['description']); ?></div>
                    <p class="submit"><input type="submit" name="submit" value="Save Record" class="save" /></p>
                    <?php echo form_close(); ?>
                    <?php echo anchor('/admin/index', 'Back to admin'); ?>
            </div>
<?php $this->load->view('admin/admin_footer'); ?>
	 
 
There are some assumptions you must consider. The CRUDForm is essentially an extended CodeIgniter controller. Thus the name of the Class will show up in the URL in segment 1.
example.com/products
The methods will be segment 2
example.com/products/edit
The query data, in this case the ID because that is what my edit method takes into account, is segment 3
example.com/products/edit/1
You could wrap just about any horrible schema'ed database because once CRUDForm, or your own custom variation of it, would only need Metadata supplied to it. 
You go even further when you use a Modular Separation Library because instead of just having a /controllers directory inside your CI's application directory you would have a /modules directory. Each directory under that would be a module such as application/modules/products which would have its own models/views/controllers/config directories.
This way you can keep top level database objects like Products or Employees separate so you could work on one custom module at a time. If you need something more than what a custom controller like CRUDForm would offer, and I sure have those myself such as image asset uploader, you can just extend the CI controller and write whatever custom code, and still have the Database model's methods and you can even extend the Model's child class for custom db needs.
All without going too far off the reservation of what a vanilla CI install does. All you need is CRUDForm and the modular separation library to get started. Or, to write your own CRUD enabled DRY controller. Or fork mine (yay open source).