real_connect
En este artículo, analizamos la función mysqli_real_connect() en PHP, utilizada para establecer una conexión con una base de datos MySQL.
En este artículo, analizaremos el método real_connect() en PHP, que se utiliza para establecer una conexión con una base de datos MySQL. (El equivalente procedimental es mysqli_real_connect().)
Esta página explica en qué se diferencia real_connect() de un simple mysqli_connect(), la lista completa de parámetros, cómo habilitar SSL y otros indicadores de conexión, y los errores más comunes.
¿Qué es real_connect() y para qué sirve?
El método real_connect() abre una conexión a un servidor MySQL, igual que mysqli_connect(). La diferencia clave es que real_connect() opera sobre un manejador de conexión que ya ha sido creado con mysqli_init(), en lugar de crear y conectar en un solo paso.
Ese paso adicional es importante porque le otorga una ventana entre la creación del manejador y la conexión, donde puede configurar opciones que solo pueden establecerse antes de que se abra la conexión. Use real_connect() (en lugar de mysqli_connect()) cuando necesite:
- Establecer opciones de conexión con
mysqli_options()— por ejemplo, un tiempo de espera de conexión (MYSQLI_OPT_CONNECT_TIMEOUT) o soporte para archivos locales. - Habilitar una conexión SSL/TLS con
ssl_set()y el indicadorMYSQLI_CLIENT_SSL. - Pasar indicadores de cliente como
MYSQLI_CLIENT_COMPRESSoMYSQLI_CLIENT_FOUND_ROWS. - Abrir una conexión persistente añadiendo el prefijo
p:al host.
Si no necesita ninguna de estas opciones, el más sencillo mysqli_connect() es perfectamente válido.
Uso básico
real_connect() siempre sigue un patrón de dos pasos: crear el manejador y luego conectar. Aquí está el enfoque orientado a objetos:
<?php
$mysqli = mysqli_init();
if (!$mysqli) {
die('mysqli_init failed');
}
if (!$mysqli->real_connect('localhost', 'username', 'password', 'database')) {
die('Connect Error (' . $mysqli->connect_errno . ') ' . $mysqli->connect_error);
}
echo 'Success... ' . $mysqli->host_info . "\n";
$mysqli->close();
?>Primero creamos un manejador MySQLi con mysqli_init() y verificamos que tuvo éxito. Luego llamamos a real_connect() sobre el objeto $mysqli para conectar. Si falla, reportamos el error con connect_errno y connect_error y detenemos la ejecución; si tiene éxito, imprimimos la información del host y finalmente liberamos la conexión con close().
Parámetros
real_connect() acepta los siguientes parámetros, todos opcionales, en este orden:
| Parámetro | Descripción | Valor predeterminado |
|---|---|---|
host | Nombre de host o IP. Añada el prefijo p: para una conexión persistente. | localhost (o valor predeterminado de ini) |
username | Nombre de usuario de MySQL. | usuario actual |
password | Contraseña del usuario. | "" |
database | Base de datos predeterminada a seleccionar al conectar. | "" |
port | Número de puerto TCP. | 3306 |
socket | Socket Unix o tubería con nombre de Windows. | del ini |
flags | Máscara de bits de indicadores de cliente (ver más abajo). | 0 |
Nota: con la API OO el manejador es el objeto, por lo que el primer argumento es el
host. Con el proceduralmysqli_real_connect($link, $host, ...), el enlace se pasa primero.
Establecer opciones antes de conectar
Esta es la razón principal por la que existe real_connect(). Configure el manejador con mysqli_options() entre init y real_connect:
<?php
$mysqli = mysqli_init();
// These can only be set before connecting:
$mysqli->options(MYSQLI_OPT_CONNECT_TIMEOUT, 5);
$mysqli->options(MYSQLI_INIT_COMMAND, "SET autocommit = 0");
if (!$mysqli->real_connect('localhost', 'username', 'password', 'database')) {
die('Connect Error (' . $mysqli->connect_errno . ') ' . $mysqli->connect_error);
}
echo 'Connected with a 5-second timeout.';
$mysqli->close();
?>Conectar con SSL e indicadores de cliente
El séptimo parámetro es una máscara de bits de indicadores de cliente. Para requerir una conexión cifrada, configure los certificados con ssl_set() y pase MYSQLI_CLIENT_SSL:
<?php
$mysqli = mysqli_init();
$mysqli->ssl_set(null, null, '/path/to/ca-cert.pem', null, null);
$mysqli->real_connect(
'db.example.com', 'username', 'password', 'database',
3306, null,
MYSQLI_CLIENT_SSL
);
echo 'Encrypted connection established.';
$mysqli->close();
?>Indicadores comunes que puede combinar con |:
MYSQLI_CLIENT_SSL— usar cifrado SSL/TLS.MYSQLI_CLIENT_COMPRESS— usar el protocolo comprimido.MYSQLI_CLIENT_FOUND_ROWS— devolver filas coincidentes en lugar de filas modificadas.
Conexiones persistentes
Añadir el prefijo p: al host reutiliza una conexión existente del pool entre solicitudes en lugar de abrir una nueva cada vez, lo que puede reducir la sobrecarga de conexión en servidores con mucho tráfico:
<?php
$mysqli = mysqli_init();
$mysqli->real_connect('p:localhost', 'username', 'password', 'database');
?>Errores comunes
- Olvidar
mysqli_init().real_connect()debe llamarse sobre un manejador devuelto pormysqli_init(). Llamarlo sobre un objetonew mysqli()recién construido que ya está conectado fallará. - Verificar la propiedad de error incorrecta. Antes de que exista una conexión, use
connect_errno/connect_error, noerrno/error. - Establecer opciones demasiado tarde. Opciones como el tiempo de espera de conexión no tienen efecto una vez que la conexión está abierta — deben establecerse antes de
real_connect().
Conclusión
El método real_connect() establece una conexión MySQL desde un manejador creado con mysqli_init(), brindándole la oportunidad de configurar tiempos de espera, SSL e indicadores de cliente que un mysqli_connect() directo no permite. Una vez conectado, puede ejecutar sentencias con query() y seleccionar una base de datos con select_db().