Repaso 2: Creamos la base de datos y conectamos desde una página

  • Por
  • 09 de marzo de 2010
  • Valoración:
  • 13 Comentarios
  • PHP
Continuamos con la creación de la primera aplicación web de prueba en CodeIgniter. Ahora haremos los pasos necesarios para crear y conectar la base de datos.
En el artículo anterior del Manual de CodeIgniter comenzamos un repaso de todo lo que hemos aprendido hasta el momento. Así pues, si no lo hemos hecho, conviene leer las explicaciones de la primera parte de esta aplicación de prueba en CodeIgniter. Anteriormente vimos cómo crear nuestro primero controlador y nuestra primera vista. Ahora comenzaremos a trabajar con los módulos y las bases de datos.

4.- Creo una tabla "articulos" en la base de datos

Como en mi aplicación voy a tener artículos, voy a crear una tabla donde almacenarlos. Utilizaré una base de datos MySQL que tengo en local. Crearla con el método que prefiráis, pero yo utilizo PhpMyAdmin que tengo instalado por defecto con mi paquete Wamp.

Tendré que crear una base de datos que voy a llamar, por ejemplo, "aplicacionarticulos" y luego una tabla llamada "articulo", que tendrá los siguientes campos:

  • id (int, auto incremental y clave primaria)
  • titulo (varchar 100)
  • descripcion (varchar 200)
  • cuerpo (text)
Por si sirve de algo, coloco aquí el código SQL del create table.

CREATE TABLE `articulo` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`titulo` VARCHAR( 100 ) NOT NULL ,
`descripcion` VARCHAR( 200 ) NOT NULL ,
`cuerpo` TEXT NOT NULL
)

Antes de salir de PhpMyAdmin, o cualquier otro gestor de base de datos, vamos a insertar manualmente unos cuantos registros en la tabla de "articulo" con datos de prueba.

5.- Configuro CodeIgniter para la conexión con esta base de datos

Ahora voy a decirle a CodeIgniter que realice una conexión automática con la base de datos que acabo de crear, que se active en todas las páginas de dentro de mi sitio web. Para ello comienzo editando el archivo de configuración database.php (system/application/config/database.php) donde deben figurarlos datos de la base de datos que deseo utilizar.

Tenemos que editar al menos los siguientes datos:

$db['default']['hostname'] = "localhost";
$db['default']['username'] = "root";
$db['default']['password'] = "";
$db['default']['database'] = "aplicacionarticulos";

Ahora debo decirle a CodeIgniter que conecte automáticamente, incluyendo siempre las librerías de conexión con base de datos. Para esto tenemos que editar el archivo de configuración autoload.php (system/application/config/autoload.php), en el lugar donde se indica qué librerías queremos cargar siempre.

$autoload['libraries'] = array('database');

6.- Creo un primer modelo de artículos

Ahora voy a crear una primera aproximación al modelo de artículos. Por el momento sólo voy a colocar una función para traer los últimos 5 artículos.

Nota: El código que veremos a continuación es PHP 5. PHP 4 tendría alguna diferencia por los nombres de los constructores, como ya se explicó.

<?php
class Articulo_model extends Model {

   function __construct(){
      parent::Model();
   }
   
   function dame_ultimos_articulos(){
      $ssql = "select * from articulo order by id desc limit 5";
      return mysql_query($ssql);
   }
}
?>

Nota: En este modelo estamos utilizando las propias funciones de acceso a base de datos de MySQL. Simplemente comentar que en CodeIgniter existe un mecanismo de abstracción de base de datos que se podría utilizar para escribir código con funciones que sirvan para cualquier tipo de base de datos que podamos utilizar, y no sólo MySQL.

Este modelo lo guardamos en el archivo "articulo_model.php" dentro de la carpeta de los modelos (system/application/models).

7.- Actualizo el controlador

Ahora vamos a cambiar un poco el código de nuestro controlador inicial, para colocar algunas otras cosas que nos servirán para dos cosas:
  • Decirle que voy a trabajar con el modelo de artículos
  • Enviarle a la vista de la portada ("home") los datos de los últimos artículos publicados
  • Además, de paso voy a cargar un helper de URL, que tiene una función que me servirá de utilidad dentro de la vista para construir las URL para ver los artículos.
<?php
class Articulos extends Controller {
   function index(){
      //cargo el helper de url, con funciones para trabajo con URL del sitio
      $this->load->helper('url');
      
      //cargo el modelo de artículos
      $this->load->model('Articulo_model');
      
      //pido los ultimos artículos al modelo
      $ultimosArticulos = $this->Articulo_model->dame_ultimos_articulos();
      
      //creo el array con datos de configuración para la vista
      $datos_vista = array('rs_articulos' => $ultimosArticulos);
      
      //cargo la vista pasando los datos de configuacion
      $this->load->view('home', $datos_vista);
   }
}
?>

Nota: El código está comentado y si se encuentran dudas recomendamos releer este Manual de CodeIgniter. No obstante, en el código anterior hay una cosa que son los "helpers" que no hemos explicado todavía. Son simplemente librerías de código con funciones que resultarán útiles a la hora de hacer aplicaciones web con CodeIgniter, que están clasificadas por temática. Nosotros estamos cargando el helper "url", que contiene unas serie de funciones para trabajar con URLs. En concreto utilizaremos la función site_url() del helper "url", un poco más adelante.

8.- Actualizo la vista "home"

Ahora vamos a cambiar el código de nuestra vista de portada, puesto que queremos que nos muestre también los últimos artículos publicados en el sitio, cada uno con un enlace a la URL donde se muestre cada artículo.

<html>
<head>
<title>Portada de mi sitio</title>
</head>
<body>
<h1>Bienvenido a mi web</h1>
<p>Estos son los últimos artículos publicados.</p>
<?php
while ($fila = mysql_fetch_array($rs_articulos)){
   echo '<p>';
   echo '<a href="' . site_url('/articulos/muestra/' . $fila['id']) . '">' . $fila['titulo'] . '</a>';
   echo '</p>';
}
?>

</body>
</html>

Podemos ver cómo hacemos un recorrido a los registros de últimos artículos traídos desde la base de datos con ayuda del modelo y enviados a la vista por medio del controlador. Además, vemos que se está utilizando la función site_url() que pertenece al helper "url" que habíamos cargado en el controlador.

Nota: Aquí también estamos utilizando directamente funciones de MySQL. Sin embargo, CodeIgniter tiene algunas librerías que nos ayudarían a hacer esto de otra manera. No obstante, por ahora queremos limitarlos a lo que conocemos del framework.

Una vez actualizada la vista, podemos acceder a la página raíz de nuestra aplicación, que debería mostrar los últimos artículos que habían cargados en la base de datos, en la tabla articulo, con un enlace a varias páginas, donde se muestra cada uno de los artículos (no creadas todavía). Por supuesto, tenéis que haber insertado algún artículo en la tabla para que lo muestre.

Tenemos la primera parte de nuestra aplicación con acceso a base de datos, creada en pocos minutos con CodeIgniter. Pero todavía tenemos que complicarlo un poco más. En el próximo artículo haremos un poco más grande esta aplicación web.

Autor

Miguel Angel Alvarez

Miguel es fundador de DesarrolloWeb.com y la plataforma de formación online EscuelaIT. Comenzó en el mundo del desarrollo web en el año 1997, transformando su hobby en su trabajo.

Comentarios

Distriker

20/3/2010
Avanzado
Esto avanza cada vez mas, solo me queda el último artículo (de los que están hechos).

Veré que sale de aquí.

Saludos

stephani

21/4/2010
comentario
muy buenos los articulos aqui publicados, es muy facil seguir el tutorial, muchas gracias

antonio

05/5/2010
Copiado el código de ejemplo y error!
Buenas tardes,

Estoy leyendo detenidamente el tutorial de Codeigniter y he realizado todos los ejemplos que aparecen sin problema.
Sin embargo al realizar este ejemplo no me funciona. He copiado el código del controlador (y llamado por su nombre), el código del visor y el código del modelo.

Al ejecutar la página: http://localhost/admin/index.php/articulos

Carga el texto: "Bienvenido a mi web" y "Estos son los últimos artículos publicados"
A continuación un error de php:
Severity: Warning
Message: mysql_fetch_array() expects parameter 1 to be resource, boolean given
Filename: views/home.php
Line Number: 9

Y no sé a qué puede ser debido. Les pido ayuda.

antonio

05/5/2010
pido disculpas
Hola, soy el mismo que ha enviado el comentario de que los ejemplos no funcionan y me pongo en contacto para notificar que se trataba de un error mío.
Al implementar la base de datos me equivoqué al introducir el nombre de la tabla: "articulo" por "articulos" y no hacía bien el enlace.

snowdarth

02/6/2010
A PHP Error was encountered
Hola, primero quiero agradecer por el excelente tutorial que han realizado, esta muy bien redactado y entendible, pero me ha surgido el siguiente error al intentar acceder a esta ultima parte:

Severity: Warning

Message: mysql_query() [function.mysql-query]: Access denied for user 'ODBC'@'localhost' (using password: NO)

Filename: models/articulo_model.php

Mas abajo aparece:
Message: mysql_query() [function.mysql-query]: A link to the server could not be established

y por ultimo:
Message: mysql_fetch_array() expects parameter 1 to be resource, boolean given
Filename: views/home.php

Busco informacion acerca de la correcta configuracion de mi servidor local para q corra codeigniter y no doy con la solución, ojala puedan ayudarme.
Gracias

Gabriel

08/8/2010
Es interesante hacer un ABM de Articulos
Pero yo me pregunto si no existe una forma mas sencilla. nosotros estamos por lanzar un producto en donde puedes hablar con la computadora y esta realiza todo el programa de alta de una tabla de datos sin tener que programar nada. solo con 2 lineas. defines todo.-

Roger

12/4/2011
Cambios en CI 2.0.2
Han cambiado la forma en que se declara el constructor...ahora es de la siguiente manera:

<?php
class Articulo_model extends CI_Model{

function __construct(){
parent::__construct();
}

function dame_ultimos_articulos(){
$ssql = "select * from articulo order by id desc limit 5";
return mysql_query($ssql);
}
}

?>

wizardx

03/5/2011
no me salen los articulos me podrian ayudar
hola que tal antes que nada disculpen por postear demasiado XD se seguido este tutorial al pide de la letra lo malo es que la version de codeigniter no es la misma asi que lo he tenido que modificar me tira el siguiente error. y no se donde esta como soy nuevo esta es mi primera aplicacion, y casi no se php

este es el error que me sale al darle click a los articulos

Fatal error: Call to undefined method Articulo_model::dame_articulo() in C:AppServwwwciapplicationcontrollersarticulos.php on line 28

les pondre todo el codigo que tengo:

en la base de datos ya puse la configuracion
$db['default']['hostname'] = 'localhost';
$db['default']['username'] = 'root';
$db['default']['password'] = 'root';
$db['default']['database'] = 'aplicacionarticulos';

en autoload ya carge data base
$autoload['libraries'] = array('database');

en el controler articulos.php tengo el siguiente codigo
<?php
class Articulos extends CI_Controller {
function index(){
//cargo el helper de url, con funciones para trabajo con URL del sitio
$this->load->helper('url');

//cargo el modelo de artículos
$this->load->model('Articulo_model');

//pido los ultimos artículos al modelo
$ultimosArticulos = $this->Articulo_model->dame_ultimos_articulos();

//creo el array con datos de configuración para la vista
$datos_vista = array('rs_articulos' => $ultimosArticulos);

//cargo la vista pasando los datos de configuacion
$this->load->view('home', $datos_vista);

}
function muestra($id){
//cargo el helper de url, con funciones para trabajo con URL del sitio
$this->load->helper('url');

//cargo el modelo de artículos
$this->load->model('Articulo_model');

//pido al modelo el artículo que se desea ver
$arrayArticulo = $this->Articulo_model->dame_articulo($id);

//compruebo si he recibido un artículo
if (!$arrayArticulo){
//no he recibido ningún artículo
//voy a lanzar un error 404 de página no encontrada
show_404();
}else{
//he encontrado el artículo
//muestro la vista de la página de mostrar un artículo pasando los datos del array del artículo
$this->load->view('muestra_articulo', $arrayArticulo);
}
}



}
?>

En el modelo tengo el siguiente codigo:con nombre articulo_model.php


<?php
class Articulo_model extends CI_Model {

function __construct(){
parent::__construct();
}

function dame_ultimos_articulos(){
$ssql = "select * from articulo order by id desc limit 5";
return mysql_query($ssql);

function dame_articulo($id){
$ssql = "select * from articulo where id=" . $id;
$rs = mysql_query($ssql);
if (mysql_numrows($rs)==0){
return false;
}else{
return mysql_fetch_array($rs);
}

}

}
}
?>


en el la vista tengo una pagina llamada home.php
<html>
<head>
<title>Portal-tuxpan</title>
</head>
<body>
<h1>Bienvenido a mi web</h1>

<p>Estos son los últimos artículos publicados.</p>
<?php
while ($fila = mysql_fetch_array($rs_articulos)){
echo '<p>';
echo '<a href="' . site_url('/articulos/muestra/' . $fila['id']) . '">' . $fila['titulo'] . '</a>';
echo '</p>';
}
?>
</body>
</html>

y en la otra vista mando llamar mediante el metodo es esta: muestra_articulo.php
<html>
<head>
<title><?php $titulo; ?></title>
</head>
<body>
<h1><?php echo $titulo; ?></h1>

<blockquote><b><?php echo $titulo; ?></b></blockquote>

<?php echo nl2br($cuerpo); ?>

<p><a href="<?php site_url(); ?>">Volver</a></p>
</body>
</html>


bueno es todo el codigo de este tutorial espro y alguien me pueda ayudar de antemano se los agradeceria mucho. porfa tomense un tiempo para ayudarme .
y no quedarme estancado.

Rod

11/12/2011
Interfaz de la base de datos
Me gustaría dar las gracias por el tutorial, da una visión muy clara de cómo es la estructura de las aplicaciones MVC desarrolladas con CodeIgniter.

El único "pero" que le pongo es que se utilice la interfaz de funciones mysql para el ejemplo de este capítulo. Precisamente uno de los puntos fuertes de CodeIgniter es que nos permite abstraernos del tipo de gestor de base de datos utilizado (mysql, postgresql, etc.)

Aconsejo por tanto que para la parte de la interfaz con la base de datos se le eche un vistazo a la documentación original de CodeIgniter.

LexCastillo

23/4/2012
Error =S
Hola, a mi me aparece un error (como el siguiente) cuando pulso en el link generado para que se vaya a mas detalles de los productos:

A PHP Error was encountered
Severity: Warning
Message: Cannot modify header information - headers already sent by (output started at C:AppServwwwCIapplicationcontrollersarticulos.php:1)
Filename: core/Common.php
Line Number: 442

He investigado y por ahí dicen que es porque existen espacios o caracteres extraños antes o después de la apertura y cierre de php "<? ?>" pero no existe nada de eso, o que tengo que poner en "off" la directiva "display_errors" lo cual no creo que debería de ser, o si no que es porque debería estar al principio de cualquier etiqueta HTML, pero ni así queda, podrían ayudarme por favor? Ya que estoy estancado en esta parte =(

Ah! Y además, al mismo tiempo, me manda un error 404 mas abajo

Javier Ramon

02/5/2012
Para CodeIgniter 2.1.0 quedaria el controlador así
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
class Articulos extends CI_Controller {
function __construct(){
// Call the Model constructor
parent::__construct();
//cargo el helper de url, con funciones para trabajo con URL del sitio
$this->load->helper('url');
//cargo el modelo de artículos
$this->load->model('Articulos_model');
}
public function index()
{
//pido los ultimos artículos al modelo
$ultimosArticulos = $this->Articulos_model->dame_ultimos_articulos();

//creo el array con datos de configuración para la vista
$datos_vista = array('rs_articulos' => $ultimosArticulos);

//cargo la vista pasando los datos de configuacion
$this->load->view('home', $datos_vista);
}

}
/* End of file articulos.php */
/* Location: ./application/controllers/articulos.php */
?>

Javier Ramon

02/5/2012
Para CodeIgniter 2.1.0 el moldelo quedaria así
<?php
class Articulos_model extends CI_Model {
function __construct()
{
// Call the Model constructor
parent::__construct();
}
function dame_ultimos_articulos(){
$ssql = "select * from articulo order by id desc limit 5";
return mysql_query($ssql);
}
}
/* End of file articulos_model.php */
/* Location: ./application/models/articulos_model.php */
?>

Hugo Armando Pulido

02/11/2012
Error en el parent::Model del modelo articulo_model.php
Existe un error en articulo_model.php, en function __construct(){<br />
parent::Model();, dado que no es Model sino __construct(), aplica en la versión En la versión Codeigniter 2.1.3.

Compartir