PHP, CodeIgniter y jQuery
Consultas MySQL en CodeIgniter
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.
| Imprimir artículo | Este artículo fue publicado por Isern Palaus el 17 Marzo 2008 a las 11:49, y está archivado en CodeIgniter. Sigue las respuestas a esta entrada a través de RSS 2.0. Puedes dejar un comentario o enviar un trackback desde tu propio sitio. |
hace 2 años
Peeeeetttt com et curres els tutos eh XDDDDInga ens veiem!!!
hace 2 años
¿cuales son las principales consultas en mysql?por favor publiquen esto.
hace 2 años
¿cuales son las principales consultas en mysql?mandemelo al correo.
hace 2 años
Jejejej de lo mejor (Y)
de “como se hace” cuando haya un fallo de memoria por ahi
muchas gracias viejo..
de seguro sera una buena fuente para busqueda rapidas
hace 2 años
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
hace 2 años
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???
hace 2 años
como se puede agregar datos de un formulario avanzado en mas de 2 tablas…:s!!!hace 2 años
permitname formualr una pregunta breve porfavor
.en caso de querer usar un LEFT o RIGHT JOIN..
tocaria directamente con:
$this->db->query()
??
gracias
hace 1 año
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
hace 1 año
Sin palabras, gracias me has salvado muchas horas de trabajo y mucha perdida economica.hace 1 año
Tengo el mismo problema que Biktor, me aparece comillas cuando realizo una consulta.Que pasara, quien me ayude que configuracion estara mala
Rolando
hace 1 año
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.hace 10 meses
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%’) ????
hace 9 meses
Muchas gracias por el tutorial, sin duda me ha sido de gran ayuda!!!hace 8 meses
Hola,queria saber como usar expresiones regulares en consultar a la base de datos desde codeigniter?
Algo asi como:
SELECT * FROM nombre_tabla WHERE nombre_campo REGEXP ‘^ab’;
Gracias.
Saludos y felices fiestas!
Ivan.-
PD: Muy bueno el tutorial
hace 6 meses
Excelente tutorial, es de gran ayuda!!Pregunta: ¿Hay algún valor por defecto que sea arrojado por la función insert y el cómo se puede interpretar?
(Si arroja, 1 ó 0, etc.).
Si, ya busqué en google y las APIs y por ahora no he encontrado nada.
hace 5 meses
Hola amigo, cómo se hace el inner join en codeigniter?