Foros del Web » Programando para Internet » PHP »

obtener datos de un store procedure(postgre) desde php

Estas en el tema de obtener datos de un store procedure(postgre) desde php en el foro de PHP en Foros del Web. Hola, estoy comenzando a trabajar postgre y quisiera saber como hago para obtener desde php los datos de un select hecho en un store procedure. ...
  #1 (permalink)  
Antiguo 02/11/2009, 13:42
 
Fecha de Ingreso: noviembre-2009
Mensajes: 16
Antigüedad: 14 años, 5 meses
Puntos: 0
obtener datos de un store procedure(postgre) desde php

Hola, estoy comenzando a trabajar postgre y quisiera saber como hago para obtener desde php los datos de un select hecho en un store procedure. El SP me corre bien pero no se como hacer en el momento de imprimir los datos en php.

Este es mi Store Procedure:

Código:
CREATE OR REPLACE FUNCTION getadministradorlogin(character varying)
  RETURNS text AS
$BODY$DECLARE
datos administrador%ROWTYPE;
result TEXT;
BEGIN
select into datos id_admin, login_adm, password_adm from administrador where login_adm='$1';
result := datos.id_admin||'|'||datos.login_adm||'|'||datos.password_adm;
RETURN result;
END;$BODY$
  LANGUAGE 'plpgsql' VOLATILE
  COST 100;
ALTER FUNCTION getadministradorlogin(character varying) OWNER TO postgres;
y mi codigo PHP:

Código:
$sql="select * from getadministradorlogin('".$login_admin."')";
		
		// conexion a la BD
		$con=parent::open();

		// se ejecuta el query
		$rs=parent::rs($con, $sql);
		$total=pg_num_rows($rs);
		// verifico en bd
		if (pg_num_rows($rs)<=0){
			// el usuario no existe
			$arr=array();
			$arr['error']='loginNO';
		} else {
		    $arr=array();
			$arr['idAdmin']=pg_fetch_result($rs,0,'getadministradorlogin');
			$arr['login']=pg_fetch_result($rs,0,'getadministradorlogin');
			$arr['password']=pg_fetch_result($rs,0,'getadministradorlogin');
			if ($arr['password']!=$password){
				// password incorrecto
				$arr['error']='passwordNO';
			} else {
				session_start();
				$_SESSION[$varGenPLogAdmin]=$login;
				$_SESSION[$varGenPIdAdmin]=$arr['idAdmin'];
			    $arr['error']='OK';
			}
		}
		
		// se cierra la conexion a la BD
		parent::close($con);
		return $arr;
Gracias de antemano.
  #2 (permalink)  
Antiguo 02/11/2009, 17:42
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: obtener datos de un store procedure(postgre) desde php

Espera que el moderador mueva el tema al foro de php.
Como lo veo por encima, lo haces bien.
Esperemos la opinión de los expertos.
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #3 (permalink)  
Antiguo 02/11/2009, 20:42
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 10 meses
Puntos: 2135
Tema movido desde PostgreSQL a PHP
  #4 (permalink)  
Antiguo 04/11/2009, 08:56
 
Fecha de Ingreso: agosto-2004
Mensajes: 131
Antigüedad: 19 años, 8 meses
Puntos: 2
Respuesta: obtener datos de un store procedure(postgre) desde php

Hola,

Mira la verdad soy nuevo también en esto de usar PHP con Postgre y estoy igual que tu. En lo personal me ha gustado bastante sobre todo el pgsql. El tema es que la información que hay es bien poca y sobre todo en cuanto a SP.

Por ejemplo yo tengo el siguiente SP
Código:
CREATE OR REPLACE FUNCTION LoopTest() RETURNS SETOF tbl_usuario AS $$
DECLARE
	datos tbl_usuario%ROWTYPE;
BEGIN
	FOR datos IN
		SELECT us_id, per_us_id, us_rut, us_dv, us_nombre, us_email, us_region, us_comuna, us_username, us_password, us_activo
		FROM tbl_usuario
		WHERE us_activo='1'
	LOOP
		RETURN NEXT datos;
	END LOOP;
	RETURN;
END;
$$ LANGUAGE plpgsql VOLATILE
Y luego en PHP lo recupero así

Código:
$sql = "SELECT LoopTest()";
$result = pg_query($conn, $sql);
$filas = pg_num_rows($result);
if ($filas==0) {
	echo 'No existen usuarios';exit;
} else {
	for($cont=0;$cont<$filas;$cont++) {
		$campo = pg_result( $result, $cont, 0 );
		echo "$campo <br>";
	}
	pg_free_result($result);
}
El tema es que la salida de php es la siguiente:

Código:
(1,1,1111111,1,"Administrador Sistema",[email protected],RM,PRV,admin,admin,t)
(3,1,2222222,2,"Usuario Test",[email protected],RM,SBR,admin,admin,t)
Lo que me he fijado es que haga lo que haga y reciba de la forma que sea los datos en PHP siempre me devuelve una sola columna que contiene todos las columnas recogidas por el SP como una sola cadena de texto. O sea esto: (1,1,1111111,1,"Administrador Sistema",[email protected],RM,PRV,admin,admin,t)

Eso se puede comprobar al intentar hacer $campo = pg_result( $result, $cont, 1 );

Aunque en el SP tomes varias columnas PHP te reclama que la columna 1 no existe, y al tomar la columna 0 pues te da lo que escribí antes.

De momento se me está ocurriendo tomar los datos y trabajarlos como cadena, o sea hacer un explode de la cadena retornada y todo eso, seria una real lata pero no se me ocurre otra solución (seguramente debido a mi ignorancia en el tema)

¿¿¿Algún experto tendrá una forma correcta de trabajar con PHP y SP pgsql???

Saludos y gracias,

Rodrigo
  #5 (permalink)  
Antiguo 04/11/2009, 09:51
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: obtener datos de un store procedure(postgre) desde php

No llames el procedimiento así
select LoopTest()

sino así:
SELECT *from LoopTest();

Saludos
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #6 (permalink)  
Antiguo 04/11/2009, 10:03
 
Fecha de Ingreso: noviembre-2009
Mensajes: 16
Antigüedad: 14 años, 5 meses
Puntos: 0
Respuesta: obtener datos de un store procedure(postgre) desde php

gracias rProgged, probare haciéndolo como tú, porque como tu dices de verdad hay poca información al respecto y tu código hace el trabajo. Gracias de nuevo
  #7 (permalink)  
Antiguo 04/11/2009, 11:51
 
Fecha de Ingreso: agosto-2004
Mensajes: 131
Antigüedad: 19 años, 8 meses
Puntos: 2
jajajajaj incrible, lo hice como dice huesos y funcionó perfecto, ahora si me devuelve las columnas como corresponde.... =P

Muchisimas gracias, al final al mezclar las dos formas funciona perfecto!

Saludos,

Rodrigo

Bueno, al final el código queda practicamente igual que con MySQL, me quedó así:

Código:
$sql = "SELECT * FROM LoopTest()";
$result = pg_query($conn, $sql);
$filas = pg_num_rows($result);
if ($filas==0) {
	echo 'No existen usuarios';exit;
} else { 
	while ( $row = pg_fetch_assoc($result) ) {
                echo $row['us_rut'].'-'.$row['us_dv'].'<br>';
                echo $row['us_nombre'].'<br>';
	}
	pg_free_result($result);
}


Saludos y gracias

Última edición por GatorV; 04/11/2009 a las 14:00
  #8 (permalink)  
Antiguo 05/11/2009, 07:08
 
Fecha de Ingreso: noviembre-2009
Mensajes: 16
Antigüedad: 14 años, 5 meses
Puntos: 0
Respuesta: obtener datos de un store procedure(postgre) desde php

Hola, a mi no me funcionó, se ejecuta el SP sin problema, y me devuelve que hay 1 fila, pero en el momento que voy a imprimir, no imprime nada.

Será mi SP, yo lo cree de esta manera?

Código:
CREATE OR REPLACE FUNCTION getadministradorlogin(character varying)
  RETURNS SETOF administrador AS
$BODY$
DECLARE
	datos administrador%ROWTYPE;
BEGIN
    FOR datos IN
        select id_admin, login_adm, password_adm 
        from administrador 
        where login_adm='$1'
    LOOP
        RETURN NEXT datos;
    END LOOP;
    RETURN;
END;
$BODY$
  LANGUAGE 'plpgsql' VOLATILE
  COST 100
  ROWS 1000;
ALTER FUNCTION getadministradorlogin(character varying) OWNER TO postgres;
  #9 (permalink)  
Antiguo 05/11/2009, 07:17
 
Fecha de Ingreso: agosto-2004
Mensajes: 131
Antigüedad: 19 años, 8 meses
Puntos: 2
Respuesta: obtener datos de un store procedure(postgre) desde php

Hola,

No veo posibles errores, me queda alguna duda de todas formas con el '$1', tengo la impresión de que postgre no evalua esa variable sino que la toma como un literal pero no tengo plena certeza de eso. Podrias probar poniendo "where login_adm=$1"

De todas formas al ejecutar el SP directamente en postgre ¿Te da algún resultado?, lo otro es que podrias postear el código PHP que estás empleando para revisarlo.

Saludos,

Rodrigo
  #10 (permalink)  
Antiguo 05/11/2009, 07:23
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: obtener datos de un store procedure(postgre) desde php

Cita:
el '$1', tengo la impresión de que postgre no evalua esa variable sino que la toma como un literal pero no tengo plena certeza de eso.
Esto es cierto.

martha_mendoza... hazlo así:
Código sql:
Ver original
  1. FOR datos IN
  2.         SELECT id_admin, login_adm, password_adm
  3.         FROM administrador
  4.         WHERE login_adm=$1
  5.     LOOP

el $1 viene como variable de tipo character varying y ya trae las comillas implicitas. si lo pones entre comillas, estarás enviando una comparación contra la palabra "$1" y no contra la variable que trae realmente.
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #11 (permalink)  
Antiguo 05/11/2009, 08:58
 
Fecha de Ingreso: noviembre-2009
Mensajes: 16
Antigüedad: 14 años, 5 meses
Puntos: 0
Respuesta: obtener datos de un store procedure(postgre) desde php

Lo coloque tal como ustedes me sugirieron, pero asi no me ejecuta el SP:

Código:
CREATE OR REPLACE FUNCTION getadministradorlogin(character varying)
  RETURNS SETOF administrador AS
$BODY$
DECLARE
	datos administrador%ROWTYPE;
BEGIN
    FOR datos IN
        select id_admin, login_adm, password_adm 
        from administrador 
        where login_adm=$1
    LOOP
        RETURN NEXT datos;
    END LOOP;
    RETURN;
END;
$BODY$
  LANGUAGE 'plpgsql' VOLATILE
  COST 100
  ROWS 1000;
ALTER FUNCTION getadministradorlogin(character varying) OWNER TO postgres;
En cambio como lo tenia anteriormente si mando a imprimir pg_num_rows($rs)me devuelve 1 fila pero mi problema es que no me imprime los datos. Este es mi codigo de php:

Código:
// query
		$sql="select * from getadministradorlogin('".$login_admin."')";
		
		// conexion a la BD
		$con=parent::open();

		// se ejecuta el query
		$rs=parent::rs($con, $sql);
			
		// verifico en bd
		if (pg_num_rows($rs)<=0){
		    echo '<br>No existen usuarios';
			// el usuario no existe
			$row=array();
			$row['error']='loginNO';
		} else {
		    $row=array();
			while ( $row = pg_fetch_assoc($rs) ) {
                echo $row['id_admin'].'-'.$row['login_adm'].'-'.$row['password_adm'].'<br>';
			}
			if ($row['password_adm']!=$password){
				// password incorrecto
				$row['error']='passwordNO';
			} else {
				session_start();
				$_SESSION[$varGenPLogAdmin]=$login_admin;
				$_SESSION[$varGenPIdAdmin]=$row['id_admin'];
			    $row['error']='OK';
			}
		}
		
		// se cierra la conexion a la BD
		parent::close($con);
		return $row;
Gracias por la ayuda
  #12 (permalink)  
Antiguo 05/11/2009, 09:40
 
Fecha de Ingreso: agosto-2004
Mensajes: 131
Antigüedad: 19 años, 8 meses
Puntos: 2
Respuesta: obtener datos de un store procedure(postgre) desde php

Hola Martha,

Lo que ocurre es que el ejemplo que puse es un SP que retorna varias filas mediante un LOOP, en tu caso necesitas modificar ese SP para que sólo retorne 1 fila.

Según entiendo quedaría algo así

Código:
CREATE OR REPLACE FUNCTION getadministradorlogin(character varying) RETURNS RECORD AS
$BODY$
DECLARE
	datos administrador%ROWTYPE;
BEGIN
	SELECT INTO id_admin, login_adm, password_adm 
	FROM administrador 
	WHERE login_adm=$1;
	IF FOUND THEN
		RETURN datos;
	END IF;
END;
$BODY$
  LANGUAGE 'plpgsql' VOLATILE
  COST 100
  ROWS 1000;
ALTER FUNCTION getadministradorlogin(character varying) OWNER TO postgres;

Ahora, en la consulta para obtener los datos debes especificar las columnas, podria quedar así:

Código PHP:
$sql="select * from getadministradorlogin('".$login_admin."') AS (id_admin tipo_columna, login_adm tipo_columna, password_adm tipo_columna)"
Y lo demás es el mismo proceso, espero que te vaya bien

saludos
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 10:10.