🎨 Sysprovider Code
Sysprovider LogoWiki
🇪🇸Hosting español para ecommerce

Cómo conectar una base de datos MySQL con PHP (mysqli y PDO)

Actualizado el 31 de octubre de 2025

Conectar una base de datos MySQL con PHP es una de las tareas más fundamentales para cualquier desarrollador web. Ya sea que estés creando un blog, una tienda en línea o una aplicación personalizada, necesitarás saber cómo comunicar tu código PHP con los datos almacenados en MySQL.

En esta guía completa, te explicaré paso a paso cómo realizar esta conexión usando las dos extensiones más populares: mysqli y PDO. No importa si eres un principiante absoluto o si ya tienes algo de experiencia, aquí encontrarás ejemplos claros, consejos prácticos y advertencias útiles para que tu código sea seguro y eficiente.

Vamos a empezar por lo básico para que entiendas qué es cada cosa, y luego profundizaremos en los ejemplos de código.

¿Qué necesitas antes de empezar?

Antes de escribir una sola línea de código, asegúrate de tener instalado y funcionando lo siguiente:

  • Un servidor web como Apache o Nginx.
  • PHP (versión 7.4 o superior recomendada).
  • MySQL o MariaDB (sistema de gestión de bases de datos).
  • Acceso a la base de datos: nombre de la base, usuario y contraseña.

Si estás usando un panel de control como Syspanel (recuerda que el puerto de acceso es el 2106), normalmente ya tienes todo esto configurado. Solo necesitas crear una base de datos y un usuario desde el panel.

[INFO]
A lo largo del artículo usaré credenciales de ejemplo: localhost como servidor, usuario_prueba como usuario, clave_secreta como contraseña y mi_base_datos como nombre de la base de datos. Reemplázalos con los tuyos.


¿Qué es mysqli y qué es PDO?

Estas son las dos formas principales de conectarte a MySQL desde PHP. Cada una tiene sus ventajas, y es importante que entiendas sus diferencias para elegir la que mejor se adapte a tu proyecto.

mysqli (MySQL Improved)

Es una extensión específica para MySQL. Su nombre proviene de "MySQL Improved" y está diseñada para trabajar únicamente con bases de datos MySQL o MariaDB.

Ventajas:

  • Es muy rápida y ligera.
  • Tiene soporte para consultas preparadas (prepared statements), lo que mejora la seguridad.
  • Es la opción más tradicional y con más documentación disponible.

Desventajas:

  • No es portable: si algún día cambias a otra base de datos (como PostgreSQL), tendrás que reescribir todo el código.

PDO (PHP Data Objects)

Es una capa de abstracción de acceso a bases de datos. Esto significa que funciona con diferentes sistemas de bases de datos, no solo MySQL.

Ventajas:

  • Es extremadamente portable: puedes cambiar de MySQL a PostgreSQL o SQLite cambiando solo una línea de configuración.
  • Soporta consultas preparadas, lo que lo hace muy seguro.
  • Es más moderno y recomendado por la comunidad PHP.

Desventajas:

  • Puede ser ligeramente más lento que mysqli en algunos casos extremos.
  • Requiere un poco más de configuración inicial.

[TIP]
Si estás empezando un proyecto nuevo, te recomiendo usar PDO. Es más flexible y aprenderlo te servirá para el futuro. Si trabajas con un sistema existente que ya usa mysqli, no hay problema en continuar con él.


Conexión con mysqli paso a paso

Ahora vamos a la acción. Te mostraré cómo conectarte a MySQL usando mysqli de forma procedural y orientada a objetos. Ambas son válidas, pero la orientada a objetos es más limpia.

Paso 1: Crear la conexión (mysqli)

El primer paso es crear un objeto de conexión. Aquí tienes el ejemplo más básico:

<?php
$servidor = "localhost";
$usuario = "usuario_prueba";
$clave = "clave_secreta";
$base_datos = "mi_base_datos";

// Crear la conexión
$conexion = new mysqli($servidor, $usuario, $clave, $base_datos);

// Verificar si hay errores
if ($conexion->connect_error) {
    die("Error de conexión: " . $conexion->connect_error);
}

echo "Conexión exitosa";
?>

Explicación:

  • new mysqli(...) crea una nueva conexión.
  • connect_error es una propiedad que contiene el error si la conexión falla.
  • die() detiene la ejecución y muestra el mensaje de error.

[WARNING]
En producción, nunca uses die() para mostrar errores directamente al usuario. Es mejor registrar el error en un archivo de log y mostrar un mensaje genérico.

Paso 2: Hacer una consulta simple (mysqli)

Una vez conectado, puedes ejecutar consultas SQL. Aquí tienes un ejemplo de cómo obtener datos:

<?php
// Suponiendo que ya tienes la conexión en $conexion

$sql = "SELECT id, nombre, email FROM usuarios";
$resultado = $conexion->query($sql);

if ($resultado->num_rows > 0) {
    while ($fila = $resultado->fetch_assoc()) {
        echo "ID: " . $fila["id"] . "<br>";
        echo "Nombre: " . $fila["nombre"] . "<br>";
        echo "Email: " . $fila["email"] . "<br><br>";
    }
} else {
    echo "No hay resultados";
}

// Cerrar la conexión
$conexion->close();
?>

Paso 3: Usar consultas preparadas (mysqli)

Las consultas preparadas son esenciales para evitar la inyección SQL. Aquí tienes un ejemplo:

<?php
// Preparar la consulta con un marcador (?)
$stmt = $conexion->prepare("SELECT nombre FROM usuarios WHERE id = ?");
$stmt->bind_param("i", $id_usuario); // "i" significa entero

$id_usuario = 5;
$stmt->execute();

$stmt->bind_result($nombre);
$stmt->fetch();

echo "El nombre del usuario es: " . $nombre;

$stmt->close();
$conexion->close();
?>

Conexión con PDO paso a paso

Ahora veamos cómo hacer lo mismo pero con PDO. La estructura es similar, pero con algunas diferencias importantes.

Paso 1: Crear la conexión (PDO)

Con PDO, la conexión se crea mediante un DSN (Data Source Name) que especifica el tipo de base de datos y los detalles de conexión.

<?php
$servidor = "localhost";
$usuario = "usuario_prueba";
$clave = "clave_secreta";
$base_datos = "mi_base_datos";

try {
    // Crear la conexión PDO
    $conexion = new PDO(
        "mysql:host=$servidor;dbname=$base_datos;charset=utf8",
        $usuario,
        $clave
    );
    
    // Configurar el modo de errores
    $conexion->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    
    echo "Conexión exitosa";
} catch (PDOException $e) {
    echo "Error de conexión: " . $e->getMessage();
}
?>

Explicación:

  • El DSN incluye el driver (mysql), el host, el nombre de la base y el charset.
  • setAttribute configura el modo de errores para que lance excepciones.
  • try...catch es la forma correcta de manejar errores en PDO.

[TIP]
Siempre usa charset=utf8 en el DSN para evitar problemas con caracteres especiales (como tildes o ñ).

Paso 2: Hacer una consulta simple (PDO)

Con PDO, las consultas se ejecutan de forma ligeramente diferente:

<?php
// Suponiendo que ya tienes la conexión en $conexion

$sql = "SELECT id, nombre, email FROM usuarios";
$stmt = $conexion->query($sql);

while ($fila = $stmt->fetch(PDO::FETCH_ASSOC)) {
    echo "ID: " . $fila["id"] . "<br>";
    echo "Nombre: " . $fila["nombre"] . "<br>";
    echo "Email: " . $fila["email"] . "<br><br>";
}
?>

Paso 3: Usar consultas preparadas (PDO)

Las consultas preparadas en PDO son muy intuitivas:

<?php
// Preparar la consulta
$stmt = $conexion->prepare("SELECT nombre FROM usuarios WHERE id = :id");

// Vincular el parámetro
$stmt->bindParam(":id", $id_usuario, PDO::PARAM_INT);

$id_usuario = 5;
$stmt->execute();

// Obtener el resultado
$nombre = $stmt->fetchColumn();

echo "El nombre del usuario es: " . $nombre;
?>

También puedes pasar los parámetros directamente en execute():

<?php
$stmt = $conexion->prepare("SELECT nombre FROM usuarios WHERE id = :id");
$stmt->execute([":id" => 5]);
$nombre = $stmt->fetchColumn();
echo "El nombre del usuario es: " . $nombre;
?>

Comparativa rápida: mysqli vs PDO

Para que decidas con facilidad, aquí tienes una tabla comparativa:

CaracterísticamysqliPDO
CompatibilidadSolo MySQLMúltiples bases de datos
Consultas preparadas
Manejo de erroresManualExcepciones
SintaxisTradicionalModerna
RendimientoMuy rápidoRápido
Curva de aprendizajeBajaMedia
Recomendado paraProyectos existentesProyectos nuevos

Errores comunes y cómo solucionarlos

Aquí tienes los problemas más frecuentes que encontrarás al conectar php mysql y cómo resolverlos:

1. "Connection refused" o "Access denied"

Causa: Credenciales incorrectas o el servidor MySQL no está accesible.

Solución:

  • Verifica que el usuario y la contraseña sean correctos.
  • Comprueba que el servidor MySQL esté en ejecución.
  • Asegúrate de que el usuario tenga permisos para acceder desde el host (normalmente localhost).

2. "Unknown database"

Causa: El nombre de la base de datos está mal escrito o no existe.

Solución:

  • Revisa el nombre exacto de la base en tu panel de control.
  • Si usas Syspanel, ve al panel en el puerto 2106 y verifica el nombre.

3. "Table doesn't exist"

Causa: La tabla que intentas consultar no existe en la base de datos.

Solución:

  • Verifica que la tabla esté creada.
  • Revisa el nombre exacto (MySQL distingue entre mayúsculas y minúsculas en algunos sistemas).

4. Caracteres raros o signos de interrogación

Causa: No se está usando el charset correcto.

Solución:

  • En PDO, añade charset=utf8 al DSN.
  • En mysqli, ejecuta $conexion->set_charset("utf8") después de conectar.

Buenas prácticas de seguridad

La seguridad es fundamental cuando trabajamos con bases de datos. Aquí tienes mis recomendaciones:

Usa siempre consultas preparadas

Nunca concatenes variables directamente en las consultas SQL. Esto es la puerta de entrada para la inyección SQL.

Mal ejemplo:

$sql = "SELECT * FROM usuarios WHERE id = $id"; // ¡PELIGROSO!

Buen ejemplo:

$stmt = $conexion->prepare("SELECT * FROM usuarios WHERE id = ?");
$stmt->execute([$id]);

No muestres errores internos

En producción, desactiva la visualización de errores y regístralos en un archivo de log.

// En desarrollo
ini_set('display_errors', 1);

// En producción
ini_set('display_errors', 0);
ini_set('log_errors', 1);

Cierra las conexiones

Siempre cierra la conexión cuando ya no la necesites, aunque PHP lo hace automáticamente al final del script.

// mysqli
$conexion->close();

// PDO
$conexion = null;

Ejemplo completo: un formulario de registro

Para que veas todo en acción, aquí tienes un ejemplo completo de un formulario de registro que inserta datos en MySQL usando PDO:

<?php
// config.php
$servidor = "localhost";
$usuario = "usuario_prueba";
$clave = "clave_secreta";
$base_datos = "mi_base_datos";

try {
    $conexion = new PDO(
        "mysql:host=$servidor;dbname=$base_datos;charset=utf8",
        $usuario,
        $clave
    );
    $conexion->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
    die("Error de conexión: " . $e->getMessage());
}

// registro.php
if ($_SERVER["REQUEST_METHOD"] == "POST") {
    $nombre = $_POST["nombre"];
    $email = $_POST["email"];
    $clave = password_hash($_POST["clave"], PASSWORD_DEFAULT);
    
    $sql = "INSERT INTO usuarios (nombre, email, clave) VALUES (:nombre, :email, :clave)";
    $stmt = $conexion->prepare($sql);
    $stmt->execute([
        ":nombre" => $nombre,
        ":email" => $email,
        ":clave" => $clave
    ]);
    
    echo "Registro exitoso";
}
?>

<form method="POST">
    <input type="text" name="nombre" placeholder="Nombre" required>
    <input type="email" name="email" placeholder="Email" required>
    <input type="password" name="clave" placeholder="Contraseña" required>
    <button type="submit">Registrarse</button>
</form>

[WARNING]
Nunca almacenes contraseñas en texto plano. Usa password_hash() para encriptarlas y password_verify() para verificarlas.


Preguntas frecuentes (FAQ)

¿Cuál es la diferencia entre mysqli y PDO?

La principal diferencia es que mysqli es específico para MySQL, mientras que PDO es una capa de abstracción que funciona con múltiples bases de datos. PDO es más flexible y moderno.

¿Es necesario usar consultas preparadas?

Sí, absolutamente. Las consultas preparadas son la mejor forma de protegerte contra la inyección SQL, uno de los ataques más comunes en aplicaciones web.

¿Puedo usar ambos en el mismo proyecto?

Técnicamente sí, pero no es recomendable. Mezclar ambas extensiones puede causar confusión y problemas de mantenimiento. Elige una y mantente consistente.

¿Qué hago si mi hosting usa Syspanel?

Si tu hosting usa Syspanel, recuerda que el puerto de acceso es el 2106. Desde el panel puedes crear bases de datos y usuarios fácilmente. Los datos de conexión (host, usuario, clave) los encontrarás en la sección de bases de datos.

¿Cómo pruebo mi conexión sin escribir código?

Puedes usar herramientas como phpMyAdmin o MySQL Workbench para probar la conexión visualmente. Si puedes conectarte desde estas herramientas, el problema está en tu código PHP.

¿Por qué me da error "mysqli not found"?

Esto significa que la extensión mysqli no está habilitada en tu PHP. En Syspanel, puedes habilitarla desde la configuración de PHP. También puedes verificar con php -m en la terminal.


Conclusión

Conectar una base de datos MySQL con PHP es una habilidad esencial que dominarás con práctica. Tanto mysqli como PDO son excelentes opciones, pero te recomiendo comenzar con PDO por su flexibilidad y seguridad.

Recuerda siempre:

  • Usar consultas preparadas para protegerte de inyecciones SQL.
  • Manejar los errores de forma segura, sin exponer información sensible.
  • Cerrar las conexiones cuando ya no las necesites.
  • Probar tu código en un entorno de desarrollo antes de subirlo a producción.

Con los ejemplos de este artículo, ya tienes todo lo necesario para empezar a trabajar con php mysql de forma segura y eficiente. ¡Practica, experimenta y no tengas miedo de cometer errores! Así es como se aprende.

[TIP]
Si estás usando Syspanel, aprovecha la herramienta de copias de seguridad para respaldar tu base de datos antes de hacer cambios importantes. Es mejor prevenir que lamentar.

¿Tienes más dudas? Déjalas en los comentarios y estaré encantado de ayudarte. ¡Feliz codificación!

¿Necesitas ayuda?Son dos de nuestros técnicos, Agustín y Mikel, y están disponibles para resolver cualquier problema.

Hablar con ellos ahora
Agustín y Mikel