Qué significa CRUD
CRUD es una sigla formada por las iniciales de cuatro palabras en inglés, y nombra las cuatro operaciones básicas que se pueden hacer sobre datos guardados:
- C — Create: crear.
- R — Read: leer.
- U — Update: actualizar.
- D — Delete: borrar.
Se pronuncia «crud», como una sola palabra. Y no es un concepto de un lenguaje ni de un gestor en particular: es una idea general sobre qué se puede hacer con un dato, que aplica igual a una base MySQL, a un archivo SQLite, a una planilla de cálculo o a una lista escrita a mano. La forma de hacerlo cambia; las cuatro operaciones, no.
Las cuatro operaciones
Con el ejemplo de la biblioteca se ven mejor que con definiciones:
| Operación | En español | Qué hace | En la biblioteca |
|---|---|---|---|
| C Create | Alta | Agregar una fila nueva, que antes no existía. | Inscribir un socio nuevo. |
| R Read | Listado | Leer lo que ya está guardado, con o sin filtros. | Ver la lista de socios activos. |
| U Update | Modificación | Cambiar un dato de una fila que ya existe. | Corregir el correo de un socio. |
| D Delete | Baja | Eliminar una fila que ya no va. | Dar de baja a un socio. |
Hay una asimetría que conviene ver desde el principio: tres de las cuatro cambian los datos y solo una los mira. La lectura es la única inofensiva. Eso va a tener consecuencias en todo lo demás —en el método de envío que se usa, en los permisos que hacen falta, en el cuidado con el que se ejecuta cada sentencia— y es la razón por la que esta unidad vuelve una y otra vez sobre las mismas dos advertencias: el WHERE que no se olvida y la confirmación antes de destruir algo.
ABM: el nombre en español
En el ámbito hispanohablante, y sobre todo en los sistemas administrativos, a lo mismo se lo llama ABM: Altas, Bajas y Modificaciones. Las dos siglas se usan como sinónimos, y en las ofertas de trabajo aparecen indistintamente.
El nombre en español tiene dos detalles interesantes, y los dos enseñan algo:
- No menciona el listado. No es un olvido: se da por supuesto. Y tiene una lógica sólida, porque no se puede modificar ni dar de baja algo que no se puede ver. En la práctica, casi siempre se llega a una modificación o a una baja desde un listado, apretando el botón que está en la fila del dato. El listado es la puerta de entrada a las otras tres.
- Las bajas van en el medio en lugar de al final, y ahí también hay una razón: es la operación más delicada, la única que destruye información. Ponerla en el centro de la sigla es una forma de recordar que hay que pensarla dos veces.
Esa observación sobre el listado vale para el proyecto de la unidad: aunque no esté en el nombre, es la pantalla principal del sistema. Es la que se abre primero, la que da sentido a las demás y la que hay que hacer antes que ninguna otra. Es bastante común empezar programando el alta —porque parece el punto de partida lógico— y descubrir a mitad de camino que sin un listado no se puede comprobar si el alta funcionó.
CRUD y las instrucciones de SQL
Cada una de las cuatro operaciones tiene su instrucción. La correspondencia es directa y vale memorizarla, porque a partir de acá se las va a nombrar de las dos maneras:
| Operación | Instrucción SQL | Qué le pasa a la tabla |
|---|---|---|
| Alta (Create) | INSERT INTO |
Aparece una fila nueva. |
| Listado (Read) | SELECT |
Nada: devuelve datos y la tabla queda igual. |
| Modificación (Update) | UPDATE |
Cambian valores de filas que ya estaban. |
| Baja (Delete) | DELETE FROM |
Desaparecen filas. |
Las cuatro pertenecen a la familia DML —manipulación de datos— que se vio en la Unidad 3. Y como se dijo entonces, son las que se usan todos los días: la estructura se define una vez con CREATE TABLE y después se pasa años usando estas cuatro. Cada una tiene su página en esta unidad, y en cada una se ve la sentencia y el código PHP que la ejecuta.
CRUD y los métodos de envío
Si el sistema se maneja desde el navegador —que es el caso de esta unidad—, cada operación se dispara con una petición, y ahí vuelve a aparecer la regla de la Unidad 2: GET para pedir, POST para cambiar.
| Operación | Método | Por qué |
|---|---|---|
| Listado | GET |
No cambia nada. Los filtros pueden ir en la dirección, y así el listado se puede guardar en favoritos y compartir. |
| Alta | POST |
Crea una fila. Repetir la petición crearía otra. |
| Modificación | POST |
Cambia datos. No debe poder dispararse con solo visitar una dirección. |
| Baja | POST |
Y con más razón que ninguna: es la única que destruye información. |
La tentación de hacer la baja con un enlace —/socios/borrar?id=7, apretando «Eliminar»— es fuerte, porque es más fácil de programar. Y es un error grave, por lo que se explicó en la Unidad 2: cualquier programa que recorra los enlaces de un sitio va a borrar todo lo que encuentre. Una baja se dispara con un envío de formulario, nunca con un clic en un enlace.
Por qué son cuatro y no otra cantidad
No es una lista arbitraria ni una convención de un fabricante. Son cuatro porque son todas las cosas que le pueden pasar a un dato guardado: puede empezar a existir, puede leerse, puede cambiar, y puede dejar de existir. No hay una quinta posibilidad.
De ahí sale la observación que hace útil al concepto. Cualquier sistema que maneje datos, por grande y complicado que sea, es un CRUD: un sistema de facturación, un aula virtual, una red social, el sistema de una obra social. Pueden tener más tablas, más pantallas, más usuarios, más permisos, más reportes y más reglas. Pero cada operación que hacen sobre un dato cae en una de las cuatro categorías. Visto desde abajo, todos son lo mismo.
Y de ahí sale también el criterio para saber si un sistema está terminado: si tiene las cuatro operaciones completas, tiene todo lo necesario. Si le falta una, no sirve. Un sistema que muestra los socios y permite agregarlos, pero no permite corregir un dato mal cargado, obliga a llevar el control por otro lado, y eso lo vuelve inservible a la larga. Esa es la vara con la que se mide el proyecto de esta unidad.
Un ejemplo completo: la tienda del CRUD
Las cuatro operaciones se ven mejor en un sistema chico y completo que en cuatro ejemplos sueltos. En este tema se usan varios ejemplos a propósito —la biblioteca de la unidad anterior y, acá, una tienda—: cada uno muestra la misma idea en otro terreno, y eso ayuda a quedarse con lo que se repite en todos. Uno de ellos es este CRUD de productos: una sola tabla, unos pocos archivos, y las cuatro operaciones funcionando de punta a punta. No es «el» ejemplo del tema: es el único de los dos que está completo y se puede ejecutar, y por eso sirve para mostrar cómo se ve todo junto y qué pasa cuando algo falla.
| Archivo | Operación | Qué hace |
|---|---|---|
conexion.php | — | Se conecta a la base tienda con PDO. Lo incluyen todos los demás, así que la conexión se escribe una sola vez. |
index.php | — | El menú del sistema: los botones de entrada. |
crear.php | Alta (C) | El formulario y el INSERT que agrega un producto. |
ver.php | Listado (R) | La tabla con todos los productos, y los botones de cada fila. |
modificar.php | Modificación (U) | Busca un producto, muestra el formulario con sus datos y guarda los cambios. |
eliminar.php | Baja (D) | Borra el producto y vuelve al listado. |
tienda.sql | — | El volcado: crea la base, la tabla productos y un producto de prueba. |
styles.css | — | Los estilos propios. El resto del aspecto lo aporta Bootstrap. |
El menú, que es la puerta de entrada al sistema, ofrece solo dos opciones:
Las otras dos operaciones no aparecen en el menú, y no es un olvido: no se puede modificar ni borrar algo que no se está viendo. A modificar y a eliminar se llega desde el listado, apretando el botón que está en la fila del producto. Es la misma observación que aparecía al hablar de ABM, ahora en la pantalla: el listado es el centro del sistema.
Qué pasa si se usa el CRUD sin la base
Es lo primero que le pasa a cualquiera que copia el proyecto y lo abre: no funciona. Y conviene entender el porqué, porque el error que aparece no dice lo que parece decir.
Para que el sistema ande hacen falta tres cosas, y cada una falta de una manera distinta:
| Qué falta | Qué se ve | Qué significa |
|---|---|---|
| Apache detenido | El navegador no abre la página: avisa que no puede acceder al sitio. | No hay servidor web. PHP nunca llega a ejecutarse, así que la base no tiene nada que ver. |
| MariaDB detenido | Un error que dice que no se pudo conectar con el servidor de bases. | El new PDO(...) no puede establecerse. La base puede estar bien: el problema es que nadie atiende el puerto. |
La base tienda | SQLSTATE[HY000] [1049] Unknown database 'tienda' | La conexión se estableció, pero esa base no existe. Hay que crearla o importar el volcado. |
La tabla productos | 1146 Table 'tienda.productos' doesn't exist | La base existe, la tabla no. Falta ejecutar la parte del volcado que la crea. |
| Los datos de conexión | SQLSTATE[HY000] [1045] Access denied for user 'usuario'@'localhost' | El usuario o la clave no son los que espera la base: la conexión fue rechazada. |
El 1049 es el caso más común, porque es el que aparece cuando alguien copia la carpeta del proyecto pero no importa la base:
Hay dos cosas que llaman la atención de esa captura, y las dos enseñan algo:
- El error aparece dentro de la página, no en una pantalla aparte. Es consecuencia de cómo está escrito
conexion.php: el error se muestra conechoy el programa sigue, como si nada hubiera pasado. Unos pasos más adelante, cuando intenta usar la variable de la conexión —que nunca llegó a crearse—, el programa muere ahí. Por eso la página queda a medias: gris, sin estilos, con el menú cortado. El error real ocurrió al principio, pero el desastre se ve al final. (Mostrar el mensaje y seguir es útil mientras se aprende, porque deja ver qué pasó; la alternativa, más prolija, es cortar ahí mismo: en lugar de mostrar el mensaje y continuar, terminar el programa condie(). Así no queda una página rota a medias.) - El listado nunca llegó a dibujarse. Y acá está la lección más importante de todo esto: si los errores pasaran en silencio en lugar de interrumpir, la consulta no devolvería nada y se vería una tabla vacía. La pantalla se vería «normal». Y cualquiera concluiría que no hay productos cargados, cuando en realidad el problema es que no se puede leer nada. «No hay datos» y «no puedo leer los datos» se ven parecidos y son cosas completamente distintas.
La solución es la que indica el propio proyecto: crear la base tienda e importar tienda.sql —desde phpMyAdmin, con la pestaña Importar— antes de abrir el sistema. Y si el mensaje es el de la conexión, revisar en el panel de XAMPP que MariaDB esté arrancado.
Resumen
- CRUD son las cuatro operaciones básicas sobre datos: Create, Read, Update y Delete.
- En español se las llama altas, listado, modificaciones y bajas, y la sigla equivalente es ABM.
- Cada una tiene su instrucción:
INSERT INTO,SELECT,UPDATEyDELETE FROM. - Tres de las cuatro cambian los datos; solo la lectura es inofensiva.
- La sigla ABM no menciona el listado porque se da por supuesto: sin listado no se llega a modificar ni a dar de baja.
- En la web, el listado va con
GETy las otras tres conPOST. - Una baja nunca se dispara con un enlace.
- Son cuatro porque son todas las cosas que le pueden pasar a un dato. Cualquier sistema de datos es un CRUD.
- Un sistema está terminado cuando las cuatro operaciones están completas.