En la empresa tecnológica SysTech, Ana, una desarrolladora junior, enfrenta el reto de crear una plataforma para un cliente especializado en la gestión de eventos culturales. El cliente necesita una aplicación que permita a los usuarios registrar eventos, comprar entradas y recibir notificaciones de eventos próximos. Para resolver la necesidad de gestionar datos eficientemente, Ana decide usar bases de datos mediante un sistema gestor de bases de datos (SGBD). Entre las opciones disponibles, elige MariaDB, que viene incorporado en XAMPP, por su robustez y por ser ampliamente reconocido en la comunidad de desarrolladores.
A continuación, Ana evalúa las opciones para la interacción entre PHP y la base de datos, considerando MySQLi y PDO. Finalmente, decide utilizar PDO debido a su versatilidad para trabajar con diferentes bases de datos y su eficiente manejo de errores. Implementa consultas preparadas para prevenir inyecciones SQL y se asegura de que los resultados se manejen de forma segura para su presentación en la interfaz de usuario. Además, Ana implementa medidas de seguridad como la sanitización de entradas para evitar ataques XSS y la validación estricta de todos los datos proporcionados por los usuarios, garantizando así la seguridad y la integridad de los datos en la plataforma.
La gestión de bases de datos es clave para el desarrollo de aplicaciones web interactivas, dinámicas con una sólida persistencia de la información. PHP ofrece diversas extensiones que optimizan la interacción con bases de datos, permitiendo desde simples recuperaciones de datos hasta operaciones complejas, mejorando así la comunicación entre la aplicación web y la base de datos.
En esta unidad se realizará una breve introducción a la base de datos y, luego, se abordará el uso de MySQL y MariaDB con PHP, incluyendo la instalación, configuración y herramientas de administración como phpMyAdmin. Se explorará primero la extensión MySQLi para realizar conexiones, preparar y ejecutar consultas, y manejar resultados. Posteriormente, se estudiará PDO por su capacidad de trabajar con diferentes bases de datos mediante una interfaz uniforme. Además, se enfatizará en la importancia de la seguridad en la gestión de bases de datos, destacando técnicas contra la inyección SQL y XSS para proteger las aplicaciones web.
MySQLi (MySQL Improved) es una extensión de PHP que permite interactuar con bases de datos MySQL. Proporciona una interfaz mejorada con soporte para funciones avanzadas como operaciones preparadas, múltiples declaraciones, y transacciones, mejorando seguridad y rendimiento respecto a la antigua extensión MySQL.
MySQL es un Sistema de Gestor de Bases de Datos (SGBD) relacional de código abierto, conocido por su alto rendimiento, fiabilidad y facilidad de uso. Es ampliamente utilizado en aplicaciones web y se basa en el lenguaje SQL para gestionar, almacenar y recuperar datos.
MariaDB es un Sistema Gestor de Bases de Datos (SGBD) relacional derivado de MySQL. Es de código abierto y ofrece alta compatibilidad con MySQL, junto con alto rendimiento, escalabilidad y seguridad. Además, cuenta con funcionalidades adicionales y actualizaciones frecuentes.
PHP (acrónimo recursivo de PHP: Hypertext Preprocessor) es un lenguaje de programación de código abierto del lado del servidor, utilizado principalmente para el desarrollo web. Permite crear contenido dinámico en páginas y aplicaciones web, facilitando la conexión a bases de datos y el manejo de formularios.
PDO (PHP Data Objects) es una extensión de PHP que define una interfaz ligera y consistente para acceder a bases de datos en PHP. Proporciona una capa de abstracción que permite interactuar con diferentes Sistemas Gestores de Bases de Datos (SGBD) usando el mismo código.
XSS (Cross-Site Scripting) es una vulnerabilidad de seguridad en aplicaciones web donde un atacante inyecta 'scripts' maliciosos en contenido confiable, permitiendo ejecutar código en el navegador del usuario, robar información sensible y alterar la interacción con la aplicación.
"All models are wrong, but some are useful" - "Todos los modelos son incorrectos, pero algunos son útiles".
George E. P. Box, estadístico británico, en un artículo de 1976 publicado en el Journal of the American Statistical Association.
La frase de George E. P. Box subraya una premisa en el modelado aplicable al campo de las bases de datos. Cualquier modelo de datos, por muy sofisticado o detallado que sea, es una simplificación de la realidad y, por tanto, nunca será completamente exacto o perfecto. Sin embargo, a pesar de sus imperfecciones, un modelo de datos puede ser extremadamente valioso si se ajusta adecuadamente a los objetivos y necesidades del negocio. La clave está en encontrar un equilibrio entre la complejidad del modelo y su aplicabilidad práctica.
Lucas, comenzando su carrera como trabajador independiente, enfrenta su primer gran proyecto: desarrollar una aplicación web para una empresa que gestiona soluciones tecnológicas. Sin experiencia previa en bases de datos, Lucas inicia su aprendizaje desde cero sobre cómo funcionan, para poder manejar eficientemente los datos de servicios y clientes. Para ello, empieza por estudiar los conceptos básicos y características fundamentales de las bases de datos, lo que le ayuda a entender la importancia de una estructura adecuada para almacenar, manipular y proteger información crítica.
A medida que avanza, Lucas comprende la importancia de seleccionar el Sistema Gestor de Bases de Datos (SGBD) adecuado para sus necesidades. Opta por MySQL debido a su solidez y aceptación en la comunidad de desarrolladores. Progresa aprendiendo sobre modelos de datos y diseño de bases de datos, habilidades muy importantes para construir una estructura eficiente y escalable que soporte las necesidades actuales y futuras del cliente. El desafío final de Lucas es diseñar un modelo de base de datos adecuado y luego implementar dicho modelo, asegurando que la aplicación que desarrolla sea tanto funcional como segura, preparándola para entregar un producto que cumpla con las expectativas de la empresa y sus propios estándares de calidad.
Una base de datos es un sistema organizado de información o datos almacenados de manera persistente en un ordenador. Estos datos son accesibles y gestionables a través de Sistemas Gestores de Bases de Datos (SGBD). Un SGBD permite realizar diversas operaciones sobre los datos, como la inserción, modificación, eliminación y consulta de información, facilitando la administración de grandes volúmenes de datos de manera eficiente y segura. Los modelos de datos proporcionan las abstracciones necesarias para definir la estructura de una base de datos y las relaciones entre los datos. Por último, los modelos de bases de datos ofrecen un marco que permiten implementar estas estructuras y relaciones de manera efectiva, adaptándose a las necesidades específicas de cada tipo de aplicación.
El proceso de desarrollo de una base de datos comienza con la fase de ánalisis de un problema, donde se identifican las necesidades de información del sistema a desarrollar. Posteriormente, se realiza el diseño conceptual, que se refleja en un modelo de base de datos que describe la estructura y las restricciones de los datos a manejar. Este modelo se transforma luego en un diseño lógico, adecuado al SGBD específico a utilizar. La última fase es la del diseño físico, que consiste en la implementación o creación física de la base de datos en el sistema elegido, utilizando lenguajes específicos como SQL para definir estructuras y manipular los datos. Este flujo asegura que las bases de datos sean robustas, escalables y alineadas con los requisitos del sistema que las soporta.
Un Sistema Gestor de Bases de Datos (SGBD) es un software que permite la creación, administración y manipulación de bases de datos, facilitando el almacenamiento, recuperación y gestión de datos de manera eficiente y segura.
SQL (Structured Query Language) es un lenguaje de programación estándar utilizado para gestionar y manipular bases de datos relacionales. Permite realizar operaciones como consultas, inserciones, actualizaciones y eliminaciones de datos, así como la creación y modificación de la estructura de las bases de datos.
En informática, un dato se define como un elemento de información dispuesto de manera adecuada para su tratamiento por un computador. Esta disposición permite que los datos sean procesados, analizados y almacenados de forma eficiente por sistemas automatizados.
Una base de datos se define como una colección organizada de datos que se relacionan entre sí y están estructurados de manera que faciliten su gestión, acceso, y actualización. Este conjunto de datos se almacena sistemáticamente para su uso por computadoras y usuarios, y se diseña de manera que sea fácil de administrar, recuperar y actualizar.
Una característica de las bases de datos es su capacidad para relacionar datos entre sí, lo que permite consultas complejas y el análisis interrelacional de la información. Esta capacidad hace que las bases de datos sean extremadamente versátiles y eficaces en entornos que requieren la obtención precisa de conocimientos derivados de grandes cantidades de datos.
Otra característica de las bases de datos es la estructura de los datos que manejan. Las bases de datos están organizadas en estructuras específicas, como tablas en el caso de bases de datos relacionales, documentos en bases de datos NoSQL, o nodos y aristas en bases de datos de grafos. Estas estructuras definen cómo se almacenan, se relacionan y se accede a los datos, influyendo directamente en la eficiencia de las operaciones de la base de datos y en la manera en que los datos pueden ser consultados y manipulados.
Una característica moderna de las bases de datos es su capacidad para manejardiversos tipos de datos. En la actualidad, pueden almacenar una amplia variedad de tipos, desde texto y números hasta formatos más complejos como imágenes, audio, vídeo y datos geoespaciales. Este soporte diversificado permite que las bases de datos se utilicen en una vasta gama de aplicaciones, desde sistemas de información geográfica hasta plataformas de redes sociales, facilitando así una integración más rica y profunda de la información.
NoSQL es un tipo de Sistema Gestor de Bases de Datos (SGBD) que no utiliza el modelo relacional tradicional. Es ideal para manejar grandes volúmenes de datos no estructurados o semiestructurados, y se caracteriza por su flexibilidad, escalabilidad y alto rendimiento.
¿Por qué es importante que los datos en una base de datos puedan relacionarse entre sí? ¿Cómo influye esta capacidad en la calidad y utilidad de la información obtenida?
Un Sistema Gestor de Bases de Datos (SGBD) es un software encargado de proporcionar métodos eficientes para almacenar, recuperar y gestionar datos en bases de datos. Su objetivo principal es facilitar la manipulación de la información y asegurar la integridad, confidencialidad y disponibilidad de los datos almacenados.
Los SGBD permiten a los usuarios crear, leer, actualizar y eliminar datos (CRUD) mediante un lenguaje de consulta, como SQL, que es ampliamente utilizado para gestionar bases de datos. Estos sistemas ofrecen herramientas para respaldo, recuperación, seguridad y análisis, facilitando así el manejo de grandes volúmenes de información y la interacción con múltiples usuarios simultáneamente.
Una variante importante de los SGBD son los Sistemas Gestores de Bases de Datos Relacionales (SGBDR), que organizan los datos en tablas relacionadas entre sí por medio de claves. Este modelo permite una flexibilidad considerable en el diseño de la base de datos y es esencial para el desarrollo de aplicaciones que requieren un alto grado de interrelación entre los datos.
Entre los SGBD más destacados se encuentran:
Oracle Database: predominante en grandes empresas debido a su capacidad para manejar altos volúmenes de datos y transacciones complejas. Oracle soporta una amplia gama de tecnologías de almacenamiento de datos, incluyendo grids y cloud computing. Además, proporciona funcionalidades avanzadas como particionamiento, clustering, y recuperación ante desastres, lo que lo convierte en una solución robusta para entornos críticos de negocio.
PostgreSQL: este SGBD de código abierto es apreciado por su conformidad con los estándares SQL y su capacidad para ser extendido por los usuarios mediante tipos de datos y funciones personalizadas. PostgreSQL es ideal para aplicaciones que requieren la manipulación de grandes datasets y ofrece soporte para índices avanzados, búsquedas full-text y transacciones a nivel de fila.
MySQL: destacado por su velocidad y facilidad de uso, MySQL es una opción popular para el desarrollo de aplicaciones web y está integrado en muchas plataformas de hosting. Ofrece una configuración sencilla y una vasta comunidad de usuarios. Además, su compatibilidad con numerosos sistemas operativos y lenguajes de programación lo convierten en una herramienta versátil para desarrolladores.
MariaDB: nacido como un fork de MySQL, MariaDB ha evolucionado para ofrecer características propias como una mejorada velocidad de consulta y soporte para motores de almacenamiento adicionales. Es compatible con la API de MySQL, lo que permite a las aplicaciones escritas para MySQL operar en MariaDB sin modificaciones. Su desarrollo es liderado por la comunidad y continúa enfocado en la apertura y la mejora de performance.
Microsoft SQL Server: muy utilizado en corporaciones que integran aplicaciones en el ecosistema Microsoft. Ofrece una integración profunda con herramientas como Microsoft Azure y .NET, y posee capacidades de business intelligence y análisis en tiempo real a través de SQL Server Analysis Services (SSAS) y Reporting Services (SSRS). Su enfoque en la seguridad y el cumplimiento normativo lo hace una opción confiable para aplicaciones empresariales.
MongoDB: este programa de base de datos orientado a documentos se clasifica dentro de los productos de base de datos NoSQL. MongoDB utiliza documentos en un formato tipo JSON con esquemas opcionales para la organización de los datos, lo que permite una gran flexibilidad en la manipulación y almacenamiento de estructuras de datos complejas. Es particularmente útil para aplicaciones que necesitan almacenar grandes cantidades de datos con estructuras variadas sin un esquema fijo, como pueden ser los datos provenientes de aplicaciones móviles, contenido web o integraciones de IoT.
NoSQL es un tipo de Sistema Gestor de Bases de Datos (SGBD) que no utiliza el modelo relacional tradicional. Es ideal para manejar grandes volúmenes de datos no estructurados o semiestructurados, y se caracteriza por su flexibilidad, escalabilidad y alto rendimiento.
CRUD es un acrónimo que describe las cuatro operaciones básicas de persistencia en bases de datos y sistemas de información: Create (crear), Read (leer), Update (actualizar) y Delete (eliminar).
SQL (Structured Query Language) es un lenguaje de programación estándar utilizado para gestionar y manipular bases de datos relacionales. Permite realizar operaciones como consultas, inserciones, actualizaciones y eliminaciones de datos, así como la creación y modificación de la estructura de las bases de datos.
Un SGBDR (Sistema Gestor de Bases de Datos Relacional) es un software que permite crear, gestionar y manipular bases de datos relacionales. Utiliza tablas para organizar datos y permite realizar consultas complejas mediante un lenguaje como SQL, garantizando integridad y eficiencia en la gestión de la información.
SSAS (SQL Server Analysis Services) es una herramienta de Microsoft para crear y gestionar soluciones de análisis de datos y minería de datos. Permite construir modelos multidimensionales y tabulares para consultas, análisis e informes avanzados.
SQL Server Reporting Services (SSRS) es una herramienta de Microsoft para crear, gestionar y entregar informes tabulares, gráficos y de libre formato desde fuentes de datos relacionales y multidimensionales. Facilita la visualización y el análisis de datos empresariales en distintos formatos.
Una API (Application Programming Interface) es un conjunto de reglas y protocolos que permite la comunicación entre diferentes aplicaciones de software, facilitando el intercambio de datos y funcionalidades de manera estructurada y predefinida.
IoT (Internet of Things) es una red de dispositivos físicos conectados a internet, que recopilan y comparten datos mediante sensores y software, permitiendo una interacción y automatización avanzada sin intervención humana.
Un modelo de datos es una representación abstracta y estructurada de la información en un sistema. Define cómo se organiza, almacena, manipula y recupera la información, incluyendo las relaciones entre los distintos tipos de datos.
El modelo entidad-relación es un tipo de modelo de datos ampliamente utilizado para estructurar y diseñar bases de datos. Este modelo representa los datos como entidades, que son objetos o conceptos con una existencia distinguible e independiente, y como relaciones, que son asociaciones entre estas entidades. Cada entidad se describe mediante atributos, que son características específicas que definen a la entidad.
Una entidad es un objeto o concepto con una existencia distinguible e independiente dentro del dominio del problema y que se pretende representar en un modelo de datos para reflejar sus características y relaciones.
En el modelado de datos, los atributos son las características o propiedades que definen y describen las entidades dentro de una base de datos. Los tipos más importantes de atributos atendiendo a su funcionalidad son:
Clave: un atributo de clave simple está formado por un solo atributo que identifica de manera única a cada instancia de una entidad, como el número de identificación personal. Por otro lado, los atributos de clave compuesta están formados por la combinación de dos o más atributos que, en conjunto, identifican de manera única a cada instancia de una entidad, como el número de serie del producto y la fecha de fabricación para identificar un artículo específico en una línea de producción.
Descriptivos: los atributos descriptivos son aquellos que proporcionan información adicional sobre las características o cualidades de una entidad. Estos atributos ayudan a proporcionar un contexto más amplio o detalles que caracterizan a la entidad. Ejemplo: la descripción de un producto en un catálogo, que puede incluir detalles sobre materiales, dimensiones, y características especiales.
Las relaciones de un modelo de datos definen cómo las entidades se asocian entre sí dentro de una base de datos. Estas asociaciones permiten comprender la interacción entre las entidades. Los tipos más importantes de relaciones son:
De uno a uno (1:1): una relación uno a uno ocurre cuando cada instancia en una entidad está asociada a una única instancia en otra entidad. Ejemplo: cada licencia de conducir está vinculada a un único conductor.
De uno a varios (1:N): una relación uno a varios se da cuando una instancia en una entidad puede estar asociada con múltiples instancias en otra entidad, pero esas múltiples instancias no están asociadas a más de una instancia en la primera entidad. Ejemplo: un gerente supervisa a varios empleados.
De varios a varios (N:M): una relación varios a varios ocurre cuando múltiples instancias en una entidad pueden estar asociadas con múltiples instancias en otra entidad. Ejemplo: un autor puede escribir varios libros y cada libro puede tener varios autores.
En el modelado de datos, las cardinalidades definen las relaciones entre entidades y especifican cuántas instancias de una entidad pueden estar asociadas con instancias de otra entidad. Aquí están las cardinalidades más comunes en un modelo de datos:
(0, 1): cardinalidad de tipo opcional y singular. Una entidad en un extremo de la relación puede tener una relación con cero o una entidad en el otro extremo. Ejemplo: un empleado puede tener cero o un vehículo asignado.
(1, 1): cardinalidad de tipo obligatorio y singular. Una entidad en un extremo de la relación debe tener una relación con exactamente una entidad en el otro extremo. Ejemplo: un empleado tiene exactamente un número de seguro social.
(0, n): cardinalidad de tipo opcional y plural. Una entidad en un extremo de la relación puede tener una relación con cero o más entidades en el otro extremo. Ejemplo: un cliente puede no tener ninguna reserva o puede tener una o más reservas en un hotel.
(1, n): cardinalidad de tipo obligatorio y plural. Una entidad en un extremo de la relación debe tener una relación con una o más entidades en el otro extremo. Ejemplo: un padre tiene al menos un hijo.
(n, m): cardinalidad de tipo plural en ambos extremos. Una entidad en un extremo de la relación puede tener una relación con múltiples entidades en el otro extremo, y viceversa. Ejemplo: un libro puede ser escrito por varios autores y, a su vez, cada autor puede escribir varios libros.
A continuación, se muestra un ejemplo básico de un modelo de datos representado en un diagrama entidad-relación:
Elaboración propia. Diagrama E-R de ejemplo sobre reservas de vuelo(CC BY-SA)
En este modelo de datos, un viajero se vincula a un solo pasaporte, y un pasaporte solo está vinculado a un viajero. Un viajero puede realizar cero o más reservas, y cada reserva solo puede ser realizada por un viajero. Cada reserva puede incluir uno o más vuelos, y cada vuelo puede estar incluido en cero o más reservas. En el diagrama, los atributos clave se muestran con círculos negros y los atributos descriptivos con círculos blancos.
Diseña un modelo de datos y represéntalo en un diagrama entidad-relación para una base de datos escolar que gestione la información de los alumnos, profesores y asignaturas. El objetivo es estructurar los datos de manera que se puedan organizar, almacenar, manipular y recuperar eficientemente, reflejando las relaciones entre estos elementos.
El modelo debe contemplar las siguientes consideraciones:
Cada alumno debe tener un identificador (id), nombre y correo electrónico.
Cada profesor debe tener un identificador (id), nombre y especialidad.
Cada asignatura debe tener un identificador (id), nombre y créditos (número de horas lectivas).
Un alumno cursa una o más asignaturas, y una asignatura puede ser cursada por uno o más alumnos; en dicha relación se debe registrar el año académico en que están cursando.
Un profesor imparte una o más asignaturas, y una asignatura es impartida por un solo profesor.
Un modelo de base de datos es una representación estructurada de cómo se almacenan, organizan y manipulan los datos en un Sistema Gestor de Bases de Datos (SGBD). Este modelo define la estructura lógica y física de la base de datos y establece las relaciones entre los distintos tipos de datos. Los modelos de bases de datos más comunes incluyen el modelo relacional, el modelo de red y el modelo jerárquico, aunque el modelo relacional es el más utilizado debido a su simplicidad y flexibilidad.
El modelo relacional es un paradigma para gestionar bases de datos donde los datos se organizan en tablas (también llamadas relaciones). Cada tabla está compuesta por filas y columnas, donde cada fila representa un registro único y cada columna representa un atributo del registro. Este modelo fue propuesto por Edgar F. Codd en 1970 y se basa en la teoría de conjuntos y la lógica de predicados.
En una base de datos relacional, las tablas están relacionadas entre sí mediante claves primarias y claves foráneas. La clave primaria es un atributo o un conjunto de atributos que identifican de manera única cada registro en una tabla, mientras que la clave foránea es un atributo en una tabla que hace referencia a la clave primaria de otra tabla, estableciendo así una relación entre ambas.
Para transformar un modelo entidad-relación a un modelo relacional, se siguen estos pasos:
Entidades a tablas: cada entidad del modelo entidad-relación se transforma en una tabla en el modelo relacional. Los atributos clave de la entidad se convierte en la clave primaria de la tabla correspondiente.
Relaciones N-M: las relaciones varios a varios (N:M) siempre generan una nueva tabla. Esta nueva tabla incluye las claves foráneas que corresponden a las claves primarias de las entidades involucradas en la relación. Dichas claves foráneas también son clave primaria en la nueva tabla. Además, si la relación tiene atributos propios, estos se incluyen en esta nueva tabla.
Relaciones 1-N: generalmente, no se crea una nueva tabla para las relaciones uno a varios (1:N). Solo si la entidad del lado 1 tiene una cardinalidad opcional y singular (0,1), se crea una nueva tabla que incluye las claves foráneas de ambas entidades y la clave primaria de esta nueva tabla será la clave de la entidad del lado N. En los demás casos, la clave de la entidad del lado 1 se añade como clave foránea en la tabla de la entidad del lado N. Los atributos propios de la relación se añaden a la tabla que recibe la clave foránea.
Relaciones 1-1: las relaciones uno a uno (1:1) no suelen generar una nueva tabla. Solo si ambas entidades tienen una cardinalidad opcional y singular (0,1), se crea una nueva tabla para la relación. En dicha tabla se añaden como claves foráneas las claves primarias de ambas entidades, y una de estas claves foráneas forma la clave primaria de la nueva tabla. Si una entidad tiene una cardinalidad opcional y singular (0,1) pero la otra tiene cardinalidad obligatoria y singular (1,1), la clave de la entidad con cardinalidad obligatoria se añade como clave foránea en la entidad con cardinalidad opcional. Si ambas entidades tienen cardinalidad obligatoria y singular (1,1), se elige una clave primaria y se añade como clave foránea en la otra entidad. Los atributos de la relación se añaden a la tabla que recibe la clave foránea.
La normalización es el proceso de organizar los datos en una base de datos para reducir la redundancia y mejorar la integridad de los datos. Este proceso se lleva a cabo mediante la aplicación de una serie de reglas denominadas formas normales (FN). Las tres primeras formas normales son las más comúnmente utilizadas:
Primera Forma Normal (FN1): una tabla está en FN1 si todos los valores de sus columnas son atómicos, es decir, cada columna contiene solo un valor indivisible. Esto elimina los grupos repetitivos y las listas de valores dentro de una sola columna. Un ejemplo sería una tabla Clientes con las columnas id_cliente, nombre, teléfonos. Para estar en FN1, se debe dividir teléfonos en múltiples registros con una sola entrada por fila.
Segunda Forma Normal (FN2): una tabla está en FN2 si cumple con FN1 y además todos los atributos no clave dependen totalmente de la clave primaria. Esto significa que no debe haber dependencias parciales, donde un atributo depende solo de una parte de una clave primaria compuesta. Un ejemplo sería una tabla Pedidos con las columnas id_pedido y id_producto como clave primaria compuesta, y las columnas nombre_producto y cantidad como atributos no clave. Para estar en FN2, nombre_producto debe ser movido a la tabla Productos ya que depende solo de id_producto.
Tercera Forma Normal (FN3): una tabla está en FN3 si cumple con FN2 y además todos los atributos no clave son mutuamente independientes. Es decir, no debe haber dependencias transitivas, donde un atributo no clave depende de otro atributo no clave. Un ejemplo sería una tabla Clientes con la columna id_cliente como clave primaria y las columnas nombre_cliente, id_ciudad y nombre_ciudad como atributos no clave. Para estar en FN3, nombre_ciudad debe ser movido a una tabla Ciudades ya que depende de id_ciudad, no directamente de id_cliente.
La aplicación de estas formas normales asegura que los datos estén organizados de manera eficiente, minimizando la redundancia y el riesgo de inconsistencias, lo que facilita la integridad y la eficiencia del sistema de bases de datos.
A continuación, se muestra un ejemplo básico de un modelo relacional, transformado a partir del modelo de datos de la sección anterior, mediante el siguiente esquema relacional:
Elaboración propia. Esquema relacional de ejemplo sobre reservas de vuelo(CC BY-SA)
En este modelo relacional los símbolos 1 y * indican las cardinalidades uno y varios, respectivamente. Cada tabla tiene una clave primaria denominada id, que es un identificador único para cada registro, excepto la tabla intermedia reserva_vuelo que utiliza una clave primaria compuesta. Las claves foráneas, como viajero_id y reserva_id, son las que establecen las relaciones entre las tablas. La cláusula UNQ significa que el campo es único y no puede repetirse, mientras que NN (NOT NULL) indica que el campo no puede estar vacío. Por ejemplo, en la tabla pasaportes, el campo viajero_id es único y no puede ser nulo, indicando que cada pasaporte está vinculado a un solo viajero específico.
Un SGDB (Sistema Gestor de Bases de Datos) es un software que permite crear, administrar y gestionar bases de datos, facilitando la organización, almacenamiento, consulta y manipulación de datos de manera eficiente y segura.
A partir de la propuesta del modelo de datos presentada en el ejercicio resuelto de la sección anterior, transfórmala a un modelo relacional normalizado y represéntala en un esquema relacional.
La implementación de bases de datos, también conocida como diseño físico, es la fase en la que se traduce el modelo lógico de la base de datos en una estructura física en un Sistema Gestor de Bases de Datos (SGBD). En esta etapa se definen las estructuras de almacenamiento y los métodos de acceso, lo cual implica la creación de tablas, claves foráneas y restricciones de integridad. Actualmente, la herramienta más utilizada para la implementación de bases de datos es SQL, que permite implementar un modelo relacional de manera eficiente y efectiva.
Para implementar una base de datos relacional previamente modelada, se utilizan diversos comandos de SQL. A continuación, se describen algunos de los comandos más importantes.
El elemento central para implementar una base de datos en SQL es la creación de tablas. Se utiliza el comando CREATE TABLE para definir una tabla, especificando sus columnas y tipos de datos:
CREATE TABLE usuarios (
id INT AUTO_INCREMENT PRIMARY KEY,
nombre VARCHAR(50) NOT NULL,
correo VARCHAR(100) UNIQUE,
fecha_registro DATE
);
En este ejemplo, se crea una tabla llamada usuarios con cuatro columnas: id, nombre, correo y fecha_registro. La columna id es la clave primaria y se autoincrementa, nombre es una cadena de hasta 50 caracteres y no puede ser nula, correo es una cadena de hasta 100 caracteres y debe ser única, y fecha_registro es de tipo fecha.
Las claves foráneas se utilizan para establecer relaciones entre tablas, garantizando la integridad referencial:
CREATE TABLE pedidos (
id INT AUTO_INCREMENT PRIMARY KEY,
usuario_id INT,
fecha_pedido DATE,
FOREIGN KEY (usuario_id) REFERENCES usuarios(id)
);
En este ejemplo, se crea una tabla pedidos con una columna usuario_id que es una clave foránea referenciando la columna id de la tabla usuarios. Esto asegura que cada pedido esté asociado a un usuario existente, permitiendo una relación de uno a varios (1:N) entre usuarios y pedidos.
Para manejar relaciones varios a varios (N:M), se crea una tabla intermedia que contiene las claves foráneas de ambas tablas relacionadas:
En este ejemplo, se crea una tabla intermedia usuario_rol para gestionar la relación entre usuarios y roles. La tabla usuario_rol tiene dos columnas, usuario_id y rol_id, que son claves foráneas referenciando a usuarios y roles, respectivamente. Además, la clave primaria compuesta asegura que no haya duplicados en la combinación de usuario_id y rol_id. Para definir los diferentes roles en la base de datos, se crea una tabla roles:
CREATE TABLE roles (
id INT AUTO_INCREMENT PRIMARY KEY,
nombre VARCHAR(50) NOT NULL UNIQUE
);
En este ejemplo, se crea una tabla llamada roles con dos columnas: id y nombre. La columna id es la clave primaria y se autoincrementa, y nombre es una cadena de hasta 50 caracteres que debe ser única y no puede ser nula.
Para insertar datos en una tabla se utiliza el comando INSERT INTO:
Este comando inserta un nuevo registro en la tabla usuarios con el nombre Juan Pérez, correo juan.perez@example.com, y fecha de registro 2024-05-14.
Para actualizar datos existentes, se utiliza el comando UPDATE:
UPDATE usuarios SET correo = 'juan.perez@nuevoemail.com' WHERE id = 1;
Este comando actualiza el correo del usuario con id igual a 1.
Para eliminar datos de una tabla, se utiliza el comando DELETE:
DELETE FROM usuarios WHERE id = 1;
Este comando elimina el registro del usuario con id igual a 1.
Para realizar consultas y recuperar datos de la base de datos, se utiliza el comando SELECT:
SELECT nombre, correo FROM usuarios WHERE fecha_registro > '2024-01-01';
Este comando selecciona y muestra el nombre y correo de los usuarios que se registraron después del 1 de enero de 2024.
A continuación, se muestra un ejemplo básico de un modelo implementado en SQL a partir del modelo relacional descrito en la sección anterior:
CREATE TABLE viajeros (
id INT PRIMARY KEY,
nombre VARCHAR(100),
teléfono VARCHAR(15)
);
CREATE TABLE pasaportes (
id INT PRIMARY KEY,
país VARCHAR(50),
fecha_expiración DATE,
viajero_id INT UNIQUE NOT NULL,
FOREIGN KEY (viajero_id) REFERENCES viajeros(id)
);
CREATE TABLE reservas (
id INT PRIMARY KEY,
fecha_registro DATE,
estado_actual VARCHAR(50),
viajero_id INT NOT NULL,
FOREIGN KEY (viajero_id) REFERENCES viajeros(id)
);
CREATE TABLE vuelos (
id INT PRIMARY KEY,
fecha_salida DATE,
destino VARCHAR(100)
);
CREATE TABLE reserva_vuelo (
reserva_id INT,
vuelo_id INT,
clase_servicio VARCHAR(20),
PRIMARY KEY (reserva_id, vuelo_id),
FOREIGN KEY (reserva_id) REFERENCES reservas(id),
FOREIGN KEY (vuelo_id) REFERENCES vuelos(id)
);
Un SGDB (Sistema Gestor de Bases de Datos) es un software que permite crear, administrar y gestionar bases de datos, facilitando la organización, almacenamiento, consulta y manipulación de datos de manera eficiente y segura.
SQL (Structured Query Language) es un lenguaje de programación estándar utilizado para gestionar y manipular bases de datos relacionales. Permite realizar operaciones como consultas, inserciones, actualizaciones y eliminaciones de datos, así como la creación y modificación de la estructura de las bases de datos.
En la empresa emergente de desarrollo web Innovatech, Elena, una experimentada administradora de bases de datos, se encarga de guiar a Carlos, un desarrollador recién incorporado al equipo, en la elección y configuración de un SGBD para un nuevo proyecto de comercio electrónico. Tras considerar entre MySQL y MariaDB, ambos ampliamente reconocidos por su robustez, deciden utilizar MariaDB debido a su capacidad para manejar altos volúmenes de transacciones de manera eficiente y segura. Juntos, realizan la instalación de MariaDB en su entorno de desarrollo local, y Elena explica a Carlos los pasos necesarios para una configuración adecuada que soporte las demandas esperadas del sitio web.
A medida que el proyecto avanza, Elena enseña primero a Carlos a usar las herramientas de línea de comandos de MySQL para la administración del servidor y del cliente, lo cual es esencial para entender las operaciones básicas y avanzadas de la base de datos. Posteriormente, introduce a Carlos en el uso de phpMyAdmin, una herramienta más visual que facilita la gestión de la base de datos de manera efectiva. Le muestra cómo monitorear el rendimiento de la base de datos, crear y modificar tablas, y realizar consultas para obtener datos. Con el conocimiento adquirido, Carlos comienza a tomar más responsabilidades, asegurándose de que la base de datos esté optimizada y funcione de manera eficiente, bajo la supervisión atenta de Elena.
MySQL y MariaDB son Sistemas Gestores de Bases de Datos (SGBD) populares y ampliamente utilizados. MySQL, desarrollado originalmente por MySQL AB, es conocido por su rendimiento y fiabilidad. MariaDB es un fork de MySQL creado por la comunidad de código abierto y mantiene compatibilidad con MySQL, pero con mejoras en rendimiento y nuevas funcionalidades.
Para instalar y configurar MariaDB de manera sencilla, se puede realizar mediante XAMPP, un paquete que incluye Apache, MariaDB, PHP y Perl. XAMPP facilita la instalación y configuración de un entorno de desarrollo web completo. Al instalar XAMPP, MariaDB se configura automáticamente, proporcionando una base de datos lista para usar.
XAMPP incluye diversas herramientas de administración. Entre ellas se encuentra phpMyAdmin, una interfaz web que permite gestionar bases de datos de manera gráfica e intuitiva. Esta herramienta facilita tareas como la creación y administración de tablas, la ejecución de consultas y la gestión de usuarios. Además, MariaDB incluye herramientas de línea de comandos como mariadb, mariadb-admin y mariadb-dump, que permiten realizar tareas avanzadas de administración y mantenimiento directamente desde la terminal.
XAMPP es un paquete de software libre que proporciona una solución fácil de instalar para servidores web locales. Incluye Apache, MariaDB, PHP y Perl, permitiendo a los desarrolladores crear y probar aplicaciones web en sus ordenadores personales.
MariaDB es un Sistema Gestor de Bases de Datos (SGBD) relacional derivado de MySQL. Es de código abierto y ofrece alta compatibilidad con MySQL, junto con alto rendimiento, escalabilidad y seguridad. Además, cuenta con funcionalidades adicionales y actualizaciones frecuentes.
MySQL es un Sistema de Gestor de Bases de Datos (SGBD) relacional de código abierto, conocido por su alto rendimiento, fiabilidad y facilidad de uso. Es ampliamente utilizado en aplicaciones web y se basa en el lenguaje SQL para gestionar, almacenar y recuperar datos.
PhpMyAdmin es una herramienta de administración gratuita y de código abierto para MySQL y MariaDB, escrita en PHP, que permite gestionar bases de datos a través de una interfaz web intuitiva.
PHP (acrónimo recursivo de PHP: Hypertext Preprocessor) es un lenguaje de programación de código abierto del lado del servidor, utilizado principalmente para el desarrollo web. Permite crear contenido dinámico en páginas y aplicaciones web, facilitando la conexión a bases de datos y el manejo de formularios.
Si tienes interés en aprender desarrollo web con PHP y MySQL (también aplicable a MariaDB) desde otra perspectiva, se recomienda el Curso de PHP y MySQL desde cero de Coders Free. Este curso destaca por su enfoque didáctico y completo, con explicaciones precisas y ejemplos prácticos. A través de sus lecciones, se aprende a gestionar bases de datos, crear aplicaciones dinámicas y optimizar el rendimiento de las mismas. Puedes ver el primer vídeo del curso aquí:
Dentro de las diversas opciones disponibles para instalar MariaDB, una de las más sencillas es mediante el uso de XAMPP, un paquete que incluye Apache, MariaDB, PHP y Perl. Este método permite que incluso usuarios con poca experiencia en configuración de servidores puedan desplegar un entorno de desarrollo completo de forma rápida y sin complicaciones.
Para la instalación de XAMPP, el proceso varía ligeramente entre sistemas operativos. En Windows, se debe descargar el instalador desde el sitio web oficial de Apache Friends y seguir las instrucciones del asistente de instalación, que incluyen seleccionar los componentes a instalar y especificar el directorio de destino. En GNU/Linux también se descarga el instalador desde el sitio web oficial, pero en este caso se trata de un script .run, que se ejecuta en la terminal con permisos de administrador (por ejemplo, sudo ./xampp-linux-x64-x.x.x-0-installer.run), siguiendo pasos similares a los de Windows para completar la instalación.
Una vez instalado XAMPP, es muy importante que todos los componentes necesarios están funcionando correctamente.
En Windows, se puede gestionar XAMPP a través del XAMPP Control Panel, desde donde se inician y detienen los módulos de Apache, MySQL (MariaDB) y otros. Para comprobar que MariaDB está operativo, se puede abrir el Shell de XAMPP desde el panel de control y ejecutar mariadb --version, lo cual debería mostrar la versión de MariaDB instalada.
Elaboración propia. XAMPP Control Panel en Windows(CC BY-SA)
En GNU/Linux, la gestión de XAMPP se realiza principalmente a través de la terminal. Para iniciar todos los módulos, se utiliza el comando sudo /opt/lampp/xampp start. Para verificar la instalación de MariaDB, se puede usar el comando /opt/lampp/bin/mariadb --version. Si el sistema devuelve la versión de MariaDB, significa que está correctamente instalado y funcionando.
El acceso a MariaDB para su configuración y gestión puede hacerse también mediante phpMyAdmin, una herramienta de software libre diseñada para manejar la administración de MySQL y MariaDB a través de la web.
Para accedera phpMyAdmin tanto en Windows como en GNU/Linux, primero es necesario verificar que los servicios de Apache y MariaDB en XAMPP están operativos. Una vez confirmado esto, se debe abrir un navegador y visitar http://localhost/phpmyadmin. Aquí, el usuario puede manejar bases de datos, usuarios, permisos y realizar ajustes de configuración según sea necesario a través de una interfaz web intuitiva.
XAMPP es un paquete de software libre que proporciona una solución fácil de instalar para servidores web locales. Incluye Apache, MariaDB, PHP y Perl, permitiendo a los desarrolladores crear y probar aplicaciones web en sus ordenadores personales.
PhpMyAdmin es una herramienta de administración gratuita y de código abierto para MySQL y MariaDB, escrita en PHP, que permite gestionar bases de datos a través de una interfaz web intuitiva.
PHP (acrónimo recursivo de PHP: Hypertext Preprocessor) es un lenguaje de programación de código abierto del lado del servidor, utilizado principalmente para el desarrollo web. Permite crear contenido dinámico en páginas y aplicaciones web, facilitando la conexión a bases de datos y el manejo de formularios.
Para garantizar la seguridad de la instalación de MariaDB, es importante cambiar la contraseña del usuario root, que por defecto viene sin ella. Esto evita accesos no autorizados y protege la integridad de los datos. Para cambiar la contraseña, se puede utilizar phpMyAdmin accediendo a la pestaña Usuarios, seleccionando el usuario root y editando la contraseña desde allí. Alternativamente, se puede realizar con el siguiente comando SQL de MariaDB: SET PASSWORD FOR 'root'@'localhost' = PASSWORD('nueva_contraseña');.
Además, es conveniente configurar copias de seguridad regulares de las bases de datos utilizando herramientas como mariadb-dump. Automatizar este proceso mediante, por ejemplo, scripts simplifica la gestión y asegura la periodicidad de las copias de seguridad. Asimismo, revisar y ajustar los permisos de los usuarios de MariaDB mejora la seguridad general del sistema. Limitar los privilegios a solo aquellos necesarios para cada usuario reduce el riesgo de operaciones no autorizadas o malintencionadas.
La administración de bases de datos en sistemas que utilizan MySQL o MariaDB se facilita mediante diversas herramientas que permiten ejecutar comandos, gestionar usuarios, realizar copias de seguridad, entre otras funciones. En esta sección, se analizarán cuatro herramientas: la interfaz gráfica phpMyAdmin y los comandos mariadb, mariadb-dump y mariadb-admin.
La herramienta phpMyAdmin es una interfaz gráfica basada en web que facilita la gestión de MySQL y MariaDB. Permite a los usuarios llevar a cabo diversas tareas administrativas, como ejecutar consultas SQL, gestionar usuarios y realizar copias de seguridad, entre otras, de manera gráfica e intuitiva y sin necesidad de conocimientos de línea de comandos.
Elaboración propia. Página de inicio de PhpMyAdmin(CC BY-SA)
Con respecto a los comandos, mariadb es la herramienta principal de línea de comandos utilizada para interactuar con el servidor MariaDB. Permite ejecutar consultas SQL directamente desde el terminal y gestionar bases de datos de manera eficiente. Para conectarse al servidor MariaDB, se utiliza la siguiente sintaxis básica:
mariadb -u <em>usuario</em> -p
Aquí, usuario debe ser reemplazado por el nombre del usuario en cuestión, y -p indica que se solicitará la contraseña. Si no se utilizan las opciones -h y -P, como en este caso, se asume que el servidor está en el host local (localhost) y en el puerto por defecto (3306). Una vez autenticado correctamente, es posible ver la lista de bases de datos disponibles con:
SHOW DATABASES;
Para seleccionar una base de datos específica, se utiliza:
USE nombre_base_datos;
Y luego es posible ejecutar consultas SQL dentro de dicha base de datos. Por ejemplo:
SELECT * FROM nombre_tabla;
Esto mostrará todos los registros de la tabla especificada. Además, el comando mariadb permite crear y eliminar bases de datos con:
CREATE DATABASE nombre_base_datos;
DROP DATABASE nombre_base_datos;
Para crear un usuario con todos los privilegios, se puede utilizar el siguiente comando en mariadb:
CREATE USER 'nuevo_usuario'@'localhost' IDENTIFIED BY 'contrasena';
GRANT ALL PRIVILEGES ON *.* TO 'nuevo_usuario'@'localhost' WITH GRANT OPTION;
El primer comando crea un nuevo usuario con la contraseña especificada. El segundo comando otorga todos los privilegios sobre todas las bases de datos y tablas al usuario recién creado, incluyendo la opción de otorgar permisos a otros usuarios.
También se puede ejecutar un script SQL usando:
mariadb -u <em>usuario</em> -p < archivo.sql
Esta línea ejecuta un script SQL desde un archivo. Aquí, archivo.sql es el nombre del archivo con el código SQL.
Gracias al comando mariadb-dump se puede realizar una copia de seguridad de una base de datos con:
Este comando exporta la estructura y los datos de la base de datos nombre_bd a un archivo SQL, el cual se especifica como archivo.sql.
El comando mariadb-admin es una herramienta de línea de comandos utilizada para realizar tareas administrativas en el servidor MariaDB. Proporciona una serie de funciones que permiten gestionar el servidor de manera más eficiente. El comando mariadb-admin permite iniciar y detener el servidor MariaDB con:
Esto cambia la contraseña del usuario especificado. Para obtener información sobre el estado actual del servidor, se puede usar:
mariadb-admin -u <em>usuario</em> -p status
Este comando proporciona un resumen del estado actual del servidor, incluyendo el número de consultas ejecutadas y el tiempo de actividad.
MySQL es un Sistema de Gestor de Bases de Datos (SGBD) relacional de código abierto, conocido por su alto rendimiento, fiabilidad y facilidad de uso. Es ampliamente utilizado en aplicaciones web y se basa en el lenguaje SQL para gestionar, almacenar y recuperar datos.
MariaDB es un Sistema Gestor de Bases de Datos (SGBD) relacional derivado de MySQL. Es de código abierto y ofrece alta compatibilidad con MySQL, junto con alto rendimiento, escalabilidad y seguridad. Además, cuenta con funcionalidades adicionales y actualizaciones frecuentes.
SQL (Structured Query Language) es un lenguaje de programación estándar utilizado para gestionar y manipular bases de datos relacionales. Permite realizar operaciones como consultas, inserciones, actualizaciones y eliminaciones de datos, así como la creación y modificación de la estructura de las bases de datos.
SQL (Structured Query Language) es un lenguaje de programación estándar utilizado para gestionar y manipular bases de datos relacionales. Permite realizar operaciones como consultas, inserciones, actualizaciones y eliminaciones de datos, así como la creación y modificación de la estructura de las bases de datos.
En la empresa de desarrollo web WebInnov, Luisa, una programadora web junior, ha sido asignada a crear un sistema de gestión de inventario para una pequeña cadena de tiendas minoristas. Para este proyecto, Luisa decide utilizar PHP y la extensión MySQLi debido a que el sistema requiere la funcionalidad más reciente y específica de MariaDB. Comienza estableciendo una conexión a la base de datos desde PHP utilizando MySQLi, asegurando que la conexión sea segura y persistente para manejar las transacciones diarias de la tienda.
Una vez establecida la conexión, Luisa procede con la preparación y ejecución de consultas utilizando sentencias preparadas de MySQLi para manejar los datos de forma segura. A través de estas consultas, gestiona el inventario actualizando, agregando y eliminando registros de productos. Después, Luisa implementa métodos para la obtención y manejo de resultados, como la recuperación de datos para informes de stock y la visualización de información relevante en el frontend del sistema, utilizando PHP para manipular y presentar los datos de forma efectiva y segura.
MySQLi (MySQL Improved) es una extensión de PHP diseñada para interactuar con bases de datos MySQL o MariaDB. Proporciona una interfaz más moderna y mejorada en comparación con la antigua extensión MySQL. MySQLi soporta tanto el enfoque procedural como el orientado a objetos, ofreciendo mayor flexibilidad a los desarrolladores. Para utilizar MySQLi orientado a objetos, se crea una instancia de la clase mysqli, pasando como parámetros el nombre del servidor, el nombre de usuario, la contraseña y el nombre de la base de datos.
Las ventajas de usar MySQLi orientado a objetos en comparación con el enfoque procedural son las siguientes:
Encapsulación y organización del código: al utilizar MySQLi orientado a objetos, el código se organiza en clases y objetos, lo que permite una mejor encapsulación y separación de responsabilidades.
Soporte para herencia y polimorfismo: MySQLi orientado a objetos permite el uso de herencia y polimorfismo, lo que facilita la extensión de funcionalidades y la creación de soluciones más complejas y robustas.
Compatibilidad con técnicas modernas de desarrollo: la orientación a objetos es más compatible con técnicas modernas de desarrollo como el uso de frameworks y patrones de diseño, lo que facilita la integración de MySQLi en proyectos más avanzados y sofisticados.
MySQLi (MySQL Improved) es una extensión de PHP que permite interactuar con bases de datos MySQL. Proporciona una interfaz mejorada con soporte para funciones avanzadas como operaciones preparadas, múltiples declaraciones, y transacciones, mejorando seguridad y rendimiento respecto a la antigua extensión MySQL.
MySQL es un Sistema de Gestor de Bases de Datos (SGBD) relacional de código abierto, conocido por su alto rendimiento, fiabilidad y facilidad de uso. Es ampliamente utilizado en aplicaciones web y se basa en el lenguaje SQL para gestionar, almacenar y recuperar datos.
MariaDB es un Sistema Gestor de Bases de Datos (SGBD) relacional derivado de MySQL. Es de código abierto y ofrece alta compatibilidad con MySQL, junto con alto rendimiento, escalabilidad y seguridad. Además, cuenta con funcionalidades adicionales y actualizaciones frecuentes.
PHP (acrónimo recursivo de PHP: Hypertext Preprocessor) es un lenguaje de programación de código abierto del lado del servidor, utilizado principalmente para el desarrollo web. Permite crear contenido dinámico en páginas y aplicaciones web, facilitando la conexión a bases de datos y el manejo de formularios.
Estudiar la documentación oficial de MySQLi proporciona una comprensión profunda para utilizar esta extensión de PHP de manera efectiva. Es muy aconsejable dominar las clases mysqli, mysqli_stmt y mysqli_result de MySQLi en su modalidad orientada a objetos. Estas clases explican cómo establecer conexiones, preparar y ejecutar sentencias, y manipular los resultados de las consultas respectivamente.
La conexión a la base de datos en PHP se puede realizar utilizando la extensión MySQLi (MySQL Improved). MySQLi es una extensión de PHP que proporciona una interfaz mejorada para interactuar con las bases de datos MySQL y MariaDB, ofreciendo métodos para conectarse, ejecutar consultas y manejar resultados. MySQLi puede ser utilizado tanto de manera procedimental como orientada a objetos. Esta sección se centrará en el uso de MySQLi orientado a objetos, que permite una sintaxis más limpia y modular mediante la creación de una instancia de la clase mysqli.
Antes de establecer la conexión, se deben definir las credenciales necesarias para conectarse a la base de datos. Estas credenciales típicamente incluyen el host, el nombre de usuario, la contraseña y el nombre de la base de datos. A continuación se muestra un ejemplo de cómo definir estas variables en PHP:
$host = 'localhost'; // Host de la base de datos
$user = 'nombre_usuario'; // Nombre de usuario
$pass = 'contrasena'; // Contraseña
$db = 'base_datos'; // Nombre de la base de datos
Estas variables contienen la información necesaria para identificar y autenticar la conexión a la base de datos. El host suele ser localhost cuando la base de datos y el script PHP están en el mismo servidor. El nombre de usuario y la contraseña deben corresponder a un usuario con los permisos adecuados para acceder a la base de datos específica identificada por el nombre de la base de datos.
Una vez definidas las credenciales, se procede a crear una nueva instancia de la clase mysqli utilizando dichas credenciales. Este paso inicializa la conexión a la base de datos:
$mysqli = new mysqli($host, $user, $pass, $db);
En este punto, $mysqli es un objeto que representa la conexión a la base de datos. Si la conexión se establece con éxito, este objeto puede ser utilizado para realizar consultas y otras operaciones en la base de datos.
Para manejar errores de conexión, se puede utilizar un bloque try-catch. Esto permite capturar excepciones y manejar errores de una manera controlada. A continuación se muestra un ejemplo de cómo hacerlo:
En este código, se intenta establecer la conexión a la base de datos dentro del bloque try. Si ocurre algún error durante la conexión, se lanza una excepción de tipo mysqli_sql_exception, la cual es capturada por el bloque catch. Dentro del bloque catch, se puede manejar el error, por ejemplo, mostrando un mensaje descriptivo utilizando echo y el método getMessage() del objeto de excepción.
Este enfoque de manejo de errores asegura que cualquier problema en la conexión se detecte y maneje de manera apropiada, evitando que el script se detenga abruptamente y proporcionando información útil para la resolución de problemas.
MySQLi (MySQL Improved) es una extensión de PHP que permite interactuar con bases de datos MySQL. Proporciona una interfaz mejorada con soporte para funciones avanzadas como operaciones preparadas, múltiples declaraciones, y transacciones, mejorando seguridad y rendimiento respecto a la antigua extensión MySQL.
PHP (acrónimo recursivo de PHP: Hypertext Preprocessor) es un lenguaje de programación de código abierto del lado del servidor, utilizado principalmente para el desarrollo web. Permite crear contenido dinámico en páginas y aplicaciones web, facilitando la conexión a bases de datos y el manejo de formularios.
En la gestión de bases de datos utilizando PHP y MySQLi orientado a objetos, la preparación y ejecución de consultas son procesos que aseguran tanto la eficiencia como la seguridad de las operaciones. La preparación de consultas implica la compilación previa de la sentencia SQL, mientras que la ejecución es el proceso de enviar esta consulta compilada a la base de datos con los parámetros necesarios para obtener o modificar datos.
Para preparar y ejecutar una consulta en MySQLi orientado a objetos, primero se debe crear una instancia de la clase mysqli. Supongamos que ya se tiene una conexión activa a la base de datos. El siguiente paso es usar el método prepare() de la instancia mysqli. Este método toma una consulta SQL como argumento y devuelve un objeto de la clase mysqli_stmt. Luego, se deben vincular los parámetros a la consulta preparada utilizando los métodos bind_param() del objeto mysqli_stmt. Finalmente, para ejecutar la consulta preparada, se utiliza el método execute() del objeto mysqli_stmt.
El método prepare() permite preparar una consulta SQL con placeholders, que son marcadores de posición para los valores reales que se pasarán a la consulta más adelante. Estos placeholders se indican con signos de interrogación (?). Por ejemplo, para insertar un libro en una tabla llamada libros, la consulta SQL sería:
$stmt = $mysqli->prepare('INSERT INTO libros (id, nombre, autor) VALUES (?, ?, ?)');
El método bind_param() se utiliza para vincular variables a los parámetros en la consulta preparada. Cada tipo de dato tiene un especificador correspondiente (i para enteros, s para cadenas, d para flotantes y b para blobs). En el ejemplo del libro, la vinculación sería:
En este caso, i indica que id es un entero, correspondiente a la primera ?. Luego, la s indica que nombre es una cadena, correspondiente a la segunda ?, y la última s indica que autor también es una cadena, correspondiente a la tercera ?.
El método execute() del objeto mysqli_stmt se utiliza para ejecutar la consulta previamente preparada y vinculada. Por ejemplo, después de preparar y vincular la consulta para insertar un libro, la ejecución sería simplemente:
$stmt->execute();
En caso de que se necesite ejecutar la misma consulta varias veces con diferentes valores, la preparación inicial de la consulta se puede reutilizar. Esto es eficiente porque la consulta solo se compila una vez, aunque se ejecute múltiples veces. Por ejemplo, para insertar otro libro, solo se necesita cambiar los valores de las variables y ejecutar de nuevo:
Es posible pasar un array de parámetros directamente al método execute() en lugar de utilizar bind_param(). Esto puede simplificar el código en algunos casos. Por ejemplo, para actualizar un registro:
$stmt = $mysqli->prepare('UPDATE libros SET nombre=?, autor=? WHERE id=?');
$stmt->execute([$nombre, $autor, $id]);
Otra opción que lo abarca todo es mysqli_execute_query(), que permite, en una sola línea, preparar la consulta, vincular los parámetros y ejecutarla. Se puede hacer de la siguiente manera:
$mysqli->execute_query('DELETE FROM libros WHERE id=?', [$id]);
Para manejar excepciones y errores durante la preparación y ejecución de consultas, se puede utilizar un bloque try-catch. El bloque try encapsula el código que puede generar una excepción, mientras que el bloque catch captura y maneja la excepción si ocurre. Por ejemplo:
En este código, se intenta preparar y ejecutar una consulta para insertar un libro. Si ocurre algún error durante este proceso, se captura la excepción mysqli_sql_exception y se muestra un mensaje de error.
Este enfoque asegura que cualquier problema que ocurra durante la interacción con la base de datos se maneje adecuadamente, proporcionando una manera de depurar y resolver problemas de manera efectiva. La utilización de try-catch junto con la preparación y ejecución de consultas en MySQLi orientado a objetos no solo mejora la seguridad de las aplicaciones, sino que también facilita la gestión de errores y la mantenibilidad del código.
SQL (Structured Query Language) es un lenguaje de programación estándar utilizado para gestionar y manipular bases de datos relacionales. Permite realizar operaciones como consultas, inserciones, actualizaciones y eliminaciones de datos, así como la creación y modificación de la estructura de las bases de datos.
MySQLi (MySQL Improved) es una extensión de PHP que permite interactuar con bases de datos MySQL. Proporciona una interfaz mejorada con soporte para funciones avanzadas como operaciones preparadas, múltiples declaraciones, y transacciones, mejorando seguridad y rendimiento respecto a la antigua extensión MySQL.
PHP (acrónimo recursivo de PHP: Hypertext Preprocessor) es un lenguaje de programación de código abierto del lado del servidor, utilizado principalmente para el desarrollo web. Permite crear contenido dinámico en páginas y aplicaciones web, facilitando la conexión a bases de datos y el manejo de formularios.
Crea una base de datos con una tabla denominada animales mediante CREATE TABLE animales (id INT PRIMARY KEY, nombre VARCHAR(50), raza VARCHAR(50));. Luego, usando PHP con la extensión MySQLi, inserta en dicha tabla tres registros diferentes varias veces con distintos valores. Solo se debe preparar la consulta una vez para ver las ventajas de utilizar prepare.
La obtención y manejo de resultados en PHP utilizando MySQLi es fundamental en el desarrollo de aplicaciones que interactúan con bases de datos. Los resultados se pueden recoger de diversas maneras, utilizando métodos como fetch_all, fetch_array y fetch_column de la clase mysqli_result. Cada uno de estos métodos permite obtener los datos de la base de datos de forma eficiente y luego manejar los resultados según las necesidades específicas de la aplicación.
La clase mysqli_result es una representación de un conjunto de resultados obtenido desde una consulta SQL, y difiere de las clases mysqli y mysqli_stmt. Mientras que mysqli maneja la conexión a la base de datos y mysqli_stmt representa una sentencia preparada, mysqli_result almacena los datos devueltos por una consulta SELECT.
Para obtener una instancia de la clase mysqli_result desde una sentencia preparada, se puede utilizar el método get_result de la instancia mysqli_stmt.que Este método devuelve un objeto mysqli_result. Por ejemplo:
Para obtener todas las filas de una consulta, se utiliza el método fetch_all, que devuelve un array bidimensional con el conjunto de resultados. Este método tiene una constante por defecto MYSQLI_NUM que devuelve un array numérico. Por ejemplo:
En el código anterior, se recogen todos los resultados de una consulta SELECT y se imprimen en formato de array numérico. Existen otras opciones como fetch_all(MYSQLI_ASSOC), que devuelve un array asociativo donde las claves son los nombres de las columnas, y fetch_all(MYSQLI_BOTH), que devuelve tanto índices numéricos como asociativos.
Para obtener una única fila de una consulta en un array unidimensional, se emplea el método fetch_array. Este método devuelve un array con los datos de una fila, y por defecto utiliza MYSQLI_BOTH. Por ejemplo:
require 'connect_db.php';
try {
$stmt = $mysqli->prepare('SELECT * FROM libros WHERE id = ?');
$stmt->bind_param('i', $id);
$id = 1;
$stmt->execute();
$result = $stmt->get_result();
$row = $result->fetch_array(MYSQLI_ASSOC);
print_r($row);
} catch (mysqli_sql_exception $e) {
echo 'Error: ' . $e->getMessage();
}
En este ejemplo, se utiliza fetch_array(MYSQLI_ASSOC) para obtener los resultados en un array asociativo, también se podría utilizar el método fetch_assoc para el mismo propósito.
Para obtener un solo valor de una columna específica, se emplea el método fetch_column. Por ejemplo, para recoger el nombre específico de un libro:
require 'connect_db.php';
try {
$stmt = $mysqli->prepare('SELECT nombre FROM libros WHERE id = ?');
$stmt->bind_param('i', $id);
$id = 1;
$stmt->execute();
$result = $stmt->get_result();
$name = $result->fetch_column();
echo $name;
} catch (mysqli_sql_exception $e) {
echo 'Error: ' . $e->getMessage();
}
Una vez obtenidos los datos, se pueden manejar los resultados de diversas maneras, como presentarlos de forma visual en una tabla HTML. A continuación se presenta un ejemplo:
Otra alternativa al ejemplo de arriba es utilizar while ($row = $result->fetch_assoc()) { } para iterar sobre los resultados fila por fila.
Cuando se manejan grandes volúmenes de datos, el uso del método get_result de la clase mysqli_result puede ser costoso en términos de memoria. Para procesar filas una por una y optimizar el uso de memoria, una opción es usar los métodos bind_result y fetch de la clase mysqli_stmt. Por ejemplo:
Este enfoque es más eficiente en términos de memoria y es ideal para procesar grandes conjuntos de datos fila por fila.
MySQLi (MySQL Improved) es una extensión de PHP que permite interactuar con bases de datos MySQL. Proporciona una interfaz mejorada con soporte para funciones avanzadas como operaciones preparadas, múltiples declaraciones, y transacciones, mejorando seguridad y rendimiento respecto a la antigua extensión MySQL.
SQL (Structured Query Language) es un lenguaje de programación estándar utilizado para gestionar y manipular bases de datos relacionales. Permite realizar operaciones como consultas, inserciones, actualizaciones y eliminaciones de datos, así como la creación y modificación de la estructura de las bases de datos.
PHP (acrónimo recursivo de PHP: Hypertext Preprocessor) es un lenguaje de programación de código abierto del lado del servidor, utilizado principalmente para el desarrollo web. Permite crear contenido dinámico en páginas y aplicaciones web, facilitando la conexión a bases de datos y el manejo de formularios.
En la empresa digital WebTech Solutions, Jorge, un programador junior, ha recibido el encargo de desarrollar un sistema de reservas en línea para un pequeño hotel. Para gestionar eficazmente las reservas y los datos de los clientes, Jorge decide utilizar PHP Data Objects (PDO) por su capacidad para trabajar con diversas bases de datos. Establece una conexión a la base de datos segura y configura el ambiente de desarrollo para trabajar con PDO, asegurándose de que la conexión sea persistente y segura.
Con la conexión ya configurada, Jorge se enfoca en la preparación y ejecución de consultas para ingresar y recuperar datos de reservas. Utiliza sentencias preparadas para mejorar la eficiencia y precisión de las consultas. A medida que avanza, implementa métodos para la obtención y manejo de resultados, asegurándose de que los datos sean presentados correctamente en la interfaz de usuario. Finalmente, Jorge incorpora manejo de transacciones para asegurar que las operaciones de reserva sean atómicas y consistentes, mejorando la confiabilidad del sistema.
PHP Data Objects (PDO) es una extensión de PHP diseñada para interactuar con bases de datos mediante una interfaz unificada. Esta extensión permite ejecutar operaciones como consultas y actualizaciones de datos utilizando una misma sintaxis, independientemente del tipo de base de datos. PDO soporta múltiples controladores de bases de datos, como MySQL, MariaDB, PostgreSQL, SQLite, SQL Server, Oracle Database, y más, facilitando la portabilidad del código. Para utilizar PDO, se crea una instancia de la clase PDO, pasando como parámetros el DSN (Data Source Name), el nombre de usuario y la contraseña.
Las ventajas de PDOen comparación con MySQLi son significativas y variadas, destacándose en diversos aspectos que mejoran tanto la funcionalidad como la usabilidad de la interacción con bases de datos:
Soporte para múltiples tipos de bases de datos: PDO no se limita solo a MySQL y MariaDB; permite trabajar con diversas bases de datos como PostgreSQL, SQLite, SQL Server, Oracle Database, entre otras.
Portabilidad del código: al usar una API unificada, el código se puede migrar fácilmente entre diferentes Sistemas Gestores de Bases de Datos (SGBD).
Manejo de excepciones: PDO ofrece un manejo robusto de excepciones, facilitando la gestión y depuración de errores.
Aunque en general se recomienda usar PDO sobre MySQLi, hay casos muy específicos en los que MySQLi es una mejor opción. Por ejemplo, cuando se requiere la funcionalidad más reciente y particular de MySQL o MariaDB.
DSN (Data Source Name) es una cadena de caracteres que proporciona la información necesaria para que una aplicación se conecte a una base de datos específica. Incluye el nombre del controlador, la ubicación del servidor, el nombre de la base de datos y las credenciales de autenticación.
PDO (PHP Data Objects) es una extensión de PHP que define una interfaz ligera y consistente para acceder a bases de datos en PHP. Proporciona una capa de abstracción que permite interactuar con diferentes Sistemas Gestores de Bases de Datos (SGBD) usando el mismo código.
MySQL es un Sistema de Gestor de Bases de Datos (SGBD) relacional de código abierto, conocido por su alto rendimiento, fiabilidad y facilidad de uso. Es ampliamente utilizado en aplicaciones web y se basa en el lenguaje SQL para gestionar, almacenar y recuperar datos.
MariaDB es un Sistema Gestor de Bases de Datos (SGBD) relacional derivado de MySQL. Es de código abierto y ofrece alta compatibilidad con MySQL, junto con alto rendimiento, escalabilidad y seguridad. Además, cuenta con funcionalidades adicionales y actualizaciones frecuentes.
PostgreSQL es un Sistema Gestor de Bases de Datos (SGBD) relacional y objeto-relacional, de código abierto, conocido por su robustez, extensibilidad y cumplimiento con el estándar SQL. Ofrece características avanzadas como transacciones, replicación y soporte para lenguajes procedurales y no procedurales.
SQLite es un Sistema Gestor de Bases de Datos (SGBD) relacional ligero y autónomo. No requiere servidor y se almacena en un solo archivo. Es ideal para aplicaciones móviles, dispositivos embebidos y pequeños proyectos web.
SQL Server es un Sistema Gestor de Bases de Datos (SGBD) relacional desarrollado por Microsoft, que soporta diversas aplicaciones empresariales mediante almacenamiento, consulta y administración de datos, con características avanzadas de seguridad, integración y análisis de datos.
Oracle Database es un Sistema Gestor de Bases de Datos (SGBD) relacional desarrollado por Oracle Corporation, que permite almacenar, organizar y gestionar grandes cantidades de datos con alta disponibilidad, rendimiento y seguridad. Es utilizado ampliamente en aplicaciones empresariales y corporativas.
MySQLi (MySQL Improved) es una extensión de PHP que permite interactuar con bases de datos MySQL. Proporciona una interfaz mejorada con soporte para funciones avanzadas como operaciones preparadas, múltiples declaraciones, y transacciones, mejorando seguridad y rendimiento respecto a la antigua extensión MySQL.
Una API (Application Programming Interface) es un conjunto de reglas y protocolos que permite la comunicación entre diferentes aplicaciones de software, facilitando el intercambio de datos y funcionalidades de manera estructurada y predefinida.
PHP (acrónimo recursivo de PHP: Hypertext Preprocessor) es un lenguaje de programación de código abierto del lado del servidor, utilizado principalmente para el desarrollo web. Permite crear contenido dinámico en páginas y aplicaciones web, facilitando la conexión a bases de datos y el manejo de formularios.
Estudiar la documentación oficial de PDO permite comprender en profundidad el uso de esta extensión para interactuar con bases de datos en PHP. Es muy importante dominar las clases PDO y PDOStatement para aprovechar al máximo sus funcionalidades. La clase PDO proporciona métodos para conectarse a bases de datos y gestionar esas conexiones, ofreciendo una interfaz unificada para diferentes Sistemas Gestores de Bases de Datos. Por otro lado, la clase PDOStatement se utiliza para preparar y ejecutar sentencias SQL, así como para obtener y manipular los resultados de las consultas, mejorando la seguridad y eficiencia de las interacciones con la base de datos.
La conexión a una base de datos en PHP utilizando PHP Data Objects (PDO) se realiza mediante un conjunto de pasos claramente definidos. PDO es una extensión que proporciona una interfaz para acceder a bases de datos en PHP. Para conectar una aplicación PHP a una base de datos, se debe seguir un proceso sistemático que asegura tanto la funcionalidad como la seguridad de la conexión.
El primer paso es definir los parámetros de conexión. Estos incluyen el tipo de base de datos, el nombre de la base de datos, el servidor donde se encuentra la base de datos, y las credenciales de acceso (nombre de usuario y contraseña). Cabe destacar que a estas credenciales hay que aplicarles medidas de seguridad que se verán más adelante. A continuación, se presenta un ejemplo de cómo definir estos parámetros:
Una vez definidos los parámetros, se construye el Data Source Name (DSN), que es una cadena que contiene la información necesaria para conectar a la base de datos. Para una base de datos MySQL o MariaDB, el DSN tiene el siguiente formato:
$dsn = 'mysql:host=' . $host . ';dbname=' . $db;
Con los parámetros definidos, se procede a crear una instancia de PDO utilizando el DSN y las credenciales configuradas. Este paso es importante ya que aquí es donde se establece la conexión con la base de datos. Se utiliza un bloque try-catch para manejar cualquier excepción que pueda ocurrir durante la conexión, lo que permite gestionar errores de forma controlada y segura. A continuación se presenta un ejemplo de cómo se realiza este paso:
Este código crea una nueva instancia de la clase PDO. Si ocurre algún error durante la creación de esta instancia, el bloque catch captura la excepción y la maneja adecuadamente, generalmente registrando el error y deteniendo la ejecución del script para evitar problemas mayores.
Una vez establecida la conexión, el objeto $pdo de la clase PDO puede ser utilizado para interactuar con la base de datos. Esto incluye la ejecución de consultas, la obtención de resultados y el manejo de transacciones. La conexión se mantiene abierta durante el tiempo que el objeto PDO esté en uso y se cierra automáticamente cuando el objeto es destruido o cuando el script finaliza su ejecución.
PDO (PHP Data Objects) es una extensión de PHP que define una interfaz ligera y consistente para acceder a bases de datos en PHP. Proporciona una capa de abstracción que permite interactuar con diferentes Sistemas Gestores de Bases de Datos (SGBD) usando el mismo código.
DSN (Data Source Name) es una cadena de caracteres que proporciona la información necesaria para que una aplicación se conecte a una base de datos específica. Incluye el nombre del controlador, la ubicación del servidor, el nombre de la base de datos y las credenciales de autenticación.
PHP (acrónimo recursivo de PHP: Hypertext Preprocessor) es un lenguaje de programación de código abierto del lado del servidor, utilizado principalmente para el desarrollo web. Permite crear contenido dinámico en páginas y aplicaciones web, facilitando la conexión a bases de datos y el manejo de formularios.
Esta afirmación es falsa porque, para establecer una conexión exitosa a una base de datos utilizando PDO en PHP, no solo se necesitan el nombre de la base de datos y el nombre de usuario. También es necesario definir el servidor donde se encuentra la base de datos (host) y, en la mayoría de los casos, una contraseña para el usuario. Además, se debe construir un Data Source Name (DSN) adecuado que incluya al menos el tipo de base de datos y el host. Por ejemplo, para una base de datos MySQL, el DSN debe seguir el formato mysql:host=$host;dbname=$db. Sin estos parámetros completos, la conexión no se podrá establecer correctamente.
En la gestión de bases de datos utilizando PHP y PDO, la preparación y ejecución de consultas son etapas fundamentales que garantizan tanto la eficiencia como la seguridad de las operaciones. A continuación, se detalla el proceso de preparación y ejecución de consultas utilizando PDO en PHP.
Para preparar y ejecutar una consulta en PDO, primero se debe crear una instancia de la clase PDO. Supongamos que ya se tiene una conexión activa a la base de datos. El siguiente paso es usar el método prepare de la instancia PDO. Este método toma una consulta SQL como argumento y devuelve un objeto de la clase PDOStatement. Luego, se deben vincular los parámetros a la consulta preparada utilizando los métodos bindParam o bindValue del objeto PDOStatement. Finalmente, para ejecutar la consulta preparada, se utiliza el método execute() del objeto PDOStatement.
En PDO, existen dos tipos de marcadores de posición: parámetros nombrados (named parameters) y parámetros con signo de interrogación (question mark parameters). Los parámetros nombrados utilizan nombres específicos precedidos por dos puntos, como :id, mientras que los parámetros con signo de interrogación utilizan signos de interrogación (?) que se corresponden con los valores en el orden en que aparecen en la consulta.
// Ejemplo con parámetros nombrados
$query = 'INSERT INTO videojuegos (id, nombre, fecha_lanzamiento) VALUES (:id, :nombre, :fecha)';
// Ejemplo con parámetros con signo de interrogación
$query = 'INSERT INTO videojuegos (id, nombre, fecha_lanzamiento) VALUES (?, ?, ?)';
En este ejemplo, se utilizarán parámetros nombrados. Para preparar una consulta con varios parámetros, se puede hacer de la siguiente manera:
Una vez preparada la consulta, se deben vincular los parámetros. Esto se hace utilizando el método bindParam o bindValue del objeto PDOStatement. La diferencia principal entre estos métodos es que bindParam vincula una variable al marcador de posición y evalúa su valor en el momento de la ejecución, mientras que bindValue vincula el valor directamente.
Supongamos que los valores a vincular son un entero, una cadena de texto y una fecha. En este caso, utilizamos bindParam. El siguiente paso es vincular los parámetros utilizando el método bindParam del objeto PDOStatement.
Después de vincular todos los parámetros necesarios, la consulta está lista para ser ejecutada. Para ejecutar la consulta, se utiliza el método execute, el cual no requiere argumentos si se han utilizado parámetros nombrados con bindParam o bindValue.
$stmt->execute();
En caso de que se necesite ejecutar la misma consulta varias veces con diferentes valores, la preparación inicial de la consulta se puede reutilizar. Cada vez que se quiera ejecutar la consulta con nuevos valores, simplemente se actualizan los valores de los parámetros y se llama nuevamente a execute.
También es posible pasar un array de parámetros directamente al método execute al momento de ejecutar la consulta, lo cual puede simplificar el código cuando se tienen varios parámetros. Por ejemplo, para actualizar un registro:
$stmt = $pdo->prepare('UPDATE videojuegos SET nombre = :nombre, fecha_lanzamiento = :fecha WHERE id = :id');
$stmt->execute([':id' => 1, ':nombre' => 'Indiana Jones and the Fate of Atlantis', ':fecha' => '1992-06-26']);
Para eliminar un registro, se puede usar una consulta de manera similar:
$stmt = $pdo->prepare('DELETE FROM videojuegos WHERE id = :id');
$stmt->execute([':id' => 2]);
Es importante manejar correctamente los errores al trabajar con consultas en PDO. Para ello, se puede utilizar un bloque try-catch que permita capturar excepciones y manejar errores de manera más controlada. A continuación, se muestra un ejemplo completo de prepare y execute con try-catch:
Para consultas de selección con SELECT, el proceso también es similar, aunque la obtención de resultados se verá más adelante.
En ocasiones, es útil conocer el identificador del último registro insertado o el número de filas afectadas por una consulta. Para obtener el identificador del último registro insertado, se puede utilizar el método lastInsertId de la instancia PDO. Para obtener el número de filas afectadas por una consulta, se utiliza el método rowCount.
A continuación, se muestra un ejemplo que utiliza ambos métodos:
require 'connect_db.php';
try {
// El campo 'id' de la tabla 'videojuegos' es autoincremental
$query = 'INSERT INTO videojuegos (nombre, fecha_lanzamiento) VALUES (:nombre, :fecha)';
$stmt = $pdo->prepare($query);
$stmt->execute([':nombre' => 'The Legend of Zelda: Ocarina of Time', ':fecha' => '1998-11-21']);
echo 'Registro insertado correctamente.<br /><br />';
echo 'ID: ' . $pdo->lastInsertId() . '<br />';
echo 'Filas afectadas: ' . $stmt->rowCount();
} catch (PDOException $e) {
throw new Exception('Error: ' . $e->getMessage());
}
PDO (PHP Data Objects) es una extensión de PHP que define una interfaz ligera y consistente para acceder a bases de datos en PHP. Proporciona una capa de abstracción que permite interactuar con diferentes Sistemas Gestores de Bases de Datos (SGBD) usando el mismo código.
SQL (Structured Query Language) es un lenguaje de programación estándar utilizado para gestionar y manipular bases de datos relacionales. Permite realizar operaciones como consultas, inserciones, actualizaciones y eliminaciones de datos, así como la creación y modificación de la estructura de las bases de datos.
PHP (acrónimo recursivo de PHP: Hypertext Preprocessor) es un lenguaje de programación de código abierto del lado del servidor, utilizado principalmente para el desarrollo web. Permite crear contenido dinámico en páginas y aplicaciones web, facilitando la conexión a bases de datos y el manejo de formularios.
Crea una base de datos y una tabla denominada videojuegos utilizando el siguiente comando SQL: CREATE TABLE videojuegos (id INT AUTO_INCREMENT PRIMARY KEY, nombre VARCHAR(100), fecha_lanzamiento DATE);.
A continuación, crea una página web llamada index.php que contenga un formulario para agregar un videojuego. El formulario debe incluir los siguientes campos: Nombre y Fecha de lanzamiento, junto con un botón con la etiqueta Añadir.
Al hacer clic en el botón Añadir, los datos del formulario se enviarán a insertar.php, donde se insertará el videojuego en la base de datos. Para ello, se utilizará PDO con las instrucciones prepare y execute, vinculando los parámetros mediante bindParam.
La obtención y manejo de resultados en PHP utilizando PDO son tareas fundamentales en el desarrollo de aplicaciones que interactúan con bases de datos. La obtención de resultados se puede realizar de diversas maneras, utilizando métodos como fetchAll, fetch y fetchColumn. Cada uno de estos métodos permite obtener los datos de la base de datos de forma eficiente y luego manejar los resultados según las necesidades específicas de la aplicación.
Para obtener todas las filas de una consulta, se utiliza el método fetchAll, que devuelve un array bidimensional con el conjunto de resultados. Por defecto, fetchAll usa PDO::FETCH_BOTH, lo que significa que las filas se representan tanto con índices numéricos como asociativos. A continuación, se muestra cómo realizar esto en PHP:
Para obtener una única fila de una consulta en un array unidimensional, se emplea el método fetch. Este método es útil cuando se espera un único resultado o cuando se quiere procesar filas una por una en un bucle. Utilizar PDO::FETCH_NUM permite obtener los resultados como un array indexado numéricamente. Sin embargo, con PDO::FETCH_ASSOC, las filas se representan solo con índices asociativos, es decir, los nombres de las columnas. El siguiente código PHP demuestra su uso:
require 'connect_db.php';
try {
$sth = $pdo->prepare('SELECT * FROM usuarios WHERE id = 1');
$sth->execute();
$result = $sth->fetch(PDO::FETCH_ASSOC); // PDO::FETCH_BOTH por defecto
print_r($result);
} catch (PDOException $e) {
echo 'Error: ' . $e->getMessage();
}
Para obtener un solo valor de una columna específica, se emplea el método fetchColumn. Este método es ideal cuando se necesita obtener un único dato, como el resultado de una agregación o una columna específica de una fila. A continuación, se muestra un ejemplo de su uso:
require 'connect_db.php';
try {
$sth = $pdo->prepare('SELECT nombre FROM usuarios WHERE id = 1');
$sth->execute();
$nombre = $sth->fetchColumn();
echo 'El nombre es: ' . htmlspecialchars($nombre);
} catch (PDOException $e) {
echo 'Error: ' . $e->getMessage();
}
Una vez obtenidos los datos, podemos manejar los resultados de diversas maneras, una de las cuales es presentarlos de forma visual. Para ello, se puede crear una tabla HTML que muestre todos los datos obtenidos de una tabla de la base de datos. A continuación, se presentan dos ejemplos sencillos.
Para conjuntos de datos más pequeños o cuando necesitas todos los datos a la vez, fetchAll() puede ser más conveniente:
PDO (PHP Data Objects) es una extensión de PHP que define una interfaz ligera y consistente para acceder a bases de datos en PHP. Proporciona una capa de abstracción que permite interactuar con diferentes Sistemas Gestores de Bases de Datos (SGBD) usando el mismo código.
PHP (acrónimo recursivo de PHP: Hypertext Preprocessor) es un lenguaje de programación de código abierto del lado del servidor, utilizado principalmente para el desarrollo web. Permite crear contenido dinámico en páginas y aplicaciones web, facilitando la conexión a bases de datos y el manejo de formularios.
En el desarrollo de aplicaciones web que interactúan con bases de datos, PDO ofrece una interfaz consistente y segura para realizar operaciones SQL. Uno de los aspectos más críticos en la gestión de bases de datos es el manejo de transacciones, ya que estas permiten asegurar la integridad y consistencia de los datos. Una transacción es un conjunto de operaciones SQL que se ejecutan como una unidad única. Si alguna de las operaciones dentro de la transacción falla, se deshacen todas las operaciones realizadas, garantizando que la base de datos no quede en un estado inconsistente.
En PDO, las transacciones permiten agrupar varias operaciones de base de datos en una sola unidad lógica de trabajo. Esto significa que todas las operaciones dentro de una transacción se ejecutarán completamente o no se ejecutarán en absoluto, lo que es fundamental para mantener la integridad de los datos. Al agrupar las operaciones de esta manera, se asegura que los cambios realizados sean atómicos: o se aplican todos los cambios o no se aplica ninguno. Esto es especialmente importante en situaciones donde las operaciones dependen unas de otras, como en transferencias de dinero entre cuentas.
Para comenzar una transacción en PDO, se utiliza el método beginTransaction(). Este método inicia una nueva transacción, suspendiendo el modo de autocommit de la conexión a la base de datos. A partir de este punto, cualquier operación SQL ejecutada no se confirmará automáticamente.
$pdo->beginTransaction();
Después de iniciar una transacción, se pueden ejecutar varias operaciones SQL. Si todas las operaciones se completan correctamente y se desea confirmar la transacción, se utiliza el método commit(). Este método confirma todas las operaciones realizadas desde el comienzo de la transacción.
$pdo->commit();
Sin embargo, si ocurre algún error durante la ejecución de las operaciones SQL y se necesita revertir todos los cambios realizados desde el inicio de la transacción, se utiliza el método rollBack(). Este método deshace todas las operaciones realizadas desde el comienzo de la transacción.
$pdo->rollBack();
A continuación, se presenta un ejemplo completo que ilustra el manejo de transacciones en PDO:
En este ejemplo, se realiza primero una inserción en la tabla usuarios y luego otra inserción en la tabla cuentas. Si ambas operaciones se completan sin errores, se confirma la transacción con commit. Si ocurre algún error, se revierte la transacción con rollBack para asegurar que los datos permanezcan consistentes.
El manejo de transacciones en PDO también permite nesting (anidamiento), donde se pueden iniciar transacciones dentro de otras transacciones. Sin embargo, esto puede ser complejo y no todas las bases de datos lo soportan de la misma manera. Por lo tanto, es crucial entender cómo la base de datos subyacente maneja las transacciones anidadas.
PDO (PHP Data Objects) es una extensión de PHP que define una interfaz ligera y consistente para acceder a bases de datos en PHP. Proporciona una capa de abstracción que permite interactuar con diferentes Sistemas Gestores de Bases de Datos (SGBD) usando el mismo código.
SQL (Structured Query Language) es un lenguaje de programación estándar utilizado para gestionar y manipular bases de datos relacionales. Permite realizar operaciones como consultas, inserciones, actualizaciones y eliminaciones de datos, así como la creación y modificación de la estructura de las bases de datos.
En el contexto de transacciones con PDO, es relevante conocer las propiedades ACID (Atomicity, Consistency, Isolation, Durability) para asegurar la fiabilidad de las operaciones de base de datos. Atomicidad garantiza que todas las operaciones dentro de una transacción se completen o se deshagan. La Consistencia asegura que las transacciones lleven la base de datos de un estado válido a otro. El Aislamiento permite que las transacciones operen independientemente sin interferir unas con otras, y la Durabilidad asegura que los resultados de una transacción confirmada persisten incluso ante fallos del sistema.
Para manejar el aislamiento, se pueden utilizar cláusulas de bloqueo como SELECT ... FOR UPDATE y SELECT ... LOCK IN SHARE MODE. Ambas bloquean la actualización o eliminación de las filas seleccionadas hasta que la transacción se complete. Sin embargo, mientras que SELECT ... LOCK IN SHARE MODE permite que otras transacciones lean las filas seleccionadas, permitiendo un acceso compartido a los datos, SELECT ... FOR UPDATE evita que otras transacciones lean las filas bloqueadas, asegurando un control exclusivo hasta que la transacción termine.
Finalmente, para quienes buscan profundizar, se recomienda explorar transacciones distribuidas y el protocolo de dos fases (2PC), que permiten coordinar transacciones que abarcan múltiples bases de datos o servicios. Estas técnicas avanzadas son cruciales en arquitecturas de sistemas distribuidos, donde la integridad de los datos debe mantenerse a través de diferentes nodos y servicios.
En la empresa de desarrollo de software SecureSoft, María y Mateo, expertos en seguridad en bases de datos, son asignados para fortalecer la seguridad de una aplicación de comercio electrónico. Su principal tarea es asegurar que los datos de los usuarios y las transacciones estén protegidos contra accesos no autorizados. Para empezar, implementan técnicas avanzadas de prevención de inyección SQL, asegurándose de que todas las consultas a la base de datos estén bien parametrizadas y evaluando el código para corregir vulnerabilidades potenciales.
Después, María y Mateo trabajan en la defensa contra Cross-Site Scripting (XSS), una prioridad dada la naturaleza interactiva de las plataformas de comercio electrónico, donde los usuarios continuamente suben contenido y datos. Establecen filtros estrictos para todas las entradas recibidas, evitando así ataques que puedan comprometer tanto la base de datos como la experiencia del usuario. Además, utilizan un conjunto de medidas de protección adicionales para asegurar que la aplicación de comercio electrónico sea segura y robusta.
La seguridad en bases de datos permite proteger la información sensible contra accesos no autorizados y ataques. Un riesgo común es la inyección SQL, que permite a atacantes ejecutar comandos maliciosos en la base de datos. Para prevenirlo, se deben usar consultas preparadas, limitar los privilegios de las cuentas, utilizar procedimientos almacenados y establecer sistemas de registro y monitoreo para detectar actividades sospechosas.
Otro tipo de ataque es el Cross-Site Scripting (XSS), donde se inserta código malicioso en páginas web y es ejecutado cuando otros usuarios las visitan. La defensa contra XSS incluye la sanitización y validación de las entradas según el tipo de dato esperado, además de implementar una Content Security Policy (CSP) que restringe los recursos que el navegador puede cargar para la página web.
Existen más medidas adicionales para asegurar una base de datos, como el uso de PDOException para manejar errores, variables de entorno para almacenar configuraciones sensibles, cifrado de datos sensibles y hashing de contraseñas. También es importante mantener PHP y el SGBD actualizado, usar HTTPS para las comunicaciones, evitar inserciones masivas de datos realizadas por bots y hacer copias de seguridad regularmente. Estas medidas, entre otras, refuerzan la protección de la base de datos contra diversas amenazas.
XSS (Cross-Site Scripting) es una vulnerabilidad de seguridad en aplicaciones web donde un atacante inyecta 'scripts' maliciosos en contenido confiable, permitiendo ejecutar código en el navegador del usuario, robar información sensible y alterar la interacción con la aplicación.
CSP (Content Security Policy) es una medida de seguridad web que ayuda a prevenir ataques como Cross-Site Scripting (XSS) y otros inyecciones de código restringiendo los recursos que un navegador puede cargar en una página web.
Un SGDB (Sistema Gestor de Bases de Datos) es un software que permite crear, administrar y gestionar bases de datos, facilitando la organización, almacenamiento, consulta y manipulación de datos de manera eficiente y segura.
HTTPS (Hypertext Transfer Protocol Secure) es una extensión de HTTP que utiliza cifrado SSL/TLS para asegurar la comunicación entre el navegador del usuario y el servidor web, garantizando la confidencialidad, integridad y autenticidad de los datos transferidos.
PHP (acrónimo recursivo de PHP: Hypertext Preprocessor) es un lenguaje de programación de código abierto del lado del servidor, utilizado principalmente para el desarrollo web. Permite crear contenido dinámico en páginas y aplicaciones web, facilitando la conexión a bases de datos y el manejo de formularios.
La inyección SQL es una técnica de ataque en la que un atacante inserta código malicioso en una consulta SQL, con el objetivo de manipular la base de datos. Este tipo de ataque puede resultar en la divulgación no autorizada de datos, la modificación o eliminación de información, y, en algunos casos, la toma de control total del sistema de base de datos.
Para ilustrar cómo funciona una inyección SQL, consideremos un ejemplo sencillo. Supongamos que una aplicación web tiene el siguiente código PHP para autenticar usuarios:
$username = $_POST['username'];
$password = $_POST['password'];
$query = "SELECT * FROM users WHERE username = '$username' AND password = '$password'";
$result = mysqli_query($conn, $query);
Si un atacante ingresa como username el siguiente valor: ' OR '1'='1' --, la consulta resultante sería:
SELECT * FROM users WHERE username = '' OR '1'='1' --' AND password = ''
La condición OR '1'='1' siempre es verdadera, lo que permite al atacante eludir la autenticación sin necesidad de conocer el nombre de usuario o la contraseña correctos.
Una forma efectiva de prevenir la inyección SQL es usar consultas preparadas con las funciones prepare y execute. Al emplear estas consultas, los parámetros se envían por separado del código SQL, evitando que los datos puedan ser interpretados como código. Esto significa que, incluso si un usuario malintencionado intenta insertar SQL malicioso en los campos de entrada, esos valores se tratarán únicamente como datos, eliminando el riesgo de inyección.
$stmt = $pdo->prepare('SELECT * FROM users WHERE username = :username AND password = :password');
$stmt->execute(['username' => $username, 'password' => $password]);
En este código, los valores de $username y $password se vinculan de manera segura a la consulta, eliminando la posibilidad de inyección SQL.
Además de usar consultas preparadas, existen otras medidas adicionales que pueden ayudar a mejorar la seguridad de la base de datos. Una es validar y sanitizar todas las entradas del usuario, lo cual se verá en la siguiente sección.
Otra práctica recomendada es limitar los privilegios de las cuentas de la base de datos. No todas las aplicaciones necesitan acceso completo a la base de datos. Asignar el menor nivel de privilegios necesarios puede minimizar el impacto de un ataque exitoso. Por ejemplo, una cuenta utilizada para operaciones de solo lectura no debe tener permisos de escritura.
Ejemplo de cómo asignar privilegios mínimos a una cuenta de usuario en MySQL o en MariaDB:
CREATE USER 'readonly_user'@'localhost' IDENTIFIED BY 'password';
GRANT SELECT ON database_name.* TO 'readonly_user'@'localhost';
FLUSH PRIVILEGES;
Este código crea un usuario readonly_user con una contraseña y le otorga permisos de solo lectura, específicamente solo usar SELECT, en todas las tablas de database_name.
El uso de procedimientos almacenados también puede ser beneficioso. Los procedimientos almacenados encapsulan las operaciones de la base de datos y pueden ser diseñados para aceptar solo parámetros específicos, lo que reduce la superficie de ataque.
Ejemplo de creación y uso de un procedimiento almacenado en MySQL:
CREATE PROCEDURE GetUser(IN username VARCHAR(50), IN password VARCHAR(50))
SELECT * FROM users WHERE username = username AND password = password;
Para ejecutar este procedimiento desde PHP usando PDO:
Finalmente, implementar registros y monitoreo puede ayudar a detectar intentos de inyección SQL. Las herramientas de monitoreo pueden alertar sobre patrones inusuales en las consultas SQL, permitiendo una respuesta rápida a posibles ataques.
SQL (Structured Query Language) es un lenguaje de programación estándar utilizado para gestionar y manipular bases de datos relacionales. Permite realizar operaciones como consultas, inserciones, actualizaciones y eliminaciones de datos, así como la creación y modificación de la estructura de las bases de datos.
PDO (PHP Data Objects) es una extensión de PHP que define una interfaz ligera y consistente para acceder a bases de datos en PHP. Proporciona una capa de abstracción que permite interactuar con diferentes Sistemas Gestores de Bases de Datos (SGBD) usando el mismo código.
MariaDB es un Sistema Gestor de Bases de Datos (SGBD) relacional derivado de MySQL. Es de código abierto y ofrece alta compatibilidad con MySQL, junto con alto rendimiento, escalabilidad y seguridad. Además, cuenta con funcionalidades adicionales y actualizaciones frecuentes.
MySQL es un Sistema de Gestor de Bases de Datos (SGBD) relacional de código abierto, conocido por su alto rendimiento, fiabilidad y facilidad de uso. Es ampliamente utilizado en aplicaciones web y se basa en el lenguaje SQL para gestionar, almacenar y recuperar datos.
PHP (acrónimo recursivo de PHP: Hypertext Preprocessor) es un lenguaje de programación de código abierto del lado del servidor, utilizado principalmente para el desarrollo web. Permite crear contenido dinámico en páginas y aplicaciones web, facilitando la conexión a bases de datos y el manejo de formularios.
Además de las medidas ya mencionadas, es recomendable implementar firewalls de aplicaciones web (WAF). Un WAF (Web Application Firewall) actúa como una barrera entre el servidor web y los usuarios, inspeccionando y filtrando el tráfico HTTP para detectar y bloquear patrones de ataque, como intentos de inyección SQL. Estos firewalls pueden configurarse para reconocer firmas de ataques comunes y proporcionar una capa adicional de seguridad al entorno de la base de datos.
Otra práctica es realizar auditorías y pentesting periódicos. Las auditorías revisan el código y las configuraciones de seguridad para identificar posibles vulnerabilidades, mientras que el pentesting simula ataques reales para evaluar la efectividad de las defensas existentes. Estas actividades permiten identificar y corregir debilidades específicas que podrían ser explotadas mediante inyecciones SQL, fortaleciendo así la seguridad de la base de datos.
La defensa contra Cross-Site Scripting (XSS) es una práctica para evitar que los scripts maliciosos comprometan la seguridad de las aplicaciones web. El objetivo principal es asegurarse de que cualquier dato introducido por el usuario no contenga elementos maliciosos que puedan comprometer la seguridad de la aplicación o la integridad de los datos.
Primero, es importante comprender qué es un ataque XSS. El Cross-Site Scripting es una vulnerabilidad que permite a un atacante inyectar scripts maliciosos en el contenido que se muestra a otros usuarios. Estos scripts pueden ser utilizados para robar cookies, modificar la apariencia de la página web o redirigir a los usuarios a sitios web maliciosos.
Para entender cómo funciona un ataque XSS, considera el siguiente ejemplo de código PHP:
// Supongamos que un usuario envía su nombre a través de un formulario
$user_input = $_POST['username'];
// Esta entrada se almacenaría en la base de datos sin sanitizarla
$stored_input = $user_input;
// Más tarde, el contenido se muestra en una página web
echo "Bienvenido, " . $stored_input . "!";
Si un atacante introduce el siguiente código como su nombre:
<script>alert('XSS');</script>
La salida en la página web será:
¡Bienvenido, <script>alert('XSS');</script>!
Esto hará que el navegador ejecute el script, mostrando una alerta con el mensaje XSS. Este es solo un ejemplo simple, pero un script malicioso puede incluir cualquier código que comprometa la seguridad, como robar cookies, registrar pulsaciones de teclas, o redirigir a sitios de phishing.
Para prevenir los ataques XSS, es necesario filtrar todas las entradas de usuario. Esto implica sanitizar y validar los datos antes de procesarlos o almacenarlos en la base de datos. En PHP, hay varias funciones y técnicas que se pueden emplear para este propósito.
Una de las funciones más básicas y útiles en PHP es htmlspecialchars(). Esta función convierte caracteres especiales en entidades HTML, evitando que los scripts se ejecuten. Por ejemplo:
En este caso, strip_tags() elimina todas las etiquetas, incluyendo el script malicioso, aunque también puede eliminar etiquetas válidas y necesarias para el contenido.
Al trabajar con bases de datos, se deben sanitizar y validar las entradas según su tipo de datoesperado. En PHP, se pueden emplear métodos como filter_var() para este propósito. Por ejemplo, si se espera un entero, se puede usar:
En este caso, htmlspecialchars() convierte los caracteres especiales en entidades HTML, y luego urlencode() codifica estos caracteres en una cadena de texto, incluyendo espacios y otros caracteres especiales. Finalmente, urldecode() decodifica la URL codificada.
Una política adicional para prevenir XSS es implementar Content Security Policy(CSP). CSP es una capa de seguridad que ayuda a detectar y mitigar ciertos tipos de ataques, incluyendo XSS. CSP permite a los desarrolladores especificar dominios permitidos para cargar recursos, lo que puede ayudar a prevenir la ejecución de scripts maliciosos. Por ejemplo, se puede definir una política CSP mediante el encabezado HTTP:
Este encabezado indica que solo se pueden cargar scripts desde el propio dominio ('self') y desde https://trusted.cdn.com, bloqueando scripts de otros orígenes.
XSS (Cross-Site Scripting) es una vulnerabilidad de seguridad en aplicaciones web donde un atacante inyecta 'scripts' maliciosos en contenido confiable, permitiendo ejecutar código en el navegador del usuario, robar información sensible y alterar la interacción con la aplicación.
HTML (HyperText Markup Language) es el lenguaje estándar utilizado para crear y diseñar páginas web. Utiliza etiquetas para estructurar el contenido, como texto, imágenes, enlaces y otros elementos multimedia, permitiendo la visualización de información en navegadores web.
HTTP (HyperText Transfer Protocol) es un protocolo de comunicación utilizado para transferir información en la web. Permite la comunicación entre un navegador (cliente) y un servidor web, facilitando la carga de páginas web y el intercambio de datos.
CSP (Content Security Policy) es una medida de seguridad web que ayuda a prevenir ataques como Cross-Site Scripting (XSS) y otros inyecciones de código restringiendo los recursos que un navegador puede cargar en una página web.
PHP (acrónimo recursivo de PHP: Hypertext Preprocessor) es un lenguaje de programación de código abierto del lado del servidor, utilizado principalmente para el desarrollo web. Permite crear contenido dinámico en páginas y aplicaciones web, facilitando la conexión a bases de datos y el manejo de formularios.
Además de las consultas preparadas, la limitación de privilegios de las cuentas, el uso de procedimientos almacenados, la implementación de registros y monitoreo, la sanitización y validación de entradas según el tipo de dato esperado y emplear Content Security Policy (CSP), todas ellas vistas anteriormente, es muy importante aplicar medidas de protección adicionales.
Primero, es importante mencionar que el uso de } catch (PDOException $e) { echo 'Error: ' . $e->getMessage(); } usado en las secciones anteriores es útil para entornos de desarrollo pero no es seguro en entornos de producción. Este enfoque puede exponer detalles internos del sistema, como credenciales o la estructura de la base de datos, poniendo en riesgo la seguridad. En lugar de eso, se debe registrar el error en un archivo seguro y mostrar un mensaje genérico al usuario:
try {
// Código para la conexión y consulta a la base de datos
} catch (PDOException $e) {
// Registrar el error en un archivo de log
error_log($e->getMessage(), 3, '/var/log/app_errors.log');
// Mostrar un mensaje genérico al usuario
echo 'Ha ocurrido un error. Por favor, inténtelo de nuevo más tarde.';
}
Otra opción es manejar la PDOException desde un gestor de excepciones. Esto es particularmente útil en proyectos grandes donde se necesita una gestión centralizada y uniforme de las excepciones.
Una práctica destacada es el uso de variables de entorno para guardar las credenciales de conexión a la base de datos. Almacenar directamente las credenciales en el código fuente puede ser peligroso, ya que facilita el acceso a cualquier persona que tenga acceso al repositorio de código. En su lugar, las credenciales deben guardarse en un archivo de configuración que no esté incluido en el control de versiones. Por ejemplo, en PHP se puede usar la función getenv() para obtener las variables de entorno:
Otra medida relevante es el cifrado de datos sensibles en la base de datos. Para proteger información como números de tarjetas de crédito o datos personales, se debe utilizar un algoritmo de cifrado robusto. La extensión openssl de PHP es una opción para cifrar y descifrar datos. A continuación, se muestra un ejemplo básico que debe ampliarse según las necesidades del sistema:
El uso de hashing para almacenar contraseñas de usuarios en la base de datos es una técnica clave. El hashing convierte una contraseña en una cadena de longitud fija que no puede ser revertida a su forma original, lo que añade una capa de seguridad. Por ejemplo, PHP ofrece funciones como password_hash() y password_verify() para manejar hashes de contraseñas de manera segura:
$password = "contraseña_segura";
// Hashea la contraseña utilizando el algoritmo BCRYPT
$hashed_password = password_hash($password, PASSWORD_BCRYPT);
// Verifica que la contraseña ingresada coincida con el Hash almacenado
$isPasswordCorrect = password_verify($password, $hashed_password);
Además, se debe mantener actualizado PHP y el SGBD con los últimos parches de seguridad. Las actualizaciones suelen incluir correcciones para vulnerabilidades conocidas que pueden ser explotadas por atacantes. No aplicar estas actualizaciones puede dejar el sistema expuesto a riesgos innecesarios.
El uso de HTTPS para la aplicación web garantiza que la información transmitida entre el cliente y el servidor esté cifrada. HTTPS protege contra ataques de tipo Man-in-the-Middle (MitM), asegurando que los datos no sean interceptados ni modificados durante su transmisión, como por ejemplo información sensible a guardar en la base de datos.
Para prevenir la inserción masiva de datos realizada por bots, es recomendable implementar CAPTCHA en los formularios. Un CAPTCHA añade un desafío adicional que debe ser resuelto por el usuario, dificultando los intentos automatizados de envío de datos masivos a las bases de datos.
Realizar backups regulares y seguros de bases de datos es otra medida destacada. Los backups permiten recuperar datos en caso de pérdida, corrupción o ataque. Es importante que estos backups se almacenen en ubicaciones seguras y se verifiquen periódicamente para asegurar su integridad y disponibilidad.
Existen muchas más medidas de seguridad para proteger una base de datos. La combinación de todas proporciona una defensa sólida contra una amplia gama de amenazas y vulnerabilidades, asegurando la integridad y confidencialidad de los datos gestionados.
CSP (Content Security Policy) es una medida de seguridad web que ayuda a prevenir ataques como Cross-Site Scripting (XSS) y otros inyecciones de código restringiendo los recursos que un navegador puede cargar en una página web.
Un SGDB (Sistema Gestor de Bases de Datos) es un software que permite crear, administrar y gestionar bases de datos, facilitando la organización, almacenamiento, consulta y manipulación de datos de manera eficiente y segura.
HTTPS (Hypertext Transfer Protocol Secure) es una extensión de HTTP que utiliza cifrado SSL/TLS para asegurar la comunicación entre el navegador del usuario y el servidor web, garantizando la confidencialidad, integridad y autenticidad de los datos transferidos.
CAPTCHA es una prueba automatizada diseñada para distinguir entre humanos y 'bots' en línea. Utiliza desafíos que son fáciles para los humanos pero difíciles para las máquinas, como identificar texto distorsionado o seleccionar imágenes específicas.
Man-in-the-Middle (MitM) es un ataque cibernético donde un atacante intercepta y posiblemente altera la comunicación entre dos partes sin su conocimiento, haciéndose pasar por cada una de ellas para robar datos, espiar o manipular la información intercambiada.
PHP (acrónimo recursivo de PHP: Hypertext Preprocessor) es un lenguaje de programación de código abierto del lado del servidor, utilizado principalmente para el desarrollo web. Permite crear contenido dinámico en páginas y aplicaciones web, facilitando la conexión a bases de datos y el manejo de formularios.
La función hash convierte datos en una cadena de longitud fija y cifrada, que no puede revertirse a su forma original. Este proceso se usa para almacenar contraseñas de manera segura en una base de datos. Al emplear funciones de hashing, como password_hash() en PHP, la contraseña ingresada se transforma en un hash irreconocible. Por ejemplo, una contraseña como P@ssw0rd1234! puede ser almacenada como:
Si un atacante accede a la base de datos y obtiene los hashes de las contraseñas, no puede revertirlos a las contraseñas originales debido a la naturaleza unidireccional del hashing. Aunque intentara adivinar la contraseña original, métodos adicionales como el salting hacen que el proceso sea extremadamente difícil. El salt es un valor aleatorio añadido a cada contraseña antes de aplicar el hash, lo que asegura que incluso contraseñas idénticas generen hashes diferentes. Por ejemplo, password_hash("P@ssw0rd1234!", PASSWORD_BCRYPT) incluye un salt automáticamente, fortaleciendo aún más la seguridad de la contraseña a almacenar en la base de datos.
Para obtener una visión más amplia y completa sobre la seguridad en la base de datos, se recomienda comenzar con la Wikipedia, que proporciona una buena introducción y cubre conceptos esenciales y técnicas comunes. Puedes acceder a su artículo sobre Database Security para más detalles.
Además, la documentación oficial de PHP ofrece una sección dedicada a la seguridad en las bases de datos, que incluye prácticas recomendadas y ejemplos de código para mejorar la protección de las aplicaciones web. Puedes explorar estos recursos en PHP Manual - Database Security.
Otra fuente valiosa es IBM, que aborda la seguridad en las bases de datos desde una perspectiva empresarial, ofreciendo soluciones y tecnologías avanzadas para proteger datos sensibles en entornos corporativos. Más información está disponible en IBM - Database Security.
En la presente unidad, se utilizan imágenes procedentes de Unsplash exceptuando las imágenes de elaboración propia que tienen licencia CC BY-SA.
Unsplash concede una licencia irrevocable, no exclusiva y de alcance mundial para descargar, copiar, modificar, distribuir, ejecutar y utilizar las fotografías disponibles en su plataforma sin costo alguno, incluso para fines comerciales, sin requerir permiso ni atribución al fotógrafo o a Unsplash. No obstante, esta licencia no permite recopilar fotografías de Unsplash con el propósito de replicar un servicio similar o competidor.
Materiales desarrollados inicialmente por el Ministerio de Educación, Cultura y Deporte y actualizados por el profesorado de la Junta de Andalucía bajo licencia Creative Commons BY-NC-SA.
Antes de cualquier uso leer detenidamente el siguenteAviso legal
Actualización de materiales y correcciones menores.
Versión: 02.00.00
Fecha de actualización: 02/06/24
Autoría: Manuel Ignacio López Quintero
Ubicación: Varios Mejora (tipo 3): Se recomienda una serie de actualizaciones en los materiales de la Unidad 2 (Trabajar con bases de datos en PHP) del módulo profesional DWES (Desarrollo Web en Entorno Servidor). La primera propuesta es renombrar la unidad como Uso de bases de datos en PHP y aumentar las horas asignadas a 25, para reflejar mejor la profundidad y el alcance del contenido.
Se propone mejorar la sección de introducción introduciendo el uso de objetos, enfocándose en la instanciación y el uso de métodos, especialmente porque tanto PDO como MySQLi son orientados a objetos. Además, se sugiere añadir un nuevo subapartado dedicado a aspectos cruciales de seguridad con bases de datos. Este incluiría temas como la inyección SQL y la importancia de limpiar etiquetas antes de ingresar datos en la base para prevenir la inserción de JavaScript malicioso a través de formularios.
Se propone también reorganizar el contenido actual, moviendo y mejorando la sección sobre errores y excepciones antes de las secciones sobre PDO y MySQLi. Al hacerlo, se facilitaría la comprensión de cómo utilizar excepciones desde el inicio, especialmente dado que la creación de una conexión con PDO puede generar excepciones si no se logra conectar.
Se recomienda modificar los ejemplos del apartado 3 para adoptar un enfoque más estructurado en la programación, utilizando funciones y asegurando la filtración y validación adecuada de los datos de entrada.
Se propone proporcionar ejemplos más aplicados y realistas de begin_transaction y el uso de consultas preparadas en Mysqli, así como la implementación de fetchAll en PDO. Además, es importante asegurarse de que los ejemplos de consultas preparadas en PDO sean realistas y utilicen parámetros.
Se debería enfatizar el uso de try-catch para el establecimiento de conexiones desde el principio, y abordar cómo PDO puede generar excepciones en consultas. El uso de bindValue y bindParam en PDO también requiere una explicación detallada, destacando que bindParam es más eficiente para ejecutar la misma consulta múltiples veces.
Por último, se sugiere añadir una sección inicial que repase conceptos fundamentales de bases de datos, SGBD (Sistema Gestor de Base de Datos), modelos de datos, y los pasos necesarios a realizar desde la descripción de un problema hasta la implementación del modelo de base de datos en SQL.
Ubicación: Varios Mejora (Mapa conceptual): Actualización del mapa conceptual ajustado a los nuevos contenidos.
Ubicación: Varios Mejora (Orientaciones del alumnado): Actualización de las orientaciones de alumnado ajustadas a los nuevos contenidos.
Versión: 01.01.00
Fecha de actualización: 04/11/14
Autoría: Manuel Alberto Domínguez Vega
Añadidas las credenciales a las imagenes.
Cambio de una imagen que era inexistente en la actualidad
Cambio a los nuevos formatos PFaD/FPS de los elementos multimedia
Añadidas las definiciones con el nuevo formato exelearning
Comprobadas los fragmentos de codigo
Añadidos y comprobados los acronimos
Arreglados los enlaces rotos (S)