Ejecutar procedimientos almacenados de mysql con Php

En artículos anteriores hemos visto como crear procedimientos almacenados en mysql y su ejecución desde el lenguaje de programación Delphi. Así que esta vez veremos como ejecutar un procedimiento almacenado desde Php.

Cómo había mencionado previamente, crear procedimientos almacenados nos brinda como ventajas el aprovechamiento de la optimización que hace el motor de base de datos a nuestros scripts, la centralización del código de acceso a datos y un fácil mantenimiento a nuestros sistemas. A estas ventajas le agregaremos una que está íntimamente ligada al ambiente web: La seguridad. Una práctica general en muchos desarrolladores web es la de incrustar sus sentencias SQL en el código de sus scripts, esto aunque de uso extendido es una mala práctica pues permite un ataque por inyección de código SQL. Ese tipo de ataques requieren el uso de funciones adicionales auditen las entradas del usuario para a su vez eliminar cualquier sentencia sql inyectada.

Cuando usamos procedimientos almacenados por defecto incrementamos la seguridad pues al parametrizar nuestra sentencia las posibilidades de inyectar código disminuyen, lo que sumado a medidas de seguridad adicionales harán que tu sistema sea muy difícil de penetrar.

Para este artículo será necesario tener instalado en tu servidor Php V5 y habilitada la extensión Mysqli.  Si deseas conocer más acerca de esta extensión aquí podrás encontrar toda la documentación:  Php Mysqli .

El procedimiento que ejecutaremos será el creado en el artículo:  “crear procedimientos almacenaos en mysql“.

El primer paso será crear nuestro script. Para ello creamos en nuestro servidor web un nuevo directorio que llamaremos pruebas y allí creamos el archivo “ejecutarsps.php”.  Ya creado nuestro script comenzaremos a programar la llamada a nuestro procedimiento almacenado.

Para poder ejecutar procedimientos almacenados de la base de datos deberemos establecer primero la conexión desde php a nuestro servidor Mysql, para ello crearemos una instancia de la clase mysqli:

  $Conexion = new mysqli("localhost", "root", "paswordbd", "pruebas");

Después prepararemos la llamada al procedimiento almacenado que como el manual nos indica, los parámetros del procedimiento deben indicarse con un caracter “?”

$RefCAllSp = $Conexion->prepare("CALL SP_DAMENOMBREUSUARIO(?)");

Ahora vamos a ligar el/los parámetros con el valor que deseamos pasar al procedimiento haciendo uso de de bind_param. Como el manual nos índica, bind_param tiene dos valores de entrada, el primero corresponde al tipo de dato que pasaremos indicado por una letra y el segundo el o los valores que se asignaran.

Para saber qué letra identifica a los diferentes tipos de datos esta tabla nos ayudará:

i tipo entero
d tipo double
s tipo string
b Tipo blob y se envía en paquetes

Conociendo lo anterior, asignamos valores a nuestros parámetros:

$username= "usu1";
$RefCAllSp->bind_param('s',$username);

Y por último viene la llamada al procedimiento almacenado y recuperación de filas que haremos de la siguiente manera:

$RefCAllSp->execute();
  $RefCAllSp->bind_result($Usuario,$Nombre,$Paterno,$Materno);
  while ($RefCAllSp->fetch()) {
    echo "$Usuario,$Nombre,$Paterno,$Materno";
}

Como podemos ver en el código anterior,  hemos hecho uso del método execute para ejecutar  el procedimiento almacenado y de bind_result para relacionar las filas resultantes con las variables que usaremos para dar salida a los datos y por último usamos el método fetch para ir avanzando a través de las filas devueltas con el objetivo de obtener los datos de las mismas.

Al ejecutar nuestro script en el navegador obtendremos lo siguiente:

 

Este es el código completo del script:

<?php
  $Conexion = new mysqli("localhost", "root", "password", "pruebas");
  $RefCAllSp = $Conexion->prepare("CALL SP_DAMENOMBREUSUARIO(?)");
  $username= "usu1";
  $RefCAllSp->bind_param('s',$username);
  $RefCAllSp->execute();
  $RefCAllSp->bind_result($Usuario,$Nombre,$Paterno,$Materno);
  while ($RefCAllSp->fetch()) {
    echo "$Usuario,$Nombre,$Paterno,$Materno";
  }
?>

 

Espero les sea de utilidad.

12 Comments

    • Si observas mi estimado Alex, el procedimiento requiere como parámetro un nombre de usuario que se asigna de en la línea

      $username= “usu1″;
      $RefCAllSp->bind_param(‘s’,$username);

      saludos

  1. que tal amigos tengo un problema para ejecutar varias veces el mismo procedimiento, lo hago de la siguiente forma


    foreach($_POST as $k => $v){
    $nombre = strval($k);
    $exito = 1;
    $campo = "eCodEntidad";
    if(strstr($nombre,$campo)){
    $codigo = ($v ? $v : "NULL");
    if($v){
    $delete="CALL stpEliminarEntidad (".
    $codigo.",".
    $this->eCodUsuario.",".
    $this->tHost.",".
    "'".$this->tCodSeccion."')";

    if($rs=mysqli_query($this->cxsis,$delete)){
    $descripcion = $delete;
    }else{
    $exito = 0;
    }
    }
    }
    }

    al ejecutar la funcion que contiene este codigo, lo hace la primera vez y despues entra al ELSE y el resto de los datos no los inserta, he intentado liberar la variable $rs con mysqli_free_result($rs) y tengo el mismo problema.

    me ayudaria mucho cualquier comentario, de antemano gracias por su tiempo

    • Deberás usar el método bind_param por cada parámetro en tu sp. por ejemplo:

      si tu sp tuviera como parámetros usuario,password,otracadena,unentero la llamada sería de la siguiente manera:

      $RefCAllSp->bind_param(‘s’,$username);
      $RefCAllSp->bind_param(‘s’,$password);
      $RefCAllSp->bind_param(‘s’,$otracadena);
      $RefCAllSp->bind_param(‘i’,$unentero);

      • Disculpa, sin importar la cantidad de parámetros en el procedimiento seguirá colocándose un solo ?, y segundo, ¿qué sucede si se llama con mysqli-query?, digo, ahorita estoy haciendo el login de un usuario por medio de un procedimiento y no tengo fallos, pues sólo se regresa 0 ó 1 fila.

  2. Gracias por el aporte me ayudo mucho, ahora tengo la duda y si el SP
    lleva un parametro de salida OUT cono se lo indicaria y como obtendria el valor que devuelve

    Gracias

  3. Hola

    Por alguna extraña razón no puedo recuperar registros invocando el SP desde el programa PHP, ejecuto el SP desde afuera con los mismos valores en los parámetros y si obtengo registros .. qué podré tener mal ?

    if (isset($_POST[“id_cliente”]) && isset($_POST[“id_sucursal”]) && isset($_POST[“id_torneo”]) && isset($_POST[“id_jornada”])) {
    // Put parameters into local variables
    $cliente = $_POST[“id_cliente”];
    $sucursal = $_POST[“id_sucursal”];
    $torneo = $_POST[“id_torneo”];
    $jornada = $_POST[“id_jornada”];

    // Look up code in database
    $stmt = $this->db->prepare(‘CALL tabla_posiciones(?,?,?,?)’) or die(mysqli_error($this->db));
    $stmt->bind_param(“iiii”, $cliente, $sucursal, $torneo, $jornada);
    $stmt->execute();
    $stmt->bind_result($equ_nombre, $jj, $jg, $je, $jp, $gf, $ge, $dif, $puntos);
    $arreglo = array() ;
    $contador = 0;
    while ($stmt->fetch()) {
    $arreglo[$contador] = array(“equ_nombre”=>$equ_nombre,”jj”=>$jj,”jg”=>$jg,”je”=>$je,”jp”=>$jp,”gf”=>$gf,”ge”=>$ge,”dif”=>$dif,”puntos”=>$puntos);
    $contador++;
    }

Deja un comentario