Consultas MySQL en CodeIgniter


El 17 Marzo 2008 – 11:49 | por Isern Palaus

Aunque pueda parecer difícil, hacer consultas en MySQL en CodeIgniter es la cosa más fácil del mundo. Y no solo con MySQL sino con todos los protocolos soportados por el framework. Es importante, sobretodo, que tengamos nuestro CodeIgniter correctamente configurado. Podéis echarle una ojeada al artículo de configuración y iniciación para ver como configuramos los datos de MySQL.

CodeIgniter, a parte, nos da la posibilidad de trabajar con más de una base de datos a la vez, configurando y conectando específicamente a una u otra dependiendo de las necesidades. Sin embargo, no es el objeto de esta explicación.

Supongamos que queremos hacer una consulta parecida a la siguiente:
SELECT * FROM entradas

Lo normal en PHP sería usar un mysql_query(”SELECT * FROM entradas”);, sin embargo en CodeIgniter (y usando librería específica) lo usaríamos de la siguiente forma:
[code lang="php"]
$this->db->query("SELECT * FROM entradas");
[/code]

GET

Conclusión, podemos usarlo de la misma manera. Luego si quisiéramos estructurar los resultados podríamos usar la función foreach de PHP. Sin embargo, hay una manera mucho más fácil en CodeIgniter de tratar las consultas. Ellos lo llaman el Active Record Class y se emplearía, para el ejemplo de antes, así:
[code lang="php"]
$query = $this->db->get("entradas");

// Genera: SELECT * FROM entradas;
[/code]

También en $this->db->get(); es posible usar un segundo parámetro para especificar un LIMIT:
[code lang="php"]
$query = $this->db->get("entradas", 10, 20);

// Genera: SELECT * FROM entradas LIMIT 20,10
[/code]

SELECT

También podemos especificar el SELECT con $this->db->select(); tipo:
[code lang="php"]
$query = $this->db->select("id,title,body");
$query = $this->db->get("entradas");

// Genera: SELECT id,title,body FROM entradas
[/code]

Existen algunas funciones de MySQL que tienen una propiedad de SELECT específica en CodeIgniter, sin embargo, solo los listaré ya que no los usaremos en aplicaciones básicas:

  • $this->db->select_max();
  • $this->db->select_min();
  • $this->db->select_avg();
  • $this->db->select_sum();

JOIN

Esto nos permite unir dos tablas tal que así:
[code lang="php"]
$query = $this->db->join("comentarios", "comentarios.id = entradas.id");
$query = $this->db->get("entradas");

// Genera: SELECT * FROM entradas JOIN comentarios ON comentarios.id = entradas.id
[/code]

WHERE

[code lang="php"]
$query = $this->db->where("id","38");
$query = $this->db->get("entradas");

// Genera: SELECT * FROM entradas WHERE id = '38'
[/code]

Si quisiéramos podríamos unir varios WHERE, simplemente añadiendo otras condiciones:
[code lang="php"]
$query = $this->db->where("id","38");
$query = $this->db->where("name","Isern");
$query = $this->db->where("surname","Palaus");
$query = $this->db->get("entradas");

// Genera: SELECT * FROM entradas WHERE id = '38' AND name = 'Isern' AND surname = 'Palaus'
[/code]

Pero claro, no todo son igualdades. Quizás queremos buscar una cosa que sea más pequeña que, o diferente, o mayor, etcétera. La forma es especificar en el primer campo, si no hay nada se tomará = por defecto:
[code lang="php"]
$query = $this->db->where("id >","38");
$query = $this->db->where("name !=","Isern");
$query = $this->db->where("surname","Palaus");
$query = $this->db->get("entradas");

// Genera: SELECT * FROM entradas WHERE id > '38' AND name != 'Isern' AND surname = 'Palaus'
[/code]

Al igual que SELECT, hay muchas más propiedades:

  • $this->db->or_where();
  • $this->db->where_in();
  • $this->db->or_where_in();
  • $this->db->where_not_in();
  • $this->db->or_where_not_in();

LIKE

[code lang="php"]
$query = $this->db->like("body","sentencia");
$query = $this->db->get("entradas");

// Genera: SELECT * FROM entras LIKE body = '%sentencia%'
[/code]

Sin embargo, podría ser que no quisiéramos que las dos partes fueran aleatorias… De modo que podemos especificar en un tercer campo el % donde debe estar. Puede ser: before, both y after.
[code lang="php"]
$query = $this->db->like("body","sentencia1","before");
$query = $this->db->like("title","sentencia2","both");
$query = $this->db->like("slug","sentencia3","after");
$query = $this->db->get("entradas");

// Genera: SELECT * FROM entradas LIKE body = '%sentencia1' AND title = '%sentencia2%' AND slug = 'sentencia3%'
[/code]

Otros tipos de LIKE que podemos usar son:

  • $this->db->not_like();
  • $this->db->or_not_like();
  • $this->db->group_by();

GROUP BY

En otras versiones se conocia como $this->db->groupby(); pero ha sido eliminado.
[code lang="php"]
$query = $this->db->group_by("title");
$query = $this->db->get("entradas");

// Genera: SELECT * FROM entradas GROUP BY title
[/code]

DISTINCT

Para añadir DISTINCT a la consulta:
[code lang="php"]
$query = $this->db->distinct();
$query = $this->db->get("entradas");

// Genera: SELECT DISTINCT * FROM entradas
[/code]

HAVING

[code lang="php"]
$query = $this->db->having("uid = 32");
$query = $this->db->get("entradas");

// Genera: SELECT * FROM entradas HAVING uid = 32
[/code]

También es posible usar $this->db->or_having();

ORDER BY

$this->db->order_by(); permite ordenar un resultado en una dirección especifica. En el primer parámetro especificamos el nombre de la columna y en el segundo la dirección. Las posibilidades del segundo parámetro son: ASC, DESC y RANDOM.
[code lang="php"]
$query = $this->db->order_by("id","DESC");
$query = $this->db->get("entradas");

// Genera: SELECT * FROM entradas ORDER BYid DESC
[/code]

LIMIT

Permite especificar el limite de resultados que quieres que devuelva:
[code lang="php"]
$query = $this->db->limit(30);
$query = $this->db->get("entradas");

// Genera: SELECT * FROM entradas LIMIT 10
[/code]

COUNT ALL

Permite contar el numero de entradas que hay en una tabla:
[code lang="php"]
$num = $this->db->count_all("entradas");

// Genera: un numero que lo podemos tratar como una variable o escribirlo
[/code]

COUNT ALL RESULTS

A diferencia de COUNT ALL, nos permite contar el numero de resultados en la actual consulta:
[code lang="php"]
$query = $this->db->where("name","Isern");
$query = $this->db->get("entradas");

$num = $this->db->count_all_results();

// Genera: un numero
[/code]

INSERT

Para insertar datos usando el Active Record de CodeIgniter debemos usar un array luego insertar:
[code lang="php"]
$insert = array("title" => "Test",
"body" => "Test",
"name" => "Isern",
"surname" => "Palaus");

$this->db->insert("entradas",$insert);

// Genera: INSERT INTO entradas (title, body, name, surname) VALUES ('Test', 'Test', 'Isern', 'Palaus')
[/code]

UPDATE

Al igual que INSERT usaremos un array para insertar, sin embargo si queremos actualizar, por ejemplo, una entrada deberemos especificar un where:
[code lang="php"]
$update = array("title" => "Test",
"body" => "Test",
"name" => "Isern",
"surname" => "Palaus");

$this->db->where("id","3");
$this->db->update("entradas",$update);

// Genera: UPDATE entradas SET title = 'Test', body = 'Test', name = 'Isern', surname = 'Palaus' WHERE id = 3
[/code]

DELETE

Al igual que UPDATE usaremos un ID para especificar cual es la que queremos borrar:
[code lang="php"]
$this->db->where("id","3");
$this->db->delete("entradas");

// Genera: DELETE FROM entradas WHERE id = 3
[/code]

Y esto es más o menos todo lo que nos ofrece CodeIgniter para tratar nuestras bases de datos. Espero que haya servido de ayuda a más de uno ya que muchas visitas recibidas buscaban como usar MySQL en CodeIgniter.

Tags: , , , ,

  1. 15 Comentarios a “Consultas MySQL en CodeIgniter”

  2. Por Aivan el Mar 17, 2008 | Responder

    Peeeeetttt com et curres els tutos eh XDDDD

    Inga ens veiem!!!

  3. Por jorge luis el May 13, 2008 | Responder

    ¿cuales son las principales consultas en mysql?
    por favor publiquen esto.

  4. Por jorge luis el May 13, 2008 | Responder

    ¿cuales son las principales consultas en mysql?
    mandemelo al correo.

  5. Por kmilo el Jun 6, 2008 | Responder

    Jejejej de lo mejor (Y)
    muchas gracias viejo..
    de seguro sera una buena fuente para busqueda rapidas :) de “como se hace” cuando haya un fallo de memoria por ahi ;)

  6. Por Isern Palaus el Jun 6, 2008 | Responder

    Muchas gracias kmilo. Tengo uno a medias desde hace tiempo, un sistema de usuarios en PHP y MySQL que seguro que interesa a todos.

    Un saludo,
    – Isern Palaus

  7. Por Yan el Jul 7, 2008 | Responder

    Hola,todo me parece espectacular…pero como seria la inserción de datos en mas de 2 tablas, solo veo q se pueden unir tablas para extraer datos…

    como seria insertar???

  8. Por yan el Jul 7, 2008 | Responder

    como se puede agregar datos de un formulario avanzado en mas de 2 tablas…:s!!!

  9. Por kmilo el Ago 30, 2008 | Responder

    permitname formualr una pregunta breve porfavor :) .

    en caso de querer usar un LEFT o RIGHT JOIN..
    tocaria directamente con:

    $this->db->query()

    ??

    gracias :)

  10. Por Biktor el Ene 15, 2009 | Responder

    Quiza demasiado tarde, pero respondo al anterior.

    $this->db->join(’tablas’, ‘tabla1.campocomun = tabla2.campocomun’);

    Ahora formulo mi pregunta.

    En la version 1.7.0 tengo un problema al realizar las consultas, a todo le pone comillas de la siguiente manera:

    SELECT `c`.`id`, `c`.`nombre`, `c`.`descripcion`, `pxc`.`prospecto_id`
    FROM (`prospectoxcursointeres` as pxc)
    INNER JOIN `cursointeres` as c ON `c`.`id` = `pxc`.`cursointeres_id`
    WHERE pxc.prospecto_id =1

    Solo lo pude solucionar en el Where poniendo false en el tercer parámetro.

    A quien me pueda ayudar, mil gracias

  11. Por Ruben Espadas el Mar 31, 2009 | Responder

    Sin palabras, gracias me has salvado muchas horas de trabajo y mucha perdida economica.

  12. Por Rolando el Jun 9, 2009 | Responder

    Tengo el mismo problema que Biktor, me aparece comillas cuando realizo una consulta.

    Que pasara, quien me ayude que configuracion estara mala

    Rolando

  13. Por Merodeador el Jun 16, 2009 | Responder

    Quizas un poco tarde Biktor, pero la solución es poner el FALSE, para que no escape la cadena que escribes en el where. Dentro de una select también tienes esta opcion si tienes que usar funciones que requieran el uso de comillas simples.

  14. Por Diego el Nov 2, 2009 | Responder

    La verdad que esto es mas de lo mismo, abro la doc de codeigniter y esta esto!!!

    Como logro esto:

    select * from my tabel where id=1 AND (entradas LIKE body = ‘%sentencia1′ OR title = ‘%sentencia2%’ OR slug = ’sentencia3%’) ????

  15. Por hauralws el Nov 27, 2009 | Responder

    Muchas gracias por el tutorial, sin duda me ha sido de gran ayuda!!!

  1. 1 Trackback(s)

  2. Jun 2, 2009: Isern Palaus » Consultas MySQL en CodeIgniter

Dejar un comentario