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