PHP y MySQLi

PHP ha decidido marcar como obsoletas todas las funciones nativas de MySQL y nos propone varias opciones para reemplazar nuestros códigos, entre las que destacan PDO (requiere php 5.1) y MySQLi (requiere php 5.0).

La extensión MySQLi permite acceder a la funcionalidad proporcionada por MySQL 4.1 y posterior.
La gran diferencia que existe entre PDO y MySQLi es que la primera permite trabajar con todo tipo de bases de datos de la misma forma, sólo debemos definir cuál vamos a usar en la línea donde creas las conexión y, la segunda solo con MySQL y MariaDB (un fork de MySQL).
¿Cuál es mejor? Si siempre trabajas con bases de datos MySQL, lo lógico es que utilices MySQLi. Si utilizas PDO tu proyecto será mucho más escalable hacia otras bases de datos superiores o distintas sin tener que modificar tu codigo.

// Para conectar con una base de datos debería ejecutar la siguiente sentencia:
$conexion = new mysqli('localhost','usuario','','base_de_datos',3306);

// o definir variables o constantes
$servidor = 'localhost';
$base = 'agenda';
$usuario = 'prueba';
$pass = '1234';
$conexion = new mysqli ($servidor, $usuario, $pass, $base);

// Usar la configuración utf8 para los acentos y ñ
$conexion->set_charset('utf8');

// Para obtener una columna de una tabla de la base de datos:
$resultado = $conexion->query("SELECT * FROM productos WHERE producto_id = 1");
$fila = $resultado->fetch_assoc();

// Obtener varios campos de varios registros:
$resultado = $conexion->query("SELECT * FROM productos");
while( $fila = $resultado->fetch_assoc() ){
  echo $fila['nombre_producto'].'</br>';
}

// Obtener varios campos de varios registros y tratarlos como objetos:
$resultado = $conexion->query("SELECT * FROM productos");
while( $fila = $resultado->fetch_object() ){
  echo $fila->nombre_producto.'</br>';
}

// Insertar un registro:
$conexion->query("INSERT INTO (titulo, ejemplares) VALUES ('PHP',234)");

// Ultimo id insertado
$id_ultimo = conexion->insert_id;

// Para realizar una modificación:
$consulta = "UPDATE libros SET titulo = 'programacion 1', contenido = 'Principios de programación' WHERE libro_id = 456"; 
$conexion->query($consulta);

// Eliminar registro:
$conexion->query("DELETE FROM libros WHERE libro_id = 2");

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

En los ejercicios anteriores utilizamos mysqli orientado objetos, pero tambien la podemos utilizar como funciones y siempre le pasaremos la conexión, es decir, MySQLi (que funciona tanto en modo orientado a objetos como en modo procedural).


// Conexión a la base de datos
$mysqli = mysqli_connect("localhost", "usuario", "password", "basesdedatos");
if (!$mysqli) {
die ("Error al conectar a la base de datos: ".mysqli_connect_error());
}

// Realiza una consulta a una base de datos
$respuesta = mysqli_query($mysqli, "SELECT * FROM usuarios");

// Devuelve el número de filas devueltas por la consulta
echo "Hay ".mysqli_num_rows($respuesta)." usuarios";

// Obtiene todas las filas en un array.
foreach ($usuarios = mysqli_fetch_all($respuesta, MYSQL_ASSOC) as $usuario) {
echo "Nombre del usuario: ".$usuario['nombre']."
";
}
// Obtiene la fila en un array.
$res = mysqli_query($mysqli, "SELECT * FROM usuarios WHERE id = 1");
$usuario = mysqli_fetch_array($res);
echo $usuario['nombre'];

// Para evitar ataques de inyección SQL, todos los datos variables que vayamos a usar para construir la consulta debemos pasarlos antes por esta función.
$consulta = "SELECT * FROM USUARIOS WHERE id = ".mysqli_real_escape_string($mysqli, $_GET['id']);
$resultado = mysqli_query($mysqli, $consulta);

// último id al hacer una operación de tipo INSERT si tenemos un campo AUTO_INCREMENT.
$consulta = "INSERT INTO USUARIOS(nombre, email, password) VALUES ('Pedro','pedro@gmail.com','pedro123')";
$res = mysqli_query($mysqli, $consulta);
echo "El #ID del usuario es ".mysqli_insert_id($mysqli);

// Número de filas afectadas por la última operación.
$consulta = "UPDATE USUARIOS SET email = 'pedro@hotmail.com' WHERE usuario_id = 89";
$respuesta = mysqli_query($mysqli, $consulta);
echo "Se han actualizado ".mysqli_affected_rows($mysqli)." usuarios";

// Cierra una conexión con base datos:
mysqli_close($mysqli);

Como dato adicional las tres librerias (MySQLi, MySQL y PDO_MySQL) operan internamente usando un driver en C. Hasta la versión 5.3 solo se utilizaba el driver oficial de MySQL. Pero desde PHP 5.3, y por problemas de licencia, se desarrolló un driver nativo por la propia comunidad de PHP: mysqlnd. Desde PHP 5.4 es el driver predeterminado de PHP.

Deja un comentario