Skip site navigation (1) Skip section navigation (2)

Re: newbie issues with PDO / stored procedures

From: Andrew McMillan <andrew(at)catalyst(dot)net(dot)nz>
To: pg 043g9j2g <pg043g9j2g(at)gmail(dot)com>
Cc: pgsql-php(at)postgresql(dot)org
Subject: Re: newbie issues with PDO / stored procedures
Date: 2008-06-13 05:02:07
Message-ID: 1213333327.18669.172.camel@hippy.mcmillan.net.nz (view raw or flat)
Thread:
Lists: pgsql-php
On Thu, 2008-06-12 at 05:46 -0400, pg 043g9j2g wrote:
> Hi! I am new to PHP and Postgres; in the early stages of creating a web 
> app, just trying to achieve rudimentary results, yet trying to follow 
> "best practices" -- in the form of using Stored Procedures vs. Dynamic 
> SQL -- as I do hope to take it live to the scary ol' Internet one day.
> 
> I have a stored procedure (function), "select_user_details", of the form 
> "SELECT * FROM users;" which returns "SETOF users".
> 
> When I execute my prepared statement, "SELECT 
> select_user_details([userid])" via PDO, I get a rowset back which holds 
> all the columns of users as an array in one column. From my experiement 
> directly in pgAdmin Query tool, I guess that's what you expect when you 
> return SETOF, but I already miss the simple DSQL I had set up where I 
> could access returned columns via $row[columname] syntax.
> 
> I messed around with using fetch() but that didn't seem right (more on 
> that below). Then I took a look at fetchColumn() but I didn't like that 
> because you address columns by index # instead of column name. Also the 
> fact that you advance the row pointer with every call to any kind of 
> fetch*() seems like it isn't well suited to retrieving data from more 
> than one column.
> 
> Now it looks like my best option in hopes of being able to access 
> columns by semantically sensible names is to fetchObject() into PHP 
> objects representing my database business objects. Is this correct? 
> Suggestions? Alternatives? Insights?

I'm not sure this will work in your case, but the normal way to get
SETOF returning functions to return rows that look just like real table
rows is to define a view with the semantically sensible names and then
do your query against the view.

CREATE VIEW my_rows AS SELECT col1, col2, col3
       FROM setof_returning_function();

Then you will get a normal select output in your program and be able to
refer to $row->col1 etc.

This doesn't necessarily work so well when you want to hand in a
parameter, unless you can hand that in by doing a join of some kind:

´╗┐CREATE VIEW my_rows AS SELECT col1, col2, col3,
                      jointable.pkey_col AS other_key
       FROM setof_returning_function(jointable.somecol), jointable;

Then you would need to do something like:

SELECT col1 FROM my_rows WHERE other_key = 75

Etc.


Hope this helps,
					Andrew.

-------------------------------------------------------------------------
Andrew @ Catalyst .Net .NZ  Ltd,  PO Box 11-053, Manners St,  Wellington
WEB: http://catalyst.net.nz/            PHYS: Level 6, 150-154 Willis St
DDI: +64(4)803-2201      MOB: +64(272)DEBIAN      OFFICE: +64(4)499-2267
It is truth which you cannot contradict; you can without any difficulty
                      contradict Socrates. - Plato

-------------------------------------------------------------------------

In response to

Responses

pgsql-php by date

Next:From: pg 043g9j2gDate: 2008-06-24 23:44:15
Subject: Re: newbie issues with PDO / stored procedures
Previous:From: pg 043g9j2gDate: 2008-06-12 09:46:14
Subject: newbie issues with PDO / stored procedures

Privacy Policy | About PostgreSQL
Copyright © 1996-2014 The PostgreSQL Global Development Group