Have a simple page that pulls results from MySQL and displays them in a table. I have enabled paging on the results, and allowed the user to set the number of results being displayed per page. I am passing two querystring values to handle this: ‘page’ and ‘count’.
I am then taking these values to calculate the LIMIT’s of my MySQL query, using the SQL_CALC_FOUND_ROWS directive and following that with a call to SELECT FOUND_ROWS(); to get the total number of results. This all works nicely.
Now, I want to validate the querystring values. As I am storing the possible “correct” values for the results/page value of ‘count’ in an array, I simply check that the passed ‘count’ value is in that array, and if not set it to the default value. For the ‘page’ value, I am having a bit of a mental block… in order to determine if there are any results for the passed ‘page’, meaning it is “correct”, I need to go to the database and find the result count first, but since I only want to go to the db once, I need to include the LIMIT’s, which are based on the passed ‘page’ value… chicken and egg. I have a couple thoughts on how to solve this:
-
Run the query as coded above, and if the ((‘page’ – 1) * ‘count’) result is greater than the value returned from
SELECT FOUND_ROWS();, re-run the query with new LIMIT’s set to 0, count. -
Get the full result set, verify that the passed page is correct, then do another pull from the database with the LIMIT values.
I’d rather not go back to the database at all, but as I mentioned, having a mental block on this rather common issue.
Thanks,
Paul
I ended up using the first solution above –
It’s not perfect in that a second database pull is required for cases where the passed page value is bad, but given that is an unexpected case only triggered by the intentional passage of bad data on the part of the user, it’s acceptable. If anyone else has a better solution, I’d be happy to re-open the question.