Daniel Segovia

Blog personal

Archive for the ‘5.3.5 STMT’ 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