> The code is a bit lengthy because it has to allow for three different search
> modes (any, all and exact phrase). So first I define the first part of the
> search query as:
>
> $searchquery = "SELECT i.image_id, i.title, i.medium, j.artist_id,
> a.firstname, a.lastname
> FROM images i, art_img_join j, artists a
> WHERE (i.image_id = j.image_id
> AND j.artist_id = a.artist_id)
> AND ";
>
> And then depending on what type of search they chose it does any of three
> different things with their search text. In the case of an "any" search (as
> in, any of the words they entered), it does this:
>
> // break into an array of separate words, count them
>
> $searchwords = explode (" ", $searchtext);
> $wordcount = count ($searchwords);
>
> // loop through array adding each word to select
>
> foreach ($searchwords as $key => $word) {
>
> $where_clause .= "i.title ILIKE '%$word%'
> OR i.series ILIKE '%$word%'
> OR i.medium ILIKE '%$word%'";
>
> if (($key + 1) < $wordcount) {
> $where_clause .= " OR ";
> }
> }
>
> And then, for any of the three types, it adds this:
>
> $searchquery .= $where_clause . " ORDER BY lower(i.title)";
>
> That's for the actual search query. Now, the reason I didn't just run the
> query and use pg_num_rows is because the images table has quite a lot of
> records. If someone searches for a fairly common word or phrase, they could
> get 20 pages of results... So I didn't want to put any more stress on the
> database, or slow things down any more, than I had to. Thus, I thought the
> count(*) approach might be more efficient.
Don't do pg_num_rows - it's the wrong approach for this problem.
> So what I did with that was this:
>
> $count_query = "SELECT COUNT(*) AS result_count
> FROM images i, art_img_join j, artists a
> WHERE " . $where_clause;
>
> (I didn't originally have the "AS result_count" in there - I added that when
> I was having trouble extracting the value, hoping that giving it a more
> specific name might help. It didn't.)
>
> $result_count = pg_query($count_query);
>
> $numrows = [any number of things I've tried]
$count_row = pg_fetch_assoc($result_count) or die ('problem: ' .
pg_last_error());
$numrows = $count_row['result_count'];
:D
You can't do it all in one step with pg_fetch_assoc (afaik), but this is
easy enough.
No idea why it's not working with pg_fetch_result but this way does work.
--
Postgresql & php tutorials
http://www.designmagick.com/