First, this is a table with about 25 fields. Defining each variable like this seems like a lot of work and maybe a bit bloated.
Is it okay to simply use extract() here?
If you need to use all, or most, of the 25 columns, then a SELECT * would be okay. If not, you will just be retrieving unnecessary data.
Also, the code you share results in data for a single record at a time, but doesn't store it in any array for future use.
I wonder if it is better to make a db call each time a record is selected, or to store the data initially and then work through an array when a record is selected?
Make one query to retrieve the list of records (no need to put them in an array, unless you need this list for some other reason as well). When the user selects a particular record, make another query to retrieve the entire record.
I might add that one issue I'm trying to accommodate is a <Previous:current:Next> navigation wrt the listings.
You can use an array for that.
Is there a simple way to identify the 'previous' and 'next' listing on the mySQL side?
Yes. For previous, order by the ListingID, then query for the first ListingID less than your current ListingID. For next, also order by the ListingID, then query for the first ListingID greater than your current ListingID. Alternatively, retrieve all the ListingIDs in sorted order, put them in an array, search for your current ListingID, then pick the ListingIDs one before and after your current.