W3docs

Cómo insertar datos en una base de datos MySQL usando PHP

Aprende a insertar datos en una base de datos MySQL con PHP usando mysqli y sentencias preparadas de forma segura y eficiente.

Insertar datos es la forma en que una aplicación PHP escribe en una base de datos MySQL: guardar un nuevo usuario, registrar un pedido o almacenar un comentario. Cada escritura es una sentencia SQL INSERT INTO que PHP envía a través de una conexión de base de datos abierta. Este artículo recorre el flujo completo con la extensión mysqli y luego muestra la forma más segura y moderna usando sentencias preparadas, que deberías usar en proyectos reales.

Lo que aprenderás

  • Cómo abrir una conexión y ejecutar un INSERT básico
  • Por qué concatenar valores en SQL es peligroso y cómo lo solucionan las sentencias preparadas
  • Cómo recuperar el ID autogenerado de la fila que acabas de insertar
  • Cómo insertar varias filas de forma eficiente

Requisitos previos

Antes de comenzar, debes tener:

  • Un servidor web con PHP (7.4+) y la extensión mysqli instalada
  • Una base de datos MySQL (o MariaDB) en funcionamiento
  • Una herramienta de administración de bases de datos como phpMyAdmin o acceso por línea de comandos

Estos ejemplos asumen una tabla users. Puedes crearla con:

CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    first_name VARCHAR(50),
    last_name  VARCHAR(50),
    email      VARCHAR(100)
);

Si eres nuevo en la creación de tablas, consulta Crear una tabla MySQL.

Paso 1: Establecer una conexión

El primer paso es conectarse a la base de datos con mysqli_connect(), que acepta cuatro argumentos: el host del servidor, el nombre de usuario, la contraseña y el nombre de la base de datos. Devuelve un objeto de conexión que reutilizas en cada consulta.

<?php

$server   = "localhost";
$username = "root";
$password = "password";
$database = "database_name";

$conn = mysqli_connect($server, $username, $password, $database);

// Always check the connection before continuing.
if (!$conn) {
    die("Connection failed: " . mysqli_connect_error());
}
echo "Connected successfully";

?>

mysqli_connect_error() devuelve un mensaje legible cuando la conexión falla — una contraseña incorrecta, un host inaccesible o una base de datos inexistente — para que no tengas que adivinar qué salió mal.

Paso 2: Ejecutar un INSERT básico

Con la conexión lista, puedes ejecutar una consulta INSERT usando mysqli_query(). Acepta la conexión y la cadena SQL, y devuelve true en caso de éxito o false en caso de error.

<?php
$sql = "INSERT INTO users (first_name, last_name, email)
        VALUES ('John', 'Doe', '[email protected]')";

if (mysqli_query($conn, $sql)) {
    echo "New record created successfully";
} else {
    echo "Error: " . mysqli_error($conn);
}
?>

Esto funciona con valores codificados directamente, pero en el momento en que cualquier parte de la consulta proviene de la entrada del usuario, se vuelve inseguro. Un valor como O'Reilly (con un apóstrofo) rompe el SQL, y un valor malicioso puede reescribir tu consulta por completo — esto se llama inyección SQL. Nunca construyas consultas concatenando la entrada del usuario en una cadena.

Paso 3: Insertar de forma segura con sentencias preparadas

Una sentencia preparada envía el esqueleto SQL y los datos por separado. Los marcadores de posición (?) indican dónde van los valores, y mysqli_stmt_bind_param() vincula cada valor con su tipo (s para string, i para integer, d para double, b para blob). MySQL trata los valores vinculados estrictamente como datos, por lo que la inyección es imposible y el escape se gestiona automáticamente.

<?php
// 1. Prepare the statement with placeholders.
$stmt = mysqli_prepare(
    $conn,
    "INSERT INTO users (first_name, last_name, email) VALUES (?, ?, ?)"
);

// 2. Bind the input values: three strings -> "sss".
$first_name = "Jane";
$last_name  = "Smith";
$email      = "[email protected]";
mysqli_stmt_bind_param($stmt, "sss", $first_name, $last_name, $email);

// 3. Execute, then clean up.
if (mysqli_stmt_execute($stmt)) {
    echo "New record created successfully";
} else {
    echo "Error: " . mysqli_stmt_error($stmt);
}

mysqli_stmt_close($stmt);
?>

Este es el enfoque que debes usar en cualquier aplicación real. Para un análisis más profundo, consulta Sentencias preparadas en PHP MySQL.

Obtener el ID insertado

Cuando una tabla tiene una clave primaria AUTO_INCREMENT, MySQL asigna el id de la nueva fila automáticamente. Recupéralo con mysqli_insert_id() — útil cuando necesitas el ID para una consulta posterior o para devolverlo al usuario.

<?php
mysqli_query($conn, "INSERT INTO users (first_name, last_name, email)
                     VALUES ('Amy', 'Lee', '[email protected]')");

$new_id = mysqli_insert_id($conn);
echo "Inserted row has ID: " . $new_id;
?>

Consulta Obtener el último ID insertado para ver el panorama completo, incluido su comportamiento con sentencias preparadas.

Insertar varias filas

Para agregar varias filas a la vez, enumera múltiples conjuntos de valores en una sola sentencia. Un único viaje a la base de datos es mucho más rápido que ejecutar INSERT en un bucle.

<?php
$sql = "INSERT INTO users (first_name, last_name, email) VALUES
        ('John', 'Doe', '[email protected]'),
        ('Jane', 'Smith', '[email protected]'),
        ('Amy', 'Lee', '[email protected]')";

if (mysqli_query($conn, $sql)) {
    echo mysqli_affected_rows($conn) . " records inserted";
} else {
    echo "Error: " . mysqli_error($conn);
}
?>

Para insertar datos suministrados por el usuario en lote, vincula los valores dentro de un bucle en una sentencia preparada — consulta Insertar varias filas.

Paso 4: Cerrar la conexión

Cuando hayas terminado, cierra la conexión con mysqli_close() para liberar recursos. PHP cierra las conexiones automáticamente al final de una solicitud, pero cerrarla explícitamente es una buena práctica en scripts de larga duración.

<?php

mysqli_close($conn);

?>

Errores comunes

  • Olvidar comprobar el resultado. mysqli_query() devuelve false en caso de error; inspecciona siempre mysqli_error() para que un fallo silencioso no parezca un éxito.
  • Apóstrofos sin escapar. Nombres como O'Brien rompen una consulta construida con cadenas. Las sentencias preparadas eliminan el problema por completo.
  • Número de columnas incorrecto. El número de columnas debe coincidir con el número de valores, o MySQL rechaza la sentencia.
  • Tipo de vinculación incorrecto. Vincular un entero como "s" suele funcionar, pero los desajustes (por ejemplo, vincular un string a una columna i) pueden corromper datos silenciosamente.

Conclusión

Ahora sabes cómo insertar datos en MySQL desde PHP: abre una conexión, ejecuta un INSERT y cierra la conexión. Para cualquier cosa más allá de valores de prueba codificados directamente, usa sentencias preparadas para protegerte de la inyección SQL. A continuación, aprende a leer tus datos con Seleccionar datos.

Práctica

Práctica
¿Cuáles son los pasos para insertar datos en MySQL usando PHP?
¿Cuáles son los pasos para insertar datos en MySQL usando PHP?
Was this page helpful?