<?php$host = "localhost"; // Servidor de base de datos$user = "root"; // Usuario de MySQL$pass = ""; // Contraseña de MySQL$db = "bd_inventario"; // Nombre de la base de datos$conn = new mysqli($host, $user, $pass, $db);if ($conn->connect_error) { die("Error de conexión: " . $conn->connect_error);}?>
Seguridad en Producción: Nunca uses el usuario root con contraseña vacía en un servidor de producción. Crea un usuario específico con permisos limitados solo para esta base de datos.
Para mayor seguridad, crea un usuario dedicado para el sistema:
1
Acceder a MySQL
Abre phpMyAdmin o conéctate por terminal:
mysql -u root -p
2
Crear el usuario
Ejecuta los siguientes comandos SQL:
-- Crear usuarioCREATE USER 'inventario_user'@'localhost' IDENTIFIED BY 'tu_contraseña_segura';-- Otorgar permisos solo a la base de datos bd_inventarioGRANT SELECT, INSERT, UPDATE, DELETE ON bd_inventario.* TO 'inventario_user'@'localhost';-- Aplicar cambiosFLUSH PRIVILEGES;
CREATE TABLE usuarios ( id INT AUTO_INCREMENT PRIMARY KEY, nombre VARCHAR(100) NOT NULL, correo VARCHAR(100) UNIQUE NOT NULL, contraseña VARCHAR(255) NOT NULL, rol ENUM('Admin', 'Empleado') DEFAULT 'Empleado', fecha_creacion TIMESTAMP DEFAULT CURRENT_TIMESTAMP);
Seguridad Crítica: El sistema actualmente almacena contraseñas en texto plano. Esto es una vulnerabilidad de seguridad importante. Se recomienda implementar hashing antes de usar en producción.
Regenera las contraseñas de los usuarios existentes:
<?php// Script de migración (ejecutar una sola vez)include("config/conexion.php");$usuarios = $conn->query("SELECT id, contraseña FROM usuarios");while ($user = $usuarios->fetch_assoc()) { $hash = password_hash($user['contraseña'], PASSWORD_DEFAULT); $conn->query("UPDATE usuarios SET contraseña = '$hash' WHERE id = {$user['id']}");}echo "Contraseñas actualizadas exitosamente";?>
La tabla de productos contiene los siguientes campos:
CREATE TABLE productos ( id INT AUTO_INCREMENT PRIMARY KEY, nombre VARCHAR(150) NOT NULL, codigo VARCHAR(50) UNIQUE NOT NULL, precio DECIMAL(10, 2) NOT NULL DEFAULT 0.00, stock INT NOT NULL DEFAULT 0, fecha_creacion TIMESTAMP DEFAULT CURRENT_TIMESTAMP, fecha_actualizacion TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP);
Puedes agregar campos adicionales según tus necesidades:
-- Agregar categoríaALTER TABLE productos ADD COLUMN categoria VARCHAR(50) AFTER nombre;-- Agregar descripciónALTER TABLE productos ADD COLUMN descripcion TEXT AFTER codigo;-- Agregar ubicación en almacénALTER TABLE productos ADD COLUMN ubicacion VARCHAR(50) AFTER precio;-- Agregar stock mínimoALTER TABLE productos ADD COLUMN stock_minimo INT DEFAULT 5 AFTER stock;
Después de modificar la estructura de la base de datos, recuerda actualizar los archivos PHP correspondientes (crear.php, editar.php, listar.php) para incluir los nuevos campos.
El sistema registra automáticamente las entradas y salidas en la tabla movimientos:
CREATE TABLE movimientos ( id INT AUTO_INCREMENT PRIMARY KEY, producto_id INT NOT NULL, tipo ENUM('entrada', 'salida') NOT NULL, cantidad INT NOT NULL, fecha TIMESTAMP DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (producto_id) REFERENCES productos(id) ON DELETE CASCADE);
// Registrar movimiento$conn->query("INSERT INTO movimientos (producto_id, tipo, cantidad) VALUES ($producto_id, 'entrada', $cantidad)");// Aumentar stock$conn->query("UPDATE productos SET stock = stock + $cantidad WHERE id = $producto_id");
Salida de inventario (movimientos/salida.php):
// Registrar movimiento$conn->query("INSERT INTO movimientos (producto_id, tipo, cantidad) VALUES ($producto_id, 'salida', $cantidad)");// Disminuir stock$conn->query("UPDATE productos SET stock = stock - $cantidad WHERE id = $producto_id");
El sistema usa ON DELETE CASCADE en la clave foránea, lo que significa que al eliminar un producto, todos sus movimientos asociados también se eliminarán automáticamente.
Para que las fechas se registren correctamente en tu zona horaria:
config/conexion.php
<?php// Agregar después de la conexión exitosadate_default_timezone_set('America/Bogota'); // Ajusta según tu ubicación$conn->query("SET time_zone = '-05:00'"); // GMT-5 para Colombia?>