Cómo guardar datos de un formulario HTML en MySQL
Los formularios HTML permiten a los usuarios introducir datos directamente en una página web, que luego pueden guardarse en una base de datos. Actúan como la interfaz entre la página web y la base de datos, lo que permite registrar y gestionar entradas como nombres, direcciones de correo electrónico o comentarios. En esta guía te mostramos cómo guardar la información de un formulario HTML en una base de datos MySQL/MariaDB con PHP.
Bases de datos a medida de tus necesidades. Incluye soporte 24/7.
- Arquitectura de primera
- Soporte 24/7
- Centros de datos certificados
Requisitos
Para guardar de forma fiable los datos de un formulario HTML para MySQL en una base de datos MySQL o MariaDB, necesitas un entorno técnico que cumpla los siguientes requisitos:
- Servidor web con soporte para PHP: un servidor web Apache o NGINX con PHP instalado y activado, de modo que los scripts del lado del servidor puedan procesar los datos enviados desde el formulario.
- Conocimientos básicos de PHP y SQL: nociones fundamentales de PHP y SQL para establecer la conexión con la base de datos e insertar correctamente los datos del formulario.
- Acceso a la configuración del servidor web: permisos para ejecutar scripts PHP, crear tablas en la base de datos y, si es necesario, ajustar la configuración o los permisos del servidor.
Apache, MySQL/MariaDB y PHP suelen formar parte de una instalación estándar. Si tu servidor se ha configurado con una instalación mínima, deberás instalar y configurar estos componentes antes de continuar.
Cómo insertar datos de un formulario HTML en MySQL/MariaDB
Para este tutorial, creamos una página web ficticia para un restaurante. El objetivo es ofrecer a los clientes la posibilidad de dejar reseñas directamente a través de la página web. Para ello, te mostramos cómo procesar formularios HTML con un script de PHP y cómo guardar los datos introducidos en una base de datos MySQL o MariaDB.
Paso 1: crea la base de datos
En el primer paso, creamos una base de datos para almacenar la información enviada desde el formulario HTML para MySQL. Para ello, inicia sesión en el cliente de MySQL/MariaDB desde la línea de comandos:
mysql -u root -pbashA continuación, crea una base de datos para las reseñas utilizando el comando SQL CREATE DATABASE:
CREATE DATABASE reviews;bashDespués, selecciona la base de datos recién creada:
USE reviews;bashPara este ejemplo y con el fin de simplificar el proceso, vamos a crear una tabla con los siguientes campos:
- Campo de ID: se configura con
AUTO_INCREMENT, lo que hace que el valor aumente automáticamente con cada nuevo registro y garantiza un identificador único. - Nombre de la persona que deja la reseña: campo de texto con una longitud máxima de 100 caracteres.
- Valoración por estrellas: valor numérico del 1 al 5, definido con el tipo de dato
TINYINT. - Detalles de la reseña: campo de texto para comentarios adicionales, definido como
VARCHAR(4000)para que quepan unas 500 palabras.
Crea ahora la tabla con el comando CREATE TABLE:
CREATE TABLE user_review (
id MEDIUMINT NOT NULL AUTO_INCREMENT PRIMARY KEY,
reviewer_name VARCHAR(100),
star_rating TINYINT,
details VARCHAR(4000)
);bashPaso 2: crea un usuario
Por motivos de seguridad, es recomendable crear un usuario específico para cada base de datos, especialmente cuando se accede a ella desde una página web. De este modo, limitas los permisos y reduces posibles riesgos en caso de incidencias de seguridad.
El siguiente comando de MariaDB crea un usuario llamado review_site con la contraseña JxSLRkdutW y le concede acceso a la base de datos con las reseñas:
GRANT ALL ON reviews.* TO review_site@localhost IDENTIFIED BY 'JxSLRkdutW';bashSi utilizas MySQL, el uso de GRANT ... IDENTIFIED BY ... ya no se recomienda en las versiones actuales. En su lugar, primero debes crear el usuario con CREATE USER y, a continuación, asignarle los permisos con GRANT:
CREATE USER 'review_site'@'localhost' IDENTIFIED BY 'JxSLRkdutW';
GRANT ALL PRIVILEGES ON reviews.* TO 'review_site'@'localhost';
FLUSH PRIVILEGES;bashPaso 3: crea el formulario HTML para MySQL en la página web
En el siguiente paso, creamos el formulario de valoración para las reseñas de clientes. Para ello, crea un archivo llamado reviews.html en tu espacio web y ábrelo para editarlo. Por ejemplo, si deseas crear el archivo en /var/www/html utilizando el editor de texto nano, ejecuta el siguiente comando:
sudo nano /var/www/html/reviews.htmlbashA continuación, añade el siguiente contenido al archivo:
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8">
<title>Valoración del restaurante</title>
</head>
<body>
<p>¿Cómo ha sido tu experiencia con nosotros?</p>
<form action="addreview.php" method="POST">
Tu nombre: <input type="text" name="reviewer_name"><br><br>
¿Cuántas estrellas nos darías?
<select name="star_rating">
<option value="1">1 estrella</option>
<option value="2">2 estrellas</option>
<option value="3">3 estrellas</option>
<option value="4">4 estrellas</option>
<option value="5">5 estrellas</option>
</select><br><br>
Tu reseña:<br>
<textarea name="details" rows="10" cols="30"></textarea><br><br>
<input type="submit" value="Enviar" name="submit">
</form>
</body>
</html>htmlA continuación, ten en cuenta los siguientes aspectos sobre este formulario HTML para MySQL básico:
- Este formulario usa el método
POSTpara enviar datos al script PHPaddreview.php. - El atributo
namede cada campo de entrada se utiliza en el siguiente paso como nombre de variable en PHP. Por lo general, resulta práctico usar los mismos nombres que los campos de la tabla de la base de datos. - Nunca confíes en las entradas de los usuarios. En este ejemplo, la valoración por estrellas debe ser un número del 1 al 5. Si se permitiera introducir el valor manualmente, podrían enviarse datos no válidos. Por ello, es preferible ofrecer valores predefinidos mediante un menú desplegable.
Paso 4: crea un script PHP
En el último paso, creamos el script PHP que inserta los datos del formulario HTML para MySQL en la base de datos. Para ello, establecemos una conexión con MySQL o MariaDB, recogemos las entradas del formulario y las guardamos en la tabla creada anteriormente. Primero, crea un archivo addreview.php en tu espacio web y ábrelo para editarlo. Ahí colocarás el código PHP. Por ejemplo, para crear el archivo en /var/www/html con nano, utiliza este comando:
sudo nano /var/www/html/addreview.phpbashTodo script PHP debe comenzar con la etiqueta de apertura:
<?phpphpA continuación, añade un bloque con los datos de conexión a MySQL/MariaDB: ubicación del servidor (localhost), nombre de la base de datos, usuario y contraseña.
$hostname = "localhost";
$username = "review_site";
$password = "JxSLRkdutW";
$db = "reviews";phpEl siguiente fragmento establece la conexión mediante mysqli_connect y muestra un error si falla:
$dbconnect = mysqli_connect($hostname, $username, $password, $db);
if (mysqli_connect_errno()) {
die("Database connection failed: " . mysqli_connect_error());
}phpEn el siguiente paso, recogemos los datos que el usuario ha introducido a través del formulario HTML para MySQL y los guardamos en variables PHP para poder procesarlos e insertarlos en la base de datos:
if (isset($_POST['submit'])) {
$reviewer_name = $_POST['reviewer_name'];
$star_rating = $_POST['star_rating'];
$details = $_POST['details'];phpAhora debemos escribir en la base de datos los datos introducidos. Para ello, creamos una consulta SQL INSERT que toma los valores de las variables y los inserta en los campos correspondientes de la tabla user_review. Para evitar inyecciones SQL, utilizamos Prepared Statements:
$stmt = $dbconnect->prepare("INSERT INTO user_review (reviewer_name, star_rating, details) VALUES (?, ?, ?)");
$stmt->bind_param("sis", $reviewer_name, $star_rating, $details);
$stmt->execute();phpAñade una instrucción if-else en PHP que muestre un mensaje de error si el proceso falla. Si se completa correctamente, muestra un mensaje de agradecimiento:
if ($stmt->execute()) {
echo "Gracias por tu reseña.";
} else {
die("Se ha producido un error.");
}
$stmt->close();
}phpPor último, cierra la instrucción if de apertura y añade la etiqueta de cierre de PHP:
}
?>phpSi recibes el mensaje de error “Access denied for user ‘review_site’@‘localhost’ (using password: YES)”, puedes comprobar las credenciales iniciando sesión manualmente en MySQL/MariaDB desde la línea de comandos.
Paso 5: prueba el script
Para probar el script, abre reviews.html en el navegador y envía una valoración de ejemplo. Después, inicia sesión en la base de datos de reseñas desde la línea de comandos con el cliente MySQL/MariaDB:
mysql -u root -p reviewsbashUsa SELECT * FROM user_review para mostrar todo el contenido de la tabla:
MariaDB [reviews]> SELECT * FROM user_review;
+----+---------------+-------------+----------------------------------------------------+
| id | reviewer_name | star_rating | details |
+----+---------------+-------------+----------------------------------------------------+
| 1 | Pedro | 5 | ¡El calzone está delicioso! |
| 2 | Laura | 1 | No recomiendo el calzone. |
+----+---------------+-------------+----------------------------------------------------+
2 rows in set (0.00 sec)bashEl script PHP completo es:
<?php
// Datos de conexión a la base de datos
$hostname = "localhost";
$username = "review_site";
$password = "JxSLRkdutW";
$db = "reviews";
// Establecer conexión con la base de datos
$dbconnect = new mysqli($hostname, $username, $password, $db);
// Comprobar la conexión
if ($dbconnect->connect_error) {
die("Database connection failed: " . $dbconnect->connect_error);
}
// Ejecutar solo si se ha enviado el formulario
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['submit'])) {
// Validar entradas (comprobación mínima)
$reviewer_name = trim($_POST['reviewer_name'] ?? '');
$star_rating = intval($_POST['star_rating'] ?? 0);
$details = trim($_POST['details'] ?? '');
// Validación sencilla
if ($reviewer_name === '' || $star_rating < 1 || $star_rating > 5 || $details === '') {
die("Por favor, rellena todos los campos correctamente.");
}
// Crear una sentencia preparada
$stmt = $dbconnect->prepare("INSERT INTO user_review (reviewer_name, star_rating, details) VALUES (?, ?, ?)");
if ($stmt === false) {
die("Database error: " . $dbconnect->error);
}
$stmt->bind_param("sis", $reviewer_name, $star_rating, $details);
// Ejecutar la sentencia
if ($stmt->execute()) {
echo "Gracias por tu reseña.";
} else {
die("Se ha producido un error: " . $stmt->error);
}
$stmt->close();
}
// Cerrar la conexión
$dbconnect->close();
?>php
