Foros del Web » Programando para Internet » PHP »

Ejecutar Store Procedure (MySQL)

Estas en el tema de Ejecutar Store Procedure (MySQL) en el foro de PHP en Foros del Web. Hola Tengo un SP almacenado en un hostting, tengo un usuario que puede realizar cualquier tipo de consultas, con este mismo usuario estoy ejecutando un ...
  #1 (permalink)  
Antiguo 05/01/2015, 15:25
 
Fecha de Ingreso: enero-2014
Mensajes: 17
Antigüedad: 10 años, 1 mes
Puntos: 0
Ejecutar Store Procedure (MySQL)

Hola

Tengo un SP almacenado en un hostting, tengo un usuario que puede realizar cualquier tipo de consultas, con este mismo usuario estoy ejecutando un SP pero no logro que me regrese ningún registro, para comprobar que es correcto el valor de los parámetros enviados al SP, ejecuto el SP desde Workbench y aquí si obtengo registros. Revisando el log de errores, no existe ningún registro que me notifique de algún error.. qué puede ser?

Código HTML:
<?php

// Helper method to get a string description for an HTTP status code
// From http://www.gen-x-design.com/archives/create-a-rest-api-with-php/ 
function getStatusCodeMessage($status)
{
    // these could be stored in a .ini file and loaded
    // via parse_ini_file()... however, this will suffice
    // for an example
    $codes = Array(
        100 => 'Continue',
        101 => 'Switching Protocols',
        200 => 'OK',
        201 => 'Created',
        202 => 'Accepted',
        203 => 'Non-Authoritative Information',
        204 => 'No Content',
        205 => 'Reset Content',
        206 => 'Partial Content',
        300 => 'Multiple Choices',
        301 => 'Moved Permanently',
        302 => 'Found',
        303 => 'See Other',
        304 => 'Not Modified',
        305 => 'Use Proxy',
        306 => '(Unused)',
        307 => 'Temporary Redirect',
        400 => 'Bad Request',
        401 => 'Unauthorized',
        402 => 'Payment Required',
        403 => 'Forbidden',
        404 => 'Not Found',
        405 => 'Method Not Allowed',
        406 => 'Not Acceptable',
        407 => 'Proxy Authentication Required',
        408 => 'Request Timeout',
        409 => 'Conflict',
        410 => 'Gone',
        411 => 'Length Required',
        412 => 'Precondition Failed',
        413 => 'Request Entity Too Large',
        414 => 'Request-URI Too Long',
        415 => 'Unsupported Media Type',
        416 => 'Requested Range Not Satisfiable',
        417 => 'Expectation Failed',
        500 => 'Internal Server Error',
        501 => 'Not Implemented',
        502 => 'Bad Gateway',
        503 => 'Service Unavailable',
        504 => 'Gateway Timeout',
        505 => 'HTTP Version Not Supported'
    );

    return (isset($codes[$status])) ? $codes[$status] : '';
}

// Helper method to send a HTTP response code/message
function sendResponse($status = 200, $body = '', $content_type = 'text/html')
{
    $status_header = 'HTTP/1.1 ' . $status . ' ' . getStatusCodeMessage($status);
    header($status_header);
    header('Content-type: ' . $content_type);
    echo $body;
}


class RedeemAPI {
    private $db;
    // Constructor - open DB connection
    function __construct() {
        $this->db = new mysqli('localhost', 'usuario', 'password', 'utchoco_futsoft');
       /* verificar la conexión */
       if (mysqli_connect_errno()) {
       	printf("Conexión fallida: %s\n", mysqli_connect_error());
       	exit();
      }
    	$this->db->autocommit(FALSE);
    	$this->db->query("SET NAMES 'utf8'");
    }
        
    // Destructor - close DB connection
    function __destruct() {
        $this->db->close();
    }
    // Main method to redeem a code
    function redeem() {
    // Check for required parameters
    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++;
        }        
        $stmt->close();
        // Bail if code doesn't exist
        if ($contador <= 0) {
            $cuantos = 0;
            $datos[$cuantos] = array("equ_nombre"=>"S/N");
        	$return_array = array('Datos' => $datos,'status' => 1, 'mensaje' => 'No existen registros con los datos proporcionados');
            sendResponse(200, json_encode($return_array));
            return true;
        }
        $this->armarbol($arreglo);
        return true;
    }
    $return_array = array('status' => 1, 'mensaje' => 'Al parecer no se enviaron los parámetros necesarios');
            sendResponse(200, json_encode($return_array));
            return true;
  }
  
  function armarbol(array $general)
  {
  	$datos = array();  
  	//echo "Ingreso a function ";	
  	$cuantos = 0;  
  	foreach ($general as $reg)
  	{  
  		
  	   $datos[$cuantos] = array("equ_nombre"=>$reg["equ_nombre"],"jj"=>$reg["jj"],"jg"=>$reg["jg"],"je"=>$reg["je"],"jp"=>$reg["jp"],"gf"=>$reg["gf"],"ge"=>$reg["ge"],"dif"=>$reg["dif"],"puntos"=>$reg["puntos"] );  
  	   $cuantos++;  		
  	}   
  	
  	 
    $return_array = array('Datos' => $datos, 'status' => 0, 'mensaje' => '');
  	sendResponse(200, json_encode($return_array));
  } 
}

// This is the first thing that gets called when this page is loaded
// Creates a new instance of the RedeemAPI class and calls the redeem method
$api = new RedeemAPI;
$api->redeem();

?>


  #2 (permalink)  
Antiguo 05/01/2015, 16:06
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Ejecutar Store Procedure (MySQL)

¿El usuario que utilizas en el hosting, tiene permisos de EXECUTE?
Ten en cuenta que GRANT ALL no los otorga, debe ser asignado ex-profeso por el Admin del host, o de lo contrario no podrás ejecutar SP. No importa si en localhost puedes hacerlo, alli siempre tendrás permisos al usar el root, pero en un host no tienes acceso al root.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 05/01/2015, 16:09
 
Fecha de Ingreso: enero-2014
Mensajes: 17
Antigüedad: 10 años, 1 mes
Puntos: 0
Respuesta: Ejecutar Store Procedure (MySQL)

Cita:
Iniciado por gnzsoloyo Ver Mensaje
¿El usuario que utilizas en el hosting, tiene permisos de EXECUTE?
Ten en cuenta que GRANT ALL no los otorga, debe ser asignado ex-profeso por el Admin del host, o de lo contrario no podrás ejecutar SP. No importa si en localhost puedes hacerlo, alli siempre tendrás permisos al usar el root, pero en un host no tienes acceso al root.


OKs... y cómo es asignar esos permisos Ex-profeso?
  #4 (permalink)  
Antiguo 05/01/2015, 16:11
 
Fecha de Ingreso: enero-2014
Mensajes: 17
Antigüedad: 10 años, 1 mes
Puntos: 0
Respuesta: Ejecutar Store Procedure (MySQL)

Cita:
Iniciado por jfloresga Ver Mensaje
OKs... y cómo es asignar esos permisos Ex-profeso?
Ya vi en MySQL Databases y el usuario si tiene palomeado el permiso de EXECUTE
  #5 (permalink)  
Antiguo 05/01/2015, 16:32
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Ejecutar Store Procedure (MySQL)

¿"palomeado"?

Recuerda, por favor, que no todos somos del mismo país, y que los localismos no siempre se entienden...

¿Lo tiene habilitado en qué contexto? ¿En el hosting? ¿Para conexiones en local o remoto?

Trata de ser más específico.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #6 (permalink)  
Antiguo 05/01/2015, 16:40
 
Fecha de Ingreso: enero-2014
Mensajes: 17
Antigüedad: 10 años, 1 mes
Puntos: 0
Respuesta: Ejecutar Store Procedure (MySQL)

Oks, disculpa.


Ingreso al Cpanel de mi hostting, le doy click a la opción Mysql Databases, acontinuación se pueden ver los usuarios que están dados de alta en la base de datos, al dar click al usuario, aparece una nueva ventana con los permisos que tiene dicho usuario, el permiso de EXECUTE el checkBox está seleccionado, indicando que dicho permiso se encuentra otorgado para ese usuario.

Como lo comenté en mensaje original, yo puedo acceder a la conexión remota a través de Workbench, aquí escribo la instrucción call tabla_posiciones(1,1,7,5); inmeidatamente se muestran registros, usando el mismo usuario especificado en el programa PHP.
  #7 (permalink)  
Antiguo 05/01/2015, 19:06
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Ejecutar Store Procedure (MySQL)

Pues si en remoto, desde MySQL Workbench funciona, entonces el problema podría estar en PHP, o en el código del SP.

¿Podrías mostrarnos el código del SP, en especial la definición de los parametros de entrada?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #8 (permalink)  
Antiguo 06/01/2015, 08:24
 
Fecha de Ingreso: enero-2014
Mensajes: 17
Antigüedad: 10 años, 1 mes
Puntos: 0
Respuesta: Ejecutar Store Procedure (MySQL)

Aquí el código del SP .... gracias


Código HTML:
CREATE DEFINER=`root`@`localhost` PROCEDURE `tabla_posiciones`(in par_cliente int, in par_sucursal int, in par_torneo int, in par_jornada int)
begin

  DECLARE vn_equipo INT;
  DECLARE vn_jornada INT;
  DECLARE vn_numjueg INT;
  DECLARE vn_equipo_vs INT;
  DECLARE vn_jj INT DEFAULT 0;
  DECLARE vn_marcador1 INT;
  DECLARE vn_marcador2 INT;
  DECLARE vn_jg INT DEFAULT 0;
  DECLARE vn_je INT DEFAULT 0;
  DECLARE vn_jp INT DEFAULT 0;
  DECLARE vn_gf INT DEFAULT 0;
  DECLARE vn_ge INT DEFAULT 0;
  DECLARE vn_puntos INT DEFAULT 0;
  DECLARE done INT DEFAULT 0;    
  /* Cursor de Tabla Temporal */
  DECLARE barre_temporal CURSOR FOR
         SELECT id_equipo
		 FROM tabla_pos;
  /* Cursor para barrer los partidos */
  DECLARE barre_partidos CURSOR FOR
          SELECT a.id_jornada, a.id_juego
          FROM encuentro as a, calendario as b
	      WHERE a.id_cliente = par_cliente AND a.id_sucursal = par_sucursal AND
                a.id_torneo  = par_torneo AND a.id_jornada <= par_jornada AND a.id_equipo = vn_equipo AND
                b.id_cliente = a.id_cliente AND b.id_sucursal = a.id_sucursal AND
                b.id_torneo = a.id_torneo AND b.id_jornada = a.id_jornada AND b.id_juego = a.id_juego AND
                b.cal_estatus = 1;

  DECLARE CONTINUE HANDLER FOR NOT FOUND SET done=1;

  DROP TEMPORARY TABLE IF EXISTS tabla_pos;
  -- Crea tabla Temporal, con los equipos correspondientes según paramétros
  -- Las columnas siguientes de "puntos", son las necesarias para el tratamiento de la promoción de JUMEX
  CREATE TEMPORARY TABLE tabla_pos AS
       SELECT id_equipo,0 as jj,0 as jg,0 as je,0 as jp,0 as gf,0 as ge,0 as puntos, 0 goles, 0 diferencia, 0 num_juego, 0 adeudo
	   FROM equipo
       WHERE id_cliente = par_cliente AND id_sucursal = par_sucursal AND id_torneo = par_torneo AND equ_estatus = 'A';
  
  SET SQL_SAFE_UPDATES=0;
  OPEN barre_temporal;
  read_loop: LOOP
     /* barre equipos de la temporal */
     FETCH barre_temporal INTO vn_equipo;
     If done THEN
        LEAVE read_loop;
     END IF;
     OPEN barre_partidos;
     read_partidos: LOOP
        /* Barre los partidos del equipo en curso */
        FETCH barre_partidos INTO vn_jornada, vn_numjueg;
        If done THEN
           LEAVE read_partidos;
        End If;
		/* Incrementa el contador de número de juegos */
        SET vn_jj = vn_jj + 1;
        /* Determina el equipo contrario */
		SET vn_equipo_vs = (SELECT id_equipo
							FROM encuentro
							WHERE id_equipo <>  vn_equipo and id_cliente = par_cliente and id_sucursal = par_sucursal and id_torneo = par_torneo and id_jornada = vn_jornada and id_juego = vn_numjueg) ;
        /* Determina Marcadores de ambos equipos */
        SET vn_marcador1 = (SELECT  IfNull(SUM(detalle_encuentro.denc_gol),0)
                            FROM detalle_encuentro
                            WHERE id_cliente = par_cliente AND
								  id_sucursal= par_sucursal AND
								  id_torneo  = par_torneo AND
								  id_jornada = vn_jornada AND
								  id_juego   = vn_numjueg AND
                                  id_equipo  = vn_equipo);
        SET vn_marcador2 = (SELECT  IfNull(SUM(detalle_encuentro.denc_gol),0)
                            FROM detalle_encuentro
                            WHERE id_cliente = par_cliente AND
								  id_sucursal= par_sucursal AND
								  id_torneo  = par_torneo AND
								  id_jornada = vn_jornada AND
								  id_juego   = vn_numjueg AND
                                  id_equipo  = vn_equipo_vs);
        IF vn_marcador1 = vn_marcador2 Then
           SET vn_je = vn_je + 1;
           SET vn_puntos = vn_puntos + 1;
        END IF;
        If vn_marcador1 > vn_marcador2 Then
           SET vn_jg = vn_jg + 1;
		   SET vn_puntos = vn_puntos + 3;
        END IF;
        If vn_marcador2 > vn_marcador1 Then
		   SET vn_jp = vn_jp + 1;
        END IF;
	    SET vn_gf = vn_gf + vn_marcador1;
	    SET vn_ge = vn_ge + vn_marcador2;
		/* Sólo si la jornada es igual a la del párametro de entrada, se graban los marcadores*/
        If vn_jornada = par_jornada Then
		   UPDATE tabla_pos
           SET goles = vn_marcador1, num_juego = vn_numjueg
           WHERE id_equipo = vn_equipo;
		   UPDATE tabla_pos
           SET goles = vn_marcador2, num_juego = vn_numjueg
           WHERE id_equipo = vn_equipo_vs;
        END IF;
     END LOOP;   
     CLOSE barre_partidos;
     UPDATE tabla_pos
     SET jj = vn_jj, jg = vn_jg, je = vn_je, jp = vn_jp, gf = vn_gf, ge = vn_ge, puntos = vn_puntos
     WHERE id_equipo = vn_equipo;
	 SET vn_jj = 0;
     SET vn_je = 0;
	 SET vn_puntos = 0;
     SET vn_jp = 0;
     SET vn_jg = 0;
     SET vn_gf = 0;
     SET vn_ge = 0;
     SET done = 0;
  END LOOP;
  CLOSE barre_temporal;
  SET vn_jornada = premio_jumex(par_cliente,par_sucursal,par_torneo);
  
  SELECT equipo.equ_nombre, tabla_pos.jj, tabla_pos.jg, tabla_pos.je,
         tabla_pos.jp, tabla_pos.gf, tabla_pos.ge, (tabla_pos.gf - tabla_pos.ge) as 'dif', tabla_pos.puntos
  FROM tabla_pos, equipo
  WHERE equipo.id_cliente = par_cliente AND equipo.id_sucursal = par_sucursal AND
        equipo.id_torneo = par_torneo AND equipo.id_equipo = tabla_pos.id_equipo
  ORDER BY 9 DESC,8 DESC;
  
END

Etiquetas: html, mysql, procedure, registro, sql, store, tabla, variable
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 15:19.