A la hora de insertar datos en nuestra base de datos MySQL desde nuestro código PHP debemos diferenciar entre dos métodos:
- Insertar datos usando MySQLi
- Insertar datos usando PDO
No vamos a entrar en la parte de crear la base de datos ni la tabla y sus campos, directamente vamos a suponer que tenemos creada una tabla llamada users, con los campos id, username y password.
Vamos a tener en cuenta, que id es la clave primaria y además es autoincremental, este detalle será importante a la hora de realizar la insert.

Vamos a pasar a ver como se haría la insert según si usamos un método u otro:
Insertar datos usando MySQLi
Lo primero que debemos tener es la conexión a nuestra base de datos establecida, algo similar a este código nos valdría para conectar a mysql desde PHP usando mysqli
$servername = "localhost"; $username = "usuario"; $password = "contraseña"; $dbname = "nombre_basedatos"; $conn = mysqli_connect($servername, $username, $password, $dbname); if (!$conn) { die("Conexión fallida: " . mysqli_connect_error()); }
Una vez que estamos conectados a la base de datos, podemos construir la consulta SQL para insertar datos en la tabla users. La consulta tendrá la forma de un string que contiene el comando SQL INSERT INTO seguido del nombre de la tabla y los valores que queremos insertar.
Como podemos apreciar, no es necesario indicar el parámetro autoincremental, será el propio mysql el que controles esa columna de la tabla users.
$username = "usuario_ejemplo"; $password = "contraseña_ejemplo"; $sql = "INSERT INTO users (username, password) VALUES ('$username', '$password')";
Después de construir la consulta de inserción, necesitamos ejecutarla utilizando la función mysqli_query().
if (mysqli_query($conn, $sql)) { echo "Nuevo registro insertado correctamente"; } else { echo "Error: " . $sql . "<br>" . mysqli_error($conn); }
La función mysqli_query realizará sobre la base de datos con la que tenemos realizada la conexión ($conn) la consulta que le proporcionamos como parámetro ($sql)
La función devuelve diferentes valores dependiendo del resultado y del tipo de consulta que se haya realizado:
- Retorna false en caso de error.
- Si una consulta del tipo SELECT, SHOW, DESCRIBE o EXPLAIN es exitosa, mysqli_query() retornará un objeto mysqli_result.
- Para otras consultas exitosas de mysqli_query(), distintas del punto anterior, retornará true.
*Más información sobre los parámetros de mysqli_query
Dada la anterior explicación sobre el resultado devuelto, si la consulta es exitosa se mostrará en pantalla el mensaje “Nuevo registro insertado correctamente” y si no es correcta la inserción se mostrará el mensaje de error devuelto por mysql.
Es importante cerrar la conexión una vez que hayamos terminado de trabajar con la base de datos para liberar recursos.
mysqli_close($conn);
Insertar datos usando PDO (PHP Data Object)
Para hacer la insert usando PDO debemos seguir la misma estructura de pasos que en mysqli pero usando las funciones de PDO, para la conexión por ejemplo podríamos usar algo así:
$servername = "localhost"; $username = "usuario"; $password = "contraseña"; $dbname = "nombre_basedatos"; try { $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password); $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); echo "Conexión realizada correctamente"; } catch(PDOException $e) { echo "Error de conexión: " . $e->getMessage(); }
Al igual que con MySQLi, necesitamos construir la consulta SQL para insertar datos en la tabla users, lo más cómodo a nivel visual es guardarla en una cadena de texto ($sql)
En PDO, antes de ejecutar la consulta, la preparamos utilizando la función prepare(). Esto nos permite evitar ataques de inyección SQL y asegurar una mayor seguridad en nuestra aplicación.
try { $stm = $conn->prepare($sql); //preparamos los parámetros de entreda $stmt->bindParam(':username', $username); $stmt->bindParam(':password', $password); //Ejecutamos la consulta $stmt->execute(); echo "Nuevo registro insertado correctamente"; } catch(PDOException $e) { echo "Error: " . $e->getMessage(); }
Nuevamente, como en MySQLi, es importante cerrar la conexión una vez que hayamos terminado de trabajar con la base de datos
$conn = null;
Si buscas información al respecto verás que además de la función bindParam existe la función bindValue, no vamos a entrar en este artículo a diferenciarlos. Dejo enlace a la documentación oficial:
Y un video explicativo donde se ve claramente la diferencia en pocos minutos: