CakeFest 2024: The Official CakePHP Conference

Interfaz dual: procedimental y orientada a objetos

La extensión mysqli ofrece una interfaz dual. Soporta el paradigma de programación procedimental y el orientado a objetos.

Los usuarios que migren desde la extensión mysql antigua pueden preferir la interfaz procedimental. Esta interfaz es similar a la de la extensión antigua de mysql. En la mayoría de los casos, los nombres de funciones difieren únicamente por el prefijo. Algunas funciones de mysqli toman como primer argumento un gestor de conexión, mientras que las funciones similares de la antigua interfaz de mysql lo toman como el último argumento opcional.

Ejemplo #1 Migración sencilla desde la antigua extensión mysql

<?php
$mysqli
= mysqli_connect("ejemplo.com", "usuario", "contraseña", "basedatos");
$resultado = mysqli_query($mysqli, "SELECT 'Por favor, no use ' AS _msg FROM DUAL");
$fila = mysqli_fetch_assoc($resultado);
echo
$fila['_msg'];

$mysql = mysql_connect("ejemplo.com", "usuario", "contraseña");
mysql_select_db("test");
$resultado = mysql_query("SELECT 'la extensión mysql para nuevos desarrollos.' AS _msg FROM DUAL", $mysql);
$fila = mysql_fetch_assoc($resultado);
echo
$fila['_msg'];
?>

El resultado del ejemplo sería:

Por favor, no use la extensión mysql para nuevos desarrollos.

La interfaz orientada a objetos

Además de la clásica interfaz procedimental, los usuarios pueden optar por usar la interfaz orientada a objetos. La documentación está organizada según la interfaz orientada a objetos. Esta interfaz muestra las funciones agrupadas por su propósito, haciendo más fácil los comienzos. La sección de referencia proporciona ejemplos para ambas variantes de sintaxis.

No existen diferencias significativas de rendimiento entre las dos interfaces. Los usuarios puede basar su elección en sus preferencias personales.

Ejemplo #2 Interfaz orientada a objetos y procedimental

<?php
$mysqli
= mysqli_connect("ejemplo.com", "usuario", "contraseña", "basedatos");
if (
mysqli_connect_errno($mysqli)) {
echo
"Fallo al conectar a MySQL: " . mysqli_connect_error();
}

$resultado = mysqli_query($mysqli, "SELECT 'Un mundo lleno de ' AS _msg FROM DUAL");
$fila = mysqli_fetch_assoc($resultado);
echo
$fila['_msg'];

$mysqli = new mysqli("ejemplo.com", "usuario", "contraseña", "basedatos");
if (
$mysqli->connect_errno) {
echo
"Fallo al conectar a MySQL: " . $mysqli->connect_error;
}

$resultado = $mysqli->query("SELECT 'elecciones para complacer a todos.' AS _msg FROM DUAL");
$fila = $resultado->fetch_assoc();
echo
$fila['_msg'];
?>

El resultado del ejemplo sería:

Un mundo lleno de elecciones para complacer a todos.

Se usa la interfaz orientada a objetos en el inicio rápido porque la sección de referencia está organizada de esta manera.

Mezclar estilos

Es posible cambiar entre los estilos en cualquier momento. No se recomienda mezclar los dos estilos por razones de claridad y estilo de código.

Ejemplo #3 Estilo de codificación malo

<?php
$mysqli
= new mysqli("ejemplo.com", "usuario", "contraseña", "basedatos");
if (
$mysqli->connect_errno) {
echo
"Fallo al conectar a MySQL: " . $mysqli->connect_error;
}

$resultado = mysqli_query($mysqli, "SELECT 'Estilo malo pero posible.' AS _msg FROM DUAL");
if (!
$resultado) {
echo
"Fallo al ejecutar la consulta: (" . $mysqli->errno . ") " . $mysqli->error;
}

if (
$fila = $resultado->fetch_assoc()) {
echo
$fila['_msg'];
}
?>

El resultado del ejemplo sería:

Estilo malo pero posible.

Véase también

add a note

User Contributed Notes 1 note

up
29
Anonymous
9 years ago
Just want to add that both procedural mysqli_connect_errno and mysqli_connect_error DON'T accept any arguments!
http://php.net/manual/de/mysqli.connect-errno.php
http://php.net/manual/de/mysqli.connect-error.php
"int mysqli_connect_errno ( void )"
"string mysqli_connect_error ( void )"
It clearly states "void" there.

Adding the mysqli-Instance as a parameter makes it look like it pulls the error-number out of the provided instance, which is not actually happening. This could end in a hard to detect bug when connecting to multiple SQL servers.
And it is confusing for beginners.
To Top