Daniel Segovia

Blog personal

Archive for the ‘5.3 PHP y MySQLi’ Category

Seguridad con stmt

Hacer un comentario

La seguridad en las consultas enviadas a la base de datos la daremos con el método bind_param.
Éste método agrega variables a una sentencia preparada como parámetros.
bind_param buscará en la sentencia preparada todos los signos de pregunta ? y los reemplazará por las variables que le asignemos.
Es obligatorio indicar de que tipo es el valor que estamos inyectando, la sintaxis es la siguiente

SELECT * from paises WHERE nombre = ?
bind_param('s', 'Argentina');
SELECT * from paises WHERE nombre = 'Argentina'

Como puede observarse en la primera línea tenemos “nombre = ?”, no escapamos los caracteres ni tampoco agregamos las comillas que encierran la cadena de texto.
El primer parámetro ‘s’ indica que la variable que vamos a reemplazar es de tipo string, aquí la tabla con los tipos permitidos

  • i variable de tipo entero
  • d variable de tipo doble
  • s variable de tipo texto
  • b variable de tipo blob y se envía en paquetes

Un ejemplo concreto

<?php
$mysqli = new mysqli("localhost", "usuario", "password", "base");
 
if (mysqli_connect_errno()) {
    printf("Imposible conectarse: %s\n", mysqli_connect_error());
    exit();
}
 
$cliente = 'coto'; 
 
$query = "SELECT client, partner FROM business WHERE client=?";
 
/* Ejecuto el método prepare y este me va a devolver el objeto */
if ($stmt = $mysqli->prepare($query)) {
 
    $stmt->bind_param('s', $cliente);
 
    /* ejecuto el  query */
    $stmt->execute();
 
    $stmt->bind_result($client, $partner);
 
    $stmt->fetch();
 
    /* cierro stmt */
    $stmt->close();
}
 
echo $client . "<br />";
echo $partner . "<br />";
 
$mysqli->close();
?>

Muchas veces necesitamos inyectar más de una variable en una misma consulta preparada, de esta manera podemos ingresar ilimitadas variables

<?php
$mysqli = new mysqli("localhost", "usuario", "password", "base");
 
if (mysqli_connect_errno()) {
    printf("Imposible conectarse: %s\n", mysqli_connect_error());
    exit();
}
 
$cliente = 'coto'; 
$product_id = 1;
 
$query = "SELECT client, partner FROM business WHERE client=? AND product_id=?";
 
/* Ejecuto el método prepare y este me va a devolver el objeto */
if ($stmt = $mysqli->prepare($query)) {
    /* El primero parámetro es tipo string y el segundo es entero */
    $stmt->bind_param('si', $cliente, $product_id);
 
    /* ejecuto el  query */
    $stmt->execute();
 
    $stmt->bind_result($client, $partner);
 
    $stmt->fetch();
 
    /* cierro stmt */
    $stmt->close();
}
 
echo $client . "<br />";
echo $partner . "<br />";
 
$mysqli->close();
?>

Written by Daniel Segovia

septiembre 29th, 2011 at 12:25 pm

Recuperar datos con stmt

Hacer un comentario

Para recuperar datos con stmt es sencillo y seguro, nos proporciona los métodos bind_result y fetch para realizar esta acción.
Con bind_result le indicaremos los nombres de variable con el que queremos que nos los datos de cada columna y con fetch asignaremos a éstas variables los datos extraídos de la base de datos.

<?php
$mysqli = new mysqli("localhost", "usuario", "passwords", "negocios");
 
if (mysqli_connect_errno()) {
    printf("Imposible conectarse: %s\n", mysqli_connect_error());
    exit();
}
 
$query = "SELECT client, partner FROM business LIMIT 1";
 
/* Ejecuto el método prepare y este me va a devolver el objeto */
if ($stmt = $mysqli->prepare($query)) {
 
    /* ejecuto el  query */
    $stmt->execute();
 
    /* Por cada columna necesito un nombre de variable */
    $stmt->bind_result($client, $partner);
 
    /* Con fetch le asigno a $client y $partner los valores de la DB respectivamente */
    $stmt->fetch();
 
    /* cierro stmt */
    $stmt->close();
}
 
echo $client . "<br />";
echo $partner . "<br />";
 
$mysqli->close();
?>

Para recuperar muchos registros de la db ciclaremos el método fetch, para que por cada vuelta nos asigne los valores en las variables definidas en bind_fetch

<?php
$mysqli = new mysqli("localhost", "usuario", "passwords", "negocios");
 
if (mysqli_connect_errno()) {
    printf("Imposible conectarse: %s\n", mysqli_connect_error());
    exit();
}
 
$query = "SELECT client, partner FROM business LIMIT 10";
 
/* Ejecuto el método prepare y este me va a devolver el objeto */
if ($stmt = $mysqli->prepare($query)) {
 
    /* ejecuto el  query */
    $stmt->execute();
 
    /* Por cada columna necesito un nombre de variable */
    $stmt->bind_result($client, $partner);
 
    /* Con fetch le asigno a $client y $partner los valores de la DB respectivamente */
    while($stmt->fetch()){
        echo $client . "<br />";
        echo $partner . "<br />";
    }
 
    /* cierro stmt */
    $stmt->close();
}
 
$mysqli->close();
?>

Written by Daniel Segovia

septiembre 28th, 2011 at 4:03 pm

Posted in 5.3.5 STMT

Tagged with , , , ,

Ejecutar un query con stmt

Hacer un comentario

Para ejecutar un query con stmt previamente tenemos que prepararlo con el método prepare, sí la sintaxis del query es correcta podremos ejecutarlo

<?php
$mysqli = new mysqli("localhost", "usuario", "password", "base");
 
if (mysqli_connect_errno()) {
    printf("Imposible conectarse: %s\n", mysqli_connect_error());
    exit();
}
 
$query = "SELECT client, partner FROM business LIMIT 1";
 
/* Ejecuto el método prepare y este me va a devolver el objeto */
if ($stmt = $mysqli->prepare($query)) {
 
    /* ejecuto el  query */
    $stmt->execute();
 
    /* cierro stmt */
    $stmt->close();
}
 
$mysqli->close();
?>

Written by Daniel Segovia

septiembre 28th, 2011 at 2:06 pm

STMT

Hacer un comentario

STMT representa una consulta preparada, aquí la definición de la clase.

MySQLi_STMT {
    /* Propiedades */
    int $MySQLi_STMT->affected_rows;
    int $errno;
    string $error;
    int $field_count;
    int $insert_id;
    int $num_rows;
    int $param_count;
    string $sqlstate;
 
    /* Métodos */
    int mysqli_stmt_affected_rows ( mysqli_stmt $stmt )
    int mysqli_stmt::attr_get ( int $attr )
    bool mysqli_stmt::attr_set ( int $attr , int $mode )
    bool mysqli_stmt::bind_param ( string $types , mixed &$var1 [, mixed &$... ] )
    bool mysqli_stmt::bind_result ( mixed &$var1 [, mixed &$... ] )
    bool mysqli_stmt::close ( void )
    void mysqli_stmt::data_seek ( int $offset )
    int mysqli_stmt_errno ( mysqli_stmt $stmt )
    string mysqli_stmt_error ( mysqli_stmt $stmt )
    bool mysqli_stmt::execute ( void )
    bool mysqli_stmt::fetch ( void )
    int mysqli_stmt_field_count ( mysqli_stmt $stmt )
    void mysqli_stmt::free_result ( void )
    mysqli_result mysqli_stmt::get_result ( void )
    object mysqli_stmt::get_warnings ( mysqli_stmt $stmt )
    mixed mysqli_stmt_insert_id ( mysqli_stmt $stmt )
    int mysqli_stmt_num_rows ( mysqli_stmt $stmt )
    int mysqli_stmt_param_count ( mysqli_stmt $stmt )
    mixed mysqli_stmt::prepare ( string $query )
    bool mysqli_stmt::reset ( void )
    mysqli_result mysqli_stmt::result_metadata ( void )
    bool mysqli_stmt::send_long_data ( int $param_nr , string $data )
    string mysqli_stmt_sqlstate ( mysqli_stmt $stmt )
    bool mysqli_stmt::store_result ( void )
}

Y aquí una breve descripción de los métodos

  • mysqli_stmt::affected_rows — Devuelve el número total de filas en la última sentencia ejecutada
  • mysqli_stmt::attr_get — Se utiliza para obtener el valor actual de un atributo de la sentencia
  • mysqli_stmt::attr_set — Se utiliza para modificar el comportamiento de una sentencia preparada
  • mysqli_stmt::bind_param — Agrega variables a una sentencia preparada como parámetros
  • mysqli_stmt::bind_result — Enlaza variables a una sentencia preparada para el almacenamiento de resultados
  • mysqli_stmt::close — Cierra una sentencia preparada
  • mysqli_stmt::data_seek — Posiciona el puntero en una fila arbitraria
  • mysqli_stmt::errno — Devuelve el código de error de la última sentencia ejecutada
  • mysqli_stmt::error — Retorno un texto con la descripción de la última sentencia ejecutada erronea
  • mysqli_stmt::execute — Ejecuta el Query preparado
  • mysqli_stmt::fetch — Obtiene los resultados de una sentencia preparada en las variables
  • mysqli_stmt::field_count — Devuelve el número de campo en la instrucción dada
  • mysqli_stmt::free_result — Libera la memoria almacenada en una sentencia ejecutada
  • mysqli_stmt::get_result — Obtiene un conjunto de resultados a partir de una sentencia preparada
  • mysqli_stmt::get_warnings — Obtiene los resultados de SHOW WARNINGS
  • mysqli_stmt::insert_id — Obtiene el ID generado en el último INSERT realizado
  • mysqli_stmt::num_rows — Obtiene el número de filas de la sentencia ejecutada
  • mysqli_stmt::param_count — Retorno el número de parametros
  • mysqli_stmt::prepare — Prepara un SQL para su ejección
  • mysqli_stmt::reset — Resetea un SQL preparado
  • mysqli_stmt::result_metadata — Devuelve un conjunto de metadatos de resultados de una sentencia preparada
  • mysqli_stmt::send_long_data — Envía los datos en bloques
  • mysqli_stmt::sqlstate — Devuelve el error SQLSTATE de la operación anterior
  • mysqli_stmt::store_result — Transfiere un conjunto de resultados de una sentencia preparada

Veremos en profundidad algunos de éstos métodos

Written by Daniel Segovia

septiembre 20th, 2011 at 1:01 pm

Posted in 5.3.5 STMT

Recuperar el contenido como objeto

Hacer un comentario

Para recuperar el contenido en forma de objeto usaremos el método fetch_object
El método nos devolverá un objeto con los resultados y cada propiedad tendrá el nombre del campo en la tabla.
Sí el método devuelve NULL es por que no hay más resultados.

En este ejemplo haremos una consulta con la condición que nos traiga una sola fila (LIMIT 1)

<?php
$mysqli = new mysqli("localhost", "user", "pass", "negocios");
 
if (mysqli_connect_errno()) {
    printf("Imposible conectarse: %s\n", mysqli_connect_error());
    exit();
}
 
$query = "SELECT client, partner FROM business LIMIT 1";
$result = $mysqli->query($query);
 
/* Objeto */
$row = $result->fetch_object();
echo "Client: " . $row->client . "<br />Partner: " . $row->partner . "<hr />";
$mysqli->close();
?>

Sí la consulta nos trae más de un resultado podemos ciclarla con while, como en los ejemplos anteriores, hasta que se acaben los resultados, el ciclo terminará cuando el método nos devuelva NULL

<?php
$mysqli = new mysqli("localhost", "user", "pass", "negocios");
 
if (mysqli_connect_errno()) {
    printf("Imposible conectarse: %s\n", mysqli_connect_error());
    exit();
}
 
$query = "SELECT client, partner FROM business";
$result = $mysqli->query($query);
 
/* objeto */
while($row = $result->fetch_object()){
    echo "Client: " . $row->client . "<br />Partner: " . $row->partner . "<hr />";
}
$mysqli->close();
?>

Written by Daniel Segovia

septiembre 20th, 2011 at 11:46 am

Recuperar el contenido como array con índices de texto

2 comentarios

Para recuperar el contenido en forma de array con índices de texto usaremos el método fetch_assoc
El método nos devolverá una fila de resultados y los índices del array tendrán el nombre del campo en la tabla o NULL en caso que no haya resultados.

En este ejemplo haremos una consulta con la condición que nos traiga una sola fila (LIMIT 1)

<?php
$mysqli = new mysqli("localhost", "user", "pass", "database");
 
if (mysqli_connect_errno()) {
    printf("Imposible conectarse: %s\n", mysqli_connect_error());
    exit();
}
 
$query = "SELECT client, partner FROM business LIMIT 1";
$result = $mysqli->query($query);
 
/* array numérico */
$row = $result->fetch_assoc();
echo "Client: " . $row['client'] . "<br />Partner: " . $row['partner'];
$mysqli->close();
?>

Si la consulta nos trae más de un resultado podemos ciclarla con while hasta que se acaben los resultados, el ciclo terminará cuando el método nos devuelva NULL

<?php
$mysqli = new mysqli("localhost", "user", "pass", "database");
 
if (mysqli_connect_errno()) {
    printf("Imposible conectarse: %s\n", mysqli_connect_error());
    exit();
}
 
$query = "SELECT client, partner FROM business";
$result = $mysqli->query($query);
 
/* array numérico en cada vuelta del ciclo*/
while($row = $result->fetch_assoc()){
    echo "Client: " . $row['client'] . "<br />Partner: " . $row['partner'] . "<hr />";
}
$mysqli->close();
?>

Written by Daniel Segovia

septiembre 5th, 2011 at 2:10 pm

Recuperar el contenido como array con índices numéricos

Hacer un comentario

Para recuperar el contenido en forma de array con índices numéricos usaremos el método fetch_array
El método nos devolverá una fila de resultados o NULL en caso que no haya resultados.

En este ejemplo haremos una consulta con la condición que nos traiga una sola fila (LIMIT 1)

<?php
$mysqli = new mysqli("localhost", "user", "pass", "database");
 
if (mysqli_connect_errno()) {
    printf("Imposible conectarse: %s\n", mysqli_connect_error());
    exit();
}
 
$query = "SELECT client, partner FROM business LIMIT 1";
$result = $mysqli->query($query);
 
/* array numérico */
$row = $result->fetch_array();
echo "Client: " . $row[0] . "<br />Partner: " . $row[1];
$mysqli->close();
?>

Si la consulta nos trae más de un resultado podemos ciclarla hasta que se acaben los resultados, el ciclo terminará cuando el método nos devuelva NULL

<?php
$mysqli = new mysqli("localhost", "user", "pass", "database");
 
if (mysqli_connect_errno()) {
    printf("Imposible conectarse: %s\n", mysqli_connect_error());
    exit();
}
 
$query = "SELECT client, partner FROM business";
$result = $mysqli->query($query);
 
/* array numérico en cada vuelta del ciclo*/
while($row = $result->fetch_array()){
    echo "Client: " . $row[0] . "<br />Partner: " . $row[1] . "<hr />";
}
$mysqli->close();
?>

Written by Daniel Segovia

agosto 24th, 2011 at 1:27 pm

Recuperar el contenido con Mysqli

Hacer un comentario

Extraeremos la información de la base de datos en 4 pasos

  • Nos conectamos (mysqli)
  • Preparamos la sentencia SQL (prepare)
  • La ejecutamos (execute)
  • Definimos variables para asignar los resultados (bind_result(
  • Recorremos las filas (fetch)
<?php
$mysqli = new mysqli("localhost", "root", "", "teste");
 
if (mysqli_connect_errno()) {
    echo "No se pudo conectar: " . mysqli_connect_error();
    exit();
}
 
$sql = "SELECT nombre, apellido FROM personas";
 
if ($stmt = $mysqli->prepare($sql)) {
    $stmt->execute();
 
    $stmt->bind_result($nombre, $apellido);
 
     while ($stmt->fetch()) {
        echo "$nombre $apellido<br />";
    }
 
    $stmt->close();
}
 
$mysqli->close();
?>

Written by Daniel Segovia

agosto 1st, 2011 at 5:40 pm

Enviar una consulta con mysqli

Hacer un comentario

Para enviar una consulta tenemos el método query, el mismo lo tendremos disponible luego de instanciar la clase

<?php 
$mysqli = new mysqli('localhost', 'usuario', 'contrasena', 'test');
 
/* Testeamos que se haya conectado correctamente */
if (mysqli_connect_errno()) {
    echo "Error en la conexión: " . mysqli_connect_error();
    die();
}
 
$sql = "SELECT * FROM usuarios";
if(!$result = $mysqli->query($sql)){
    die("Query invalido: " . $sql);
}
 
echo "Todo correcto";
$mysqli->close();
?>

Written by Daniel Segovia

julio 19th, 2011 at 12:07 pm

Seleccionar base de datos con mysqli

Hacer un comentario

La clase mysqli nos proporciona el método select_db, luego de abrir la conexión usaremos este método para seleccionar la base con la que trabajaremos posteriormente.

Usaremos la manera abreviada para conectarnos, osea desde el constructor.

<?php 
$mysqli = new mysqli('localhost', 'root', '');
 
/* Testeamos que se haya conectado correctamente */
if (mysqli_connect_errno()) {
    echo "Error en la conexión: " . mysqli_connect_error();
    die();
}
 
if(!$mysqli->select_db("test")){
    echo "Imposible seleccionar la base de datos: " . mysqli_connect_error();
    die();
}
$mysqli->close();
?>

Por otro lado, otra forma de seleccionar la base de datos es desde el constructor con el cuarto parámetro. Esta es la manera más común de generar la conexión y seleccionar la base de datos, de aquí en adelante usaremos esta manera para realizar las conexiones.

<?php 
$mysqli = new mysqli('localhost', 'usuario', 'contrasena', 'test');
 
/* Testeamos que se haya conectado correctamente */
if (mysqli_connect_errno()) {
    echo "Error en la conexión: " . mysqli_connect_error();
    die();
}
echo "Conectado ...";
$mysqli->close();
?>

Written by Daniel Segovia

julio 12th, 2011 at 12:34 pm

Conexión con mysqli

Hacer un comentario

Para abrir una conexión poseemos el método real_connect dentro de la clase mysqli
Primero instanciamos la clase para obtener el objeto que nos proporcionará el método para conectarnos.

<?php
$db = new mysqli;
if (!$db->real_connect('localhost', 'usuario', 'contrasena')) {
    echo "Error en la conexión: " . mysqli_connect_error();
    die();
}
echo "Conectado";
$mysqli->close();
?>

Por otro lado, mysqli, no proporciona la posibilidad de conectarnos al servidor MySQL desde el constructor de la clase, los 3 primeros parametros son host, usuario y contraseña.

<?php 
$mysqli = new mysqli('localhost', 'usuario', 'contrasena');
 
/* Testeamos que se haya conectado correctamente */
if (mysqli_connect_errno()) {
    echo "Error en la conexión: " . mysqli_connect_error();
    die();
}
echo "Conectado";
$mysqli->close();
?>

Written by Daniel Segovia

julio 11th, 2011 at 1:49 pm

Posted in 5.3.1 Conexión

PHP y MySQLi

Hacer un comentario

La extensión mysqli permite acceder a la funcionalidad proporcionada por MySQL 4.1 y superior, para contar con esta funcionalidad debe compilar PHP con soporte para mysqli.
Ésta extensión viene incluida en PHP 5 y versiones posteriores.

Ventajas de mysqli sobre la extensión mysql

  • Interfaz orientada a objetos
  • Soporte para Declaraciones Preparadas
  • Soporte para Múltiples Declaraciones
  • Soporte para Transacciones
  • Mejoradas las opciones de depuración
  • Soporte para servidor empotrado

El manual de PHP recomienda encarecidamente usar esta extensión si están trabajando con MySQL versión 4.1.3 o superior.
La extensión mysqli está desarrollada mediante el framework de extensiones de PHP. Su código fuente se ubica en el directorio ext/mysqli.

Written by Daniel Segovia

julio 8th, 2011 at 1:36 pm

Posted in 5.3 PHP y MySQLi

Tagged with , ,