elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Recopilación Tutoriales y Manuales Hacking, Seguridad, Privacidad, Hardware, etc


+  Foro de elhacker.net
|-+  Programación
| |-+  Desarrollo Web
| | |-+  PHP (Moderador: #!drvy)
| | | |-+  [Resuelto] Recoger datos de procedimiento almacenado en PHP con SQLSRV
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: [Resuelto] Recoger datos de procedimiento almacenado en PHP con SQLSRV  (Leído 9,491 veces)
pavel.escobar

Desconectado Desconectado

Mensajes: 6


Ver Perfil
[Resuelto] Recoger datos de procedimiento almacenado en PHP con SQLSRV
« en: 7 Marzo 2018, 01:42 am »

Hola estoy realizando una pagina en PHP, en la cual tengo una conexion a una base SQL y uso el sqlsrv, todo va bien cuando uso sentencias simples, pero cuando intento recibir datos de un SELECT que se encuentra en un procedimiento almacenado no me genera ningun dato.

El codigo de mi proceso almacenado es el siguiente:

==================================================

Código
  1. ALTER PROCEDURE [dbo].[comparar_ventas_meses]
  2. @f_inicio AS DATE,
  3. @f_fin AS DATE,
  4. @gestora AS nvarchar(100)
  5.  
  6. AS
  7. BEGIN
  8.  
  9. SELECT MONTH(SalesDate) AS mes, SUM(paytotal) AS VENTA_ACT, 0 AS VENTA_ANT
  10. INTO #tmpResumen
  11. FROM _RetailData..RECEIPT
  12. INNER JOIN _RetailData..STORE ON RECEIPT.StoreNo = store.StoreNo
  13. WHERE CAST(SalesDate AS DATE) BETWEEN @f_inicio AND @f_fin
  14. AND RECEIPT.StatusCode = 'A'
  15. AND RECEIPT.SalesCode IN ('S', 'R')
  16. AND STORE.ActiveStatus=1
  17. AND STORE.StoreNo IN (SELECT idtienda FROM Administrator..tbgestoras_tienda WHERE idgestora =@gestora)
  18. GROUP BY MONTH(SalesDate)
  19.  
  20. UNION ALL
  21.  
  22. SELECT MONTH(SalesDate) AS mes, 0 AS VENTA_ACT, SUM(paytotal) AS VENTA_ANT FROM _RetailData..RECEIPT
  23. INNER JOIN _RetailData..STORE ON RECEIPT.StoreNo = store.StoreNo
  24. WHERE CAST(SalesDate AS DATE) BETWEEN  DATEADD(DD, -365, @f_inicio) AND DATEADD(DD, -365, @f_fin)
  25. AND RECEIPT.StatusCode = 'A'
  26. AND RECEIPT.SalesCode IN ('S', 'R')
  27. AND STORE.ActiveStatus=1
  28. AND STORE.StoreNo IN (SELECT idtienda FROM Administrator..tbgestoras_tienda WHERE idgestora =@gestora)
  29. GROUP BY MONTH(SalesDate)
  30.  
  31. SELECT mes, CAST(SUM(venta_act) AS DECIMAL(18,2)) AS actual, CAST(SUM(venta_ant) AS DECIMAL(18,2)) AS anterior, CAST((SUM(venta_act)/SUM(venta_ant) -1) * 100 AS DECIMAL(18,2) AS crecimiento FROM #tmpResumen
  32. GROUP BY mes
  33. HAVING NOT (SUM(venta_act) = 0
  34. AND SUM(venta_ant) = 0)
  35.  
  36. END

=================================================

y mi codigo php es el siguiente:

Código
  1.     $f_inicial ='01/01/'.(date("Y"));
  2.        $f_final = date("d/m/Y");
  3.        $gestora='pescobar';
  4.        $mes=0;
  5.        $actual=0;
  6.        $anterior=0;
  7.        $crecimiento=0;
  8.  
  9. include ("seguro.php");
  10.        global $HOSTNAME, $USERNAME, $PASSWORD, $DATABASE;
  11.            $info = array('Database'=>'Adicional', 'UID'=>$USERNAME, 'PWD'=>$PASSWORD);
  12.            $conexion = sqlsrv_connect($HOSTNAME, $info);
  13.  
  14.            $sql_preg="EXEC comparar_ventas_meses ?, ?, ?";
  15.  
  16.            $params = array(
  17.                &$f_inicial,
  18.                &$f_final,
  19.                &$gestora);
  20.  
  21.            $registros = sqlsrv_prepare( $conexion,$sql_preg, $params);
  22.            if (sqlsrv_execute($registros))
  23.  
  24.            {
  25.  
  26.                 while ($id= sqlsrv_fetch_array($registros))
  27.            {
  28.                    echo $id['actual'];  
  29.            }    
  30.            } else
  31.            {
  32.                die( print_r( sqlsrv_errors(), true));
  33.            }

por favor ayudenme ya que llevo dias buscando en internet y no enucentro ninguna solucion.



« Última modificación: 26 Junio 2018, 01:20 am por #!drvy » En línea

EFEX


Desconectado Desconectado

Mensajes: 1.171


"Dinero Facil"


Ver Perfil WWW
Re: Recoger datos de procedimiento almacenado en PHP con SQLSRV
« Respuesta #1 en: 7 Marzo 2018, 03:46 am »

Siempre verifica la conexion con la db

Código
  1. ...
  2. $conexion = sqlsrv_connect($HOSTNAME, $info);
  3.  
  4. if( $conexion === false) {
  5.    die( print_r( sqlsrv_errors(), true));
  6. }
  7.  
  8. $sql_preg="EXEC comparar_ventas_meses ?, ?, ?";
  9. ...

sqlsrv_execute() devuelve TRUE o FALSE, utiliza sqlsrv_query() en su lugar.

http://php.net/manual/es/function.sqlsrv-execute.php#refsect1-function.sqlsrv-execute-returnvalues


En línea

pavel.escobar

Desconectado Desconectado

Mensajes: 6


Ver Perfil
Re: Recoger datos de procedimiento almacenado en PHP con SQLSRV
« Respuesta #2 en: 7 Marzo 2018, 17:54 pm »

Gracias por responder EFEX

ya probe con sqlsrv_query y tambien ya habia visto el manual que me enviaste pero siempre obtengo el mismo resultado o sea nada, no se si hay algo mas en mi codigo que estea mal, te envio el codigo modiicado a sqlsrv_query

Código
  1.        $f_inicial ='01/01/'.(date("Y"));
  2.        $f_final = date("d/m/Y");
  3.        $gestora='pescobar';
  4.        $mes=0;
  5.        $actual=0;
  6.        $anterior=0;
  7.        $crecimiento=0;
  8.  
  9. include ("seguro.php");
  10.        global $HOSTNAME, $USERNAME, $PASSWORD, $DATABASE;
  11.            $info = array('Database'=>'Adicional', 'UID'=>$USERNAME, 'PWD'=>$PASSWORD);
  12.            $conexion = sqlsrv_connect($HOSTNAME, $info);
  13.            if( $conexion === false) {
  14.                die( print_r( sqlsrv_errors(), true));
  15.            }
  16.            $sql_preg="EXEC comparar_ventas_meses ?, ?, ?";
  17.  
  18.            $params = array(
  19.                &$f_inicial,
  20.                &$f_final,
  21.                &$gestora);
  22.  
  23.            $registros = sqlsrv_query( $conexion,$sql_preg, $params);
  24.  
  25.                 while ($id= sqlsrv_fetch_array($registros))
  26.            {
  27.                    echo $id['actual'];  
  28.            }  
En línea

EFEX


Desconectado Desconectado

Mensajes: 1.171


"Dinero Facil"


Ver Perfil WWW
Re: Recoger datos de procedimiento almacenado en PHP con SQLSRV
« Respuesta #3 en: 7 Marzo 2018, 19:19 pm »

Los errores de php te los a mostrado antes no ? Fijate en tu archivo php.ini si es correcto el siguiente parametro

Citar
display_errors = on

Algunos cambios, prueba y dime
Código
  1. <?php
  2.  
  3.  
  4. //Solo para asegurar que los errores en php se
  5. //muestren, luego borralo
  6. ini_set('display_errors', 1);
  7. ini_set('display_startup_errors', 1);
  8.  
  9.  
  10. $f_inicial = '01/01/'.(date("Y"));
  11. $f_final = date("d/m/Y");
  12. $gestora = 'pescobar';
  13. $mes = 0;
  14. $actual = 0;
  15. $anterior = 0;
  16. $crecimiento = 0;
  17.  
  18. include("seguro.php");
  19. global $HOSTNAME, $USERNAME, $PASSWORD, $DATABASE;
  20. $info = array('Database' => 'Adicional', 'UID' => $USERNAME, 'PWD' => $PASSWORD);
  21. $conexion = sqlsrv_connect($HOSTNAME, $info);
  22. if ($conexion === false) {
  23.    die(print_r(sqlsrv_errors(), true));
  24. }
  25.  
  26. //Segun varios ejemplos con mssql para SP
  27. //vi que utilizan 'call'
  28. $sql_preg = "{CALL comparar_ventas_meses(?, ?, ?)}";
  29.  
  30. //Tambien siguiendo varios ejemplos utilizan
  31. //arrays multimensional para definir
  32. //parametros conjunto a una constante en
  33. //este caso SQLSRV_PARAM_IN
  34. $params = array(
  35. array( $f_inicial, SQLSRV_PARAM_IN );
  36. array( $f_final, SQLSRV_PARAM_IN );
  37. array( $gestora, SQLSRV_PARAM_IN );
  38. );
  39.  
  40. $registros = sqlsrv_query($conexion, $sql_preg, $params);
  41.  
  42. //No se pudo realizar la consulta, boom error
  43. if( $registros === false) {
  44.    die( print_r( sqlsrv_errors(), true) );
  45. }
  46.  
  47. //Mostrar todo lo que devuelve la consulta
  48. //sola para ver que devuelve
  49. echo '<pre>';
  50. print_r($registros);
  51. echo '</pre>';
  52.  
  53. while ($id = sqlsrv_fetch_array($registros)) {
  54.    echo $id['actual'];
  55. }

Si no voy a tratar de montar una maquina virtual para ver si es correcto, no tengo como probar el codigo.
En línea

pavel.escobar

Desconectado Desconectado

Mensajes: 6


Ver Perfil
Re: Recoger datos de procedimiento almacenado en PHP con SQLSRV
« Respuesta #4 en: 7 Marzo 2018, 23:32 pm »

ingrese el código que me mandaste y todo pasa normal
se imprime el siguiente dato en pantalla:

Resource id #6

pero no sale ningun dato mas

el resultado que te digo sale cuando se ejecuta el codigo
Código
  1. echo '<pre>';
  2. print_r($registros);
  3. echo '</pre>';
pero de ahi no sale mas datos
En línea

EFEX


Desconectado Desconectado

Mensajes: 1.171


"Dinero Facil"


Ver Perfil WWW
Re: Recoger datos de procedimiento almacenado en PHP con SQLSRV
« Respuesta #5 en: 8 Marzo 2018, 00:55 am »

Haber si esto lo resuelve

Código
  1. ...
  2.  
  3. while ($id = sqlsrv_fetch_array($registros, SQLSRV_FETCH_ASSOC)) {
  4.    echo '<pre>';
  5.    print_r($id);
  6.    echo '</pre>'
  7. }
  8.  
  9. ...

En línea

pavel.escobar

Desconectado Desconectado

Mensajes: 6


Ver Perfil
Re: Recoger datos de procedimiento almacenado en PHP con SQLSRV
« Respuesta #6 en: 8 Marzo 2018, 02:29 am »

tampoco imprime nada, intente imprimiendo algo como echo "imprime hasta aca"; en el while como se muestra en este código pero ni eso imprime, o sea no esta funcionando el while

Código
  1. while ($id = sqlsrv_fetch_array($registros, SQLSRV_FETCH_ASSOC)) {
  2.     echo 'imprime hasta aca';
  3.     echo '<pre>';
  4.    print_r($id);
  5.    echo '</pre>';
En línea

EFEX


Desconectado Desconectado

Mensajes: 1.171


"Dinero Facil"


Ver Perfil WWW
Re: Recoger datos de procedimiento almacenado en PHP con SQLSRV
« Respuesta #7 en: 8 Marzo 2018, 03:14 am »

Estoy empezando a dudar si la db esta vacia ja.

Haber la conexion lo establece y parece ser que tambien realiza la consulta, lo que dudo es que no devuelve nada por que este vacia ?.

Código
  1. $rows = sqlsrv_has_rows( $registros );
  2.  
  3. //Vemos si existen filas..
  4. if ($rows === true) {
  5. //Existen? cuantas?
  6. echo 'Cant: ' . sqlsrv_num_rows( $registros ) . '</br>';
  7. }else{
  8. echo 'No existen datos </br>'.
  9. }
  10.  
  11. while ($id = sqlsrv_fetch_array($registros, SQLSRV_FETCH_ASSOC)) {
  12.    echo '<pre>';
  13.    print_r($id);
  14.    echo '</pre>';
  15. }

Probaste el SP sobre MSSQL no ? te devuelve la lista de filas no? Que version de PHP y MSSQL estas.
En línea

pavel.escobar

Desconectado Desconectado

Mensajes: 6


Ver Perfil
Re: Recoger datos de procedimiento almacenado en PHP con SQLSRV
« Respuesta #8 en: 8 Marzo 2018, 03:23 am »

 >:( la base si tiene datos.

cuando ejecuto una sentencia simple "un SELECT * FROM TABLA", si tengo resultados, el problema que tengo es solo cuando uso Procesos almacenados, si ves el proceso almacenado se juntan unas tablas creando una tabla temporal y después sacando los datos de la tabla temporal, intente instalar el MSSQL en el servidor pero me sale errores en cambio con el SQLSRV no tengo problemas
En línea

EFEX


Desconectado Desconectado

Mensajes: 1.171


"Dinero Facil"


Ver Perfil WWW
Re: Recoger datos de procedimiento almacenado en PHP con SQLSRV
« Respuesta #9 en: 8 Marzo 2018, 04:16 am »

Si entiendo lo que dices, solo llamar a un SP no devuelve nada. Estuve toda la tarde pensando, se me hace dificl no poder montar una vm para probar.
Otra cosa el proceso almacenado(SP) veo que tiene un solo UNION de tres SELECT, devuelve dos tablas, quizas eso sea, tambien agrege los '&' en los parametros por que me habia olvidado.. este es el codigo completo, pruebalo..

Código
  1. ini_set('display_errors', 1);
  2. ini_set('display_startup_errors', 1);
  3.  
  4. $f_inicial = '01/01/'.(date("Y"));
  5. $f_final = date("d/m/Y");
  6. $gestora = 'pescobar';
  7. $mes = 0;
  8. $actual = 0;
  9. $anterior = 0;
  10. $crecimiento = 0;
  11.  
  12. include("seguro.php");
  13. global $HOSTNAME, $USERNAME, $PASSWORD, $DATABASE;
  14. $info = array('Database' => 'Adicional', 'UID' => $USERNAME, 'PWD' => $PASSWORD);
  15. $conexion = sqlsrv_connect($HOSTNAME, $info);
  16. if ($conexion === false) {
  17.    die(print_r(sqlsrv_errors(), true));
  18. }
  19.  
  20. $sql_preg = "{CALL comparar_ventas_meses(?, ?, ?)}";
  21. $params = array(
  22. array( &$f_inicial, SQLSRV_PARAM_IN );
  23. array( &$f_final, SQLSRV_PARAM_IN );
  24. array( &$gestora, SQLSRV_PARAM_IN );
  25. );
  26.  
  27. $registros = sqlsrv_query($conexion, $sql_preg, $params);
  28.  
  29. if( $registros === false) {
  30.    die( print_r( sqlsrv_errors(), true) );
  31. }
  32.  
  33. $rows = sqlsrv_has_rows( $registros );
  34.  
  35. //Vemos si existen filas..
  36. if ($rows === true) {
  37. //Existen? cuantas?
  38. echo 'Cant: ' . sqlsrv_num_rows( $registros ) . '</br>';
  39. }else{
  40. echo 'No existen datos </br>'.
  41. }
  42.  
  43. /*
  44. while ($id = sqlsrv_fetch_array($registros, SQLSRV_FETCH_ASSOC)) {
  45.     echo '<pre>';
  46.     print_r($id);
  47.     echo '</pre>';
  48. }
  49. */
  50.  
  51. //Quizas esta sea la mejor forma para un SP
  52. do {
  53.   while ($row = sqlsrv_fetch_array($registros)) {
  54.       echo '<pre>';
  55.       print_r($row);
  56.       echo '</pre>';
  57.   }
  58. } while (sqlsrv_next_result($registros)); //Siguiente tabla
  59.  
En línea

Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
llamar Procedimiento Almacenado
Programación Visual Basic
juanjoxx 0 1,382 Último mensaje 9 Septiembre 2008, 05:23 am
por juanjoxx
tabla temporal en procedimiento almacenado
Bases de Datos
OssoH 0 3,472 Último mensaje 21 Noviembre 2012, 21:58 pm
por OssoH
Llamar un procedimiento almacenado PL desde PHP.
Desarrollo Web
Saberuneko 7 5,552 Último mensaje 21 Marzo 2014, 12:52 pm
por Saberuneko
Problemas con procedimiento almacenado en mysql
Bases de Datos
3n31ch 1 2,771 Último mensaje 11 Septiembre 2015, 03:18 am
por 0roch1
Auditoria de base de datos, ¿Triggers o procedimiento almacenado?
Desarrollo Web
reiser 2 2,511 Último mensaje 8 Septiembre 2016, 14:10 pm
por Zeros1001
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines