PHP orientado a objetos 9: mysqli

Introducción a la extensión mysqli

hiroshige

archivado en: PHP/AJAX / 21 abril, 2013 / taller:

Seguimos con la serie de PHP orientado a objetos. En esta entrada veremos el objeto mysqli, que es una manera de trabajar con base de datos MySQL.

Antiguamente, con PHP4, la conexión y posterior trabajo con la base de datos se hacía con la función mysql_connect... era algo así:

$connection = mysql_connect("localhost","nombre usuario","contraseña")

or die ("No fue posible efectuar la conexión");

$db = mysql_select_db("base de Datos",$connection)

or die ("No se pudo seleccionar la base de datos");

Este procedimiento está considerado obsoleto a partir de la versión 5.0. En su lugar hay que trabajar la base de datos con dos modelos orientados a objetos: o bien con la extensión mysqli que veremos en esta entrada o bien con el controlador PDO_MYSQL que abordaré en la siguiente de esta serie.

Un objeto para la conexión

Mysqli es una extensión de PHP, una aplicación pá aclararnos, que establece un interfaz orientado a objetos para el trabajo con base de datos. Es como una especie de superclase que, una vez instanciada, te permite emplear una montonera de métodos a cada cual más útil.

Esta clase mysqli se puede instanciar de muchas maneras, pero la que más me gusta es dentro de una clase en un objeto que por costumbre llamo $link_id, pero que puede recibir cualquier nombre, claro.

<?php class conexion {

/**
* Gestiona la conexión con la base de datos
*/

private $dbhost = 'localhost';

private $dbuser = 'nombre usuario';

private $dbpass = 'contraseña';

private $dbname = 'base de datos';

public function conexion () {

/**
* @return object link_id con la conexión
*/

$link_id = new mysqli($this->dbhost,$this->dbuser,$this->dbpass,$this->dbname);

if ($link_id ->connect_error) {

echo "Error de Connexion ($link_id->connect_errno)

$link_id->connect_error\n";

header('Location: error-conexion.php');

exit;

} else {

return $link_id;

}

}

} ?>

Método query

Una vez que hemos declarado un nuevo objeto de la clase mysqli podemos acceder a todos sus métodos, de los que el más habitual es query, que, como puede suponerse, sirve para lanzar las querys.

$resultado = $link_id->query("SELECT * FROM tabla WHERE patatín y patatán");

Otro ejemplo, más complejo, sería esta clase que sirve de selector universal (devuelve un array asociativo que luego se puede recorrer a conveniencia).

<?php

spl_autoload_register(function ($clase) {

require_once($clase.'.php');

}); ?>

<?php class SelectorUniversal {

/**
* Realiza una consulta a la BBDD
* @return array asociativa
*/

protected $array;

protected $tabla;

protected $clausulas;

protected $arrayReturn;

public function __construct($recogeArray, $recogeTabla, $recogeClausulas) {

$this->array = $recogeArray;

$this->tabla = $recogeTabla;

if (isset ($recogeClausulas)) {

$this->clausulas = $recogeClausulas;

} else {

$this->clausulas = "";

}

}

protected function setterConsultaSimple() {

$conexionSacadatos = new conexion();

$linkSacadatos = $conexionSacadatos->conexion();

$resultadoArray = $linkSacadatos->query("SELECT * FROM $this->tabla $this->clausulas");

while ($row=$resultadoArray->fetch_assoc()) {

foreach ($this->array as $clave => $valor) {

$this->arrayReturn[$clave]=$row[$valor];

}

}

$linkSacadatos->close();

return $this->arrayReturn;

}

public function getterConsultaSimple() {

return $this->setterConsultaSimple();

}

} ?>

Así, con esta clase, solo tengo que definir en un array los datos que necesito...

<?php

// Sacamos los datos

$arrayEnvio = array('activo'=>'activo',

'titulo'=> 'titulo',

'autor' => 'autor',

'descripcion_autor' => 'descripcion_autor',

'url' => 'url',

'iframe' => 'iframe',

'titulo_evento'=> 'titulo_evento',

'descripcion_evento'=> 'descripcion_evento',

'localizacion'=> 'localizacion');

$clausulas = "";

$tablas = "programacion_directos";

$mi_selector = new SelectorUniversal($arrayEnvio, $tablas, $clausulas);

$arrayDatosPantalla = $mi_selector->getterConsultaSimple();

?>

Pero bueno, no nos liemos con estos tinglados que me estoy casi arrepintiendo de haberlos contado pq van a ser más lío que otra cosa y quedémonos con estas dos ideas:

  1. Hay que instanciar la clase mysqli en un objeto ($link_id = new mysqli)
  2. Una vez instanciado podemos realizar las consultas mediante el método query pasándolas como argumento.

Otros métodos útiles

No vamos a ver todos los métodos de mysqli, ya que son un montón y para eso está el manual, pero sí me gustaría antes de terminar esta entrada destacar un par de ellos que son muy útiles.

a) num_rows

Este método cuenta el número de resultados de una consulta y se puede utilizar, por ejemplo, para verificar si un usuario está registrado. En caso de que la consulta devuelva 0, es que no está registrado.

$consultaUser = $linkVerificacion->query("SELECT user_nombre, user_contra FROM user WHERE user_nombre = '$this->user_nombre' AND user_contra = '$this->user_contra' LIMIT 1");

$compruebaUser = $consultaUser->num_rows;

if ( $compruebaUser == 0 ) {

header('Location: loguin.php?p="0"');

$linkVerificacion->close();

exit;

} else {

SESSION_START();

$_SESSION['REMOTE_ADDR'] = $_SERVER['REMOTE_ADDR'];

$_SESSION['HTTP_USER_AGENT'] = $_SERVER['HTTP_USER_AGENT'];

$_SESSION['user_nombre_sesion']=$this->user_nombre;

$_SESSION['user_contra_sesion']=$this->user_contra;

$linkVerificacion->close();

header('Location: index.php');

exit;

}

b) real_escape_string

Otro muy útil es real_escape_string, que escapa todas las comillas de una cadena, lo que permite prevenir inyecciones SQL cuando recoges una variable. Por ejemplo, si estuviéramos recogiendo una llamada autor:

if ( isset($_REQUEST['canal_autor']) ) {

$autor = strip_tags($_REQUEST['canal_autor']);

$autor = $link_id->real_escape_string($autor);

$autor = htmlentities($autor);

} else {

header('Location: error-envio.php');

exit;

}

c) insert_id

Otro método muy útil es insert_id, que devuelve el último id de un índice autoincrement cuando añades una fila.

$resultado = $link_id->query("INSERT INTO .... etcétera");

// Id recién ingresado

$id = $link_id->insert_id;

En fin, hay una montonera más de métodos, pero creo que basta con lo expuesto para entender cómo funciona la extensión mysqli... espero. La verdad es que la entrada ha quedado un poco espesa por la ausencia de dinosaurios, pero bueno...

|| Tags: , ,

valoración de los lectores sobre PHP orientado a objetos 9: mysqli

  • estrellica valoración positiva
  • estrellica valoración positiva
  • estrellica valoración positiva
  • estrellica valoración positiva
  • estrellica valoración negativa
  • 4.3 sobre 5 (41 votos)

¿Te ha parecido útil o interesante esta entrada?
dormido, valoración 1 nadapensativo, valoración 2 un poco sonrisa, valoración 3 a medias guiño, valoración 4 bastante aplauso, valoración 5 mucho

Tú opinión es muy importante, gracias por compartirla!

7 respuestas a “PHP orientado a objetos 9: mysqli

  1. Muy interesante el post. Lo único es que para los que estamos aprendiendo puede ser interesante ver un ejemplo simple de uso de la clase conexion, antes de tu explicación del Metodo query.

    Lo implementas perfectamente en el método de la clase SelectorUniversal :

    protected function setterConsultaSimple() {
    $conexionSacadatos = new conexion();
    $linkSacadatos = $conexionSacadatos->conexion();
    ……

    pero a los que nos iniciamos (a mi me paso al leer el post), nos podemos perder.

    Esto es sólo una sugerencia y si eres tan amable tengo una pregunta.
    ¿podrías explicarme el porqué del uso de las lineas?

    spl_autoload_register(function ($clase) {
    require_once($clase.’.php’);

    antes de declarar la clase SelectorUniversal.

    Muchas gracias y seguro que enlazo este artículo en mi blog.

  2. marcos el dijo:

    Hola Erosno, gracias por el comentario.

    Sí, tienes razón, a ver si saco tiempo y explico esto con más detalle.

    spl_autoload sirve para cargar automáticamente las clases que se necesitan en un archivo. Es una especie de “include” automático. Está explicado con cierto detalle aquí:
    PHP orientado a objetos 6: autoload

  3. me encanto tu tutorial si podrías seguir enseñándonos algo de php seria espectacular.

    especialmente con mysqli, gracias por todo.

  4. Pingback: php orientado a objetos | Ersono

  5. Fernando el dijo:

    Hola muchas gracias por este post, seria bueno que lo revivas ya que estoy padeciendo con un código, tengo 3 inserts en donde inserta el primero, pero en el segundo insert necesito el lastId del primer insert y que se ejecutan los 3 inserts a la vez, no hay ejemplos en internet, si los hay en estructurado, pero quiero orientado a objetos y no encuentro…