Controlador respondiendo a parámetros para Query

Extracto

Controlador averigua si existe una tabla; si no existe, la crea e introduce datos de prueba; para, posteriormente, responder con datos dinámicos pasados como parámetro desde la URL.

Abreviaturas usadas

  • MVC, paradigma Modelo Vista Controlador
  • CI, CodeIgniter

Descripción

A través del grupo Code Igniter PHP Framework ESPAÑOL, al cual pertenezco, un miembro me pide ayuda por privado. Tras dos días de, materialmente, no poder atender su solicitud por falta de tiempo me pongo en contacto con él para indicarle que haría esta entrada.

Esta entrada es mejorable en cuanto a la pureza del MVC porque en esta entrada de blog no me atengo a ella, ya que no uso, como vistas dinámicas, ni un modelo. Sirva la excusa del tiempo que no tengo.

Archivo .htaccess

<ifmodule mod_rewrite.c>
    RewriteEngine On 
    RewriteCond %{REQUEST_FILENAME} !-f 
    RewriteCond %{REQUEST_FILENAME} !-d 
    RewriteRule ^(.*)$ ./index.php/$1 [L] 
</IfModule>
<ifmodule !mod_rewrite.c>
    ErrorDocument 404 /index.php 
</IfModule>

<ifmodule mod_gzip.c>
  mod_gzip_on Yes
  mod_gzip_dechunk Yes
  mod_gzip_item_include file .(html?|txt|css|js|php|pl)$
  mod_gzip_item_include handler ^cgi-script$
  mod_gzip_item_include mime ^text/.*
  mod_gzip_item_include mime ^application/x-javascript.*
  mod_gzip_item_exclude mime ^image/.*
  mod_gzip_item_exclude rspheader ^Content-Encoding:.*gzip.*
</ifModule>


<ifmodule mod_expires.c>
  ExpiresActive On
  ExpiresDefault "access plus 1 seconds"
  ExpiresByType text/html "access plus 1 seconds"
  ExpiresByType image/gif "access plus 2592000 seconds"
  ExpiresByType image/jpeg "access plus 2592000 seconds"
  ExpiresByType image/png "access plus 2592000 seconds"
  ExpiresByType text/css "access plus 604800 seconds"
  ExpiresByType text/javascript "access plus 216000 seconds"
  ExpiresByType application/x-javascript "access plus 216000 seconds"
</ifModule>

archivo /config/database.php

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

$db['default']['hostname'] = 'localhost';
$db['default']['username'] = 'usuario';
$db['default']['password'] = 'clavesupersecretadelaestrelladelamuerte';
$db['default']['database'] = 'blog';
$db['default']['dbdriver'] = 'mysql';
$db['default']['dbprefix'] = '';
$db['default']['pconnect'] = TRUE;
$db['default']['db_debug'] = TRUE;
$db['default']['cache_on'] = FALSE;
$db['default']['cachedir'] = '';
$db['default']['char_set'] = 'utf8';
$db['default']['dbcollat'] = 'utf8_general_ci';
$db['default']['swap_pre'] = '';
$db['default']['autoinit'] = TRUE;
$db['default']['stricton'] = FALSE;

archivo /controllers/parametro.php

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class Parametro extends CI_Controller {

 public function __construct()
 {
  parent::__construct();   // heredo clases y funcionalidades de Parent
  $this->load->database();   // cargo la clase base de datos según config/database.php
  $this->load->library('table');  // cargo la clase table
 }

 /**
  * Esto es un ejemplo de controlador 
  * para pasar parámetros a las consultas
  * @pedroruizhidalg
  * http://phpdehoy.blogspot.com
  */


 public function index()
 {
  $this->echo_parametro();    // compruebo que funciona el index
  $this->load->dbforge();     // cargo la clase dbforge para crear tablas dinámicamente, y otras cosas...
  if(!$this->existe_table('parametro')); // compruebo la existencia de la tabla
 }

 public function autor($nombre_autor)
 {
  echo "buscando las entradas del blog cuyo autor es '$nombre_autor'";
  echo $this->busca_autor($nombre_autor);
 }

 /**
 *
 * PRIVATE FUNCTIONS 
 *
 **/

 private function existe_table($tabla)
 {
  echo utf8_decode("Estoy probando existencia de la tabla '$tabla'
");
  if(!$this->db->table_exists($tabla))
  {

   echo 'necesario crear tabla
';
   $campos = array(
    'blog_titulo' => array(
    'type' => 'VARCHAR',
    'constraint' => '100',
    ),
    'blog_autor' => array(
    'type' =>'VARCHAR',
    'constraint' => '100',
    'default' => 'Batman',
    ),
    'blog_descripcion' => array(
    'type' => 'TEXT',
    'null' => TRUE,
    ),
   );
   $this->dbforge->add_field('id',TRUE); // creo el ID (TRUE=primary, auto_increment);
   $this->dbforge->add_field($campos);  // añado la estructura de la tabla del array $campos
   $this->dbforge->create_table($tabla); // creo la tabla
   echo 'tabla creada
';
   $this->insert_dummy($tabla);
   return TRUE;
  } else {
   echo "No es necesario crear la tabla '$tabla', ya estaba creada
";
   return FALSE;
  }
 }

 private function insert_dummy($tabla)
 {
  echo "Introduciendo datos de prueba en tabla '$tabla'
";
  $data  = array(
   'blog_titulo'  => 'titulo Primero',
   'blog_autor'  => 'Pedro',
   'blog_descripcion' => 'descripcion del titulo Primero'
   );
  $this->db->insert($tabla,$data);

  $data  = array(
   'blog_titulo'  => 'titulo Segundo',
   'blog_autor'  => 'Antonio',
   'blog_descripcion' => 'descripcion del titulo Segundo'
   );
  $this->db->insert($tabla,$data);

  $data  = array(
   'blog_titulo'  => 'titulo Tercero',
   'blog_autor'  => 'Pedro',
   'blog_descripcion' => 'descripcion del titulo Tercero'
   );
  $this->db->insert($tabla,$data);

  $data  = array(
   'blog_titulo'  => 'titulo Cuarto',
   'blog_autor'  => 'Antonio',
   'blog_descripcion' => 'descripcion del titulo Cuarto'
   );
  $this->db->insert($tabla,$data);

  echo 'datos de prueba introducidos
';
 }

 private function echo_parametro()
 {
  echo utf8_decode('Parámetro

');
 }

 private function busca_autor($nombre_autor)
 {
  $consulta  = "select * from parametro where blog_autor='$nombre_autor'";

  $qry  = $this->db->query($consulta);
  if($qry->num_rows() > 0)
  {
   $tmpl = array ( 'table_open' => '<table border="1" cellpadding="2"cellspacing="1" class="mytable">' );
   $this->table->set_template($tmpl);
   foreach ($qry->result() as $row) 
   {
    $this->table->add_row(array($row->blog_titulo,$row->blog_autor,$row->blog_descripcion));
   }
   return $this->table->generate();
  } else { // si no hay datos
   echo "
sin datos";
  }
 }

}

/* End of file parametro.php */
/* Location: ./application/controllers/parametro.php */

Ejecución

  1. Asegúrate que tu instalación de CodeIgniter esté funcionando.
  2. Copia a sus respectivos directorios los archivos /config/database.php y /controllers/parametro.php.
  3. Copia el archivo .htaccess a la raiz de tu instalación de CI.
  4. Dirígete a tu ubicación así http://miservidor/parametro.
  5. Comprueba que la tabla parametro existe y tiene datos
  6. Ejecuta la dirección http://miservidor/parametro/autor/pedro
  7. comprueba que recibes datos dinámicos
  8.  http://miservidor/parametro/autor/antonio
  9. ejecuta el paso 7 otra vez.

Epílogo

Espero que os sirva de ayuda. En cualquier caso estaré encantado de poder atender vuestros comentarios. Tampoco estaría mal que hiciérais +1… 😉