RE: [PEAR] Trying to loop through MDB rowset - proposed solution
| From: | Matt Friedman | Date: | Sat, 09 Nov 2002 17:51:21 +0000 |
| Subject: | RE: [PEAR] Trying to loop through MDB rowset - proposed solution | ||
| Groups: | php.pear.dev | ||
| Request: | Send a blank email to pear-dev+get-10657@lists.php.net to get a copy of this message | ||
There's a small bug in there.
IsDone() should read as follows:
function IsDone($freeResult = true)
{
if( $this->current > $this->num_rows -1)
{
if( $freeResult) {
mysql_free_result($this->rs);
}
return true;
}
return false;
}
Note: the line: if( $this->current > $this->num_rows -1) now has -1 at
the end.
Matt Friedman
Web Applications Developer
www.SpryNewMedia.com
Phone: 416 992 5482
Email: matt@SpryNewMedia.com
> -----Original Message-----
> From: Matt Friedman [mailto:matt@sprynewmedia.com]
> Sent: Saturday November 9, 2002 12:34 PM
> To: 'smith@dybnet.de'; 'pear-dev@lists.php.net'
> Subject: RE: [PEAR] Trying to loop through MDB rowset - proposed
solution
>
> Hi Lucas,
>
> As I said I wanted to come up with a way to loop through record sets
> without putting the set into a php array first. MDB doesn't seem to
> provide methods that allow for this.
>
> I'm sending a rough implementation of an "iterator" class and its
> associated factory method class for your consideration. Since the MDB
> query method returns a resource id which points to a result set, we
don't
> have to rely on MDB to loop through the set. We can pass the result id
to
> another class which can then be responsible for providing each item in
the
> list. This hides the database implementation and allows for all sorts
of
> iteration classes to be written that could make use of cursors etc...
> Looping backwards through the set is one example and so on...
>
> A couple of other advantages: you can choose whether or not to free
the
> result at the end of the loop (see IsDone()) and if you don't free it,
you
> can re-use the iterator and loop through the same set again. The
default
> is to free the set. Also, this solution doesn't require changing MDB
at
> all.
>
> Anyway, I think my code is fairly self explanatory if not complete.
There
> needs to be lots more error checking and PEARifying if you want to use
it;
> but I wanted to contribute the idea. If you have any questions please
let
> me know.
>
> I hope this turns out to be helpful and useful. :)
>
> Matt Friedman
> matt@SpryNewMedia.com
>
>
>
> > -----Original Message-----
> > From: Matt Friedman [mailto:matt@sprynewmedia.com]
> > Sent: Thursday November 7, 2002 4:58 PM
> > To: smith@dybnet.de; pear-general@lists.php.net
> > Subject: RE: [PEAR] Trying to loop through MDB rowset -
> >
> > Hi again Lukas,
> >
> > I've been thinking (ruminating) about this and have a solution (in
my
> > mind) about a way to satisfy this problem without having to touch
MDB at
> > all. What I don't like about the current way is that MDB loops
through
> > the results and then I have to loop through the results again to
handle
> > the data. Makes more sense to me to just loop once.
> >
> > I'll work on something and submit something to you - you can let me
know
> > if it looks reasonable. Give me a day or so.
> >
> > Matt Friedman
> > Web Applications Developer
> > www.SpryNewMedia.com
> > Phone: 416 992 5482
> > Email: matt@SpryNewMedia.com
> >
> >
> >
> > > -----Original Message-----
> > > From: Lukas Smith [mailto:smith@dybnet.de]
> > > Sent: Thursday November 7, 2002 2:42 PM
> > > To: 'Matt Friedman'; pear-general@lists.php.net
> > > Subject: RE: [PEAR] Trying to loop through MDB rowset -
> > >
> > > > From: Matt Friedman [mailto:matt@sprynewmedia.com]
> > > > Sent: Thursday, November 07, 2002 8:32 PM
> > > > To: smith@dybnet.de; pear-general@lists.php.net
> > > > Subject: RE: [PEAR] Trying to loop through MDB rowset -
> > > >
> > > > Thanks very much Lucas.
> > > >
> > > > Is loading up a new array with the whole result set ok (as in
> > > queryAll)?
> > > > I had actually thought that using the Resource Id instead of
filling
> > a
> > > > result set object/array was more efficient. The impression I
have is
> > > > that using a result id uses less memory. What about large result
> > sets?
> > > > This may not be a big issue - I'm just throwing it out there.
But
> > > that's
> > > > actually why I was trying to avoid using queryAll if I could.
> > > >
> > > > What about the ability to _not_ free the result so that you can
> > > continue
> > > > to loop through using the resource id when you use fetchRow
etc...?
> > > (via
> > > > some flag or something?)
> > > >
> > > > Anyway, thanks again :)
> > > >
> > >
> > > well hmmm ...
> > > I ported this behavior from DB's get+() methods.
> > > Recently there was the addition of autofree (automatically free a
> > result
> > > set when the end of the result set is reached). So maybe I shoud
> > > re-examine this. Adding another flag is probably not a good idea
> > because
> > > most methods in MDB have so many parameters already due to the
> > datatype
> > > abstraction.
> > >
> > > Fetching everything at once will be faster I am quite sure as you
have
> > > less function calls. Then again you might be right that is uses
more
> > > memory.
> > >
> > > Regards,
> > > Lukas
> > >
> > >
> > > --
> > > PEAR General Mailing List (http://pear.php.net/)
> > > To unsubscribe, visit: http://www.php.net/unsub.php
> >
> >
> >
> > --
> > PEAR General Mailing List (http://pear.php.net/)
> > To unsubscribe, visit: http://www.php.net/unsub.php