I am having trouble with modifying a php application to have pagination. My error seems to be with my logic, and I am not clear exactly what I am doing incorrectly. I have had before, but am not currently getting errors that mysql_num_rows() not valid result resource and that invalid arguments were supplied to foreach. I think there is a problem in my logic which is stopping the results from mysql from being returned.
All my ‘test’ echos are output except testing while loop. A page is generated with the name of the query and the word auctions, and first and previous links, but not the next and last links. I would be grateful if a more efficient way of generating links for the rows in my table could be pointed out, instead of making a link per cell. Is it possible to have a continuous link for several items?
<?php if (isset($_GET['cmd'])) $cmd = $_GET['cmd']; else die('You should have a 'cmd' parameter in your URL'); $query =''; if (isset($_GET['query'])) { $query = $_GET['query']; } if (isset($_GET['pg'])) { $pg = $_GET['pg']; } else $pg = 1; $con = mysql_connect('localhost','user','password'); echo 'test connection<p>'; if(!$con) { die('Connection failed because of' .mysql_error()); } mysql_query('SET NAMES utf8'); mysql_select_db('database',$con); if($cmd=='GetRecordSet'){ echo 'test in loop<p>'; $table = 'SaleS'; $page_rows = 10; $max = 'limit ' .($pg - 1) * $page_rows .',' .$page_rows; $rows = getRowsByProductSearch($query, $table, $max); echo 'test after query<p>'; $numRows = mysql_num_rows($rows); $last = ceil($rows/$page_rows); if ($pg < 1) { $pg = 1; } elseif ($pg > $last) { $pg = $last; } echo 'html stuff <p>'; foreach ($rows as $row) { echo 'test foreach <p>'; $pk = $row['Product_NO']; echo '<tr>' . '\n'; echo '<td><a href='#' onclick='updateByPk(\'Layer2\', \'' . $pk . '\')'>'.$row['USERNAME'].'</a></td>' . '\n'; echo '<td><a href='#' onclick='updateByPk(\'Layer2\', \'' . $pk . '\')'>'.$row['shortDate'].'</a></td>' . '\n'; echo '<td><a href='#' onclick='updateByPk(\'Layer2\', \'' . $pk . '\')'>'.$row['Product_NAME'].'</a></td>' . '\n'; echo '</tr>' . '\n'; } if ($pg == 1) { } else { echo ' <a href='{$_SERVER['PHP_SELF']}?pg=1'> <<-First</a> '; echo ' '; $previous = $pg-1; echo ' <a href='{$_SERVER['PHP_SELF']}?pg=$previous'> <-Previous</a> '; } echo '---------------------------'; if ($pg == $last) { } else { $next = $pg+1; echo ' <a href='{$_SERVER['PHP_SELF']}?pg=$next'>Next -></a> '; echo ' '; echo ' <a href='{$_SERVER['PHP_SELF']}?pg=$last'>Last ->></a> '; } echo '</table>\n'; } echo '</div>'; function getRowsByProductSearch($searchString, $table, $max) { $searchString = mysql_real_escape_string($searchString); $result = mysql_query('SELECT Product_NO, USERNAME, ACCESSSTARTS, Product_NAME, date_format(mycolumn, '%d %m %Y') as shortDate FROM {$table} WHERE upper(Product_NAME) LIKE '%' . $searchString . '%'' . $max); if($result === false) { echo mysql_error(); } $rows = array(); while($row = mysql_fetch_assoc($result)) { echo 'test while <p>'; $rows[] = $row; } return $rows; mysql_free_result($result); }
edit: I have printed out the mysql error of which there was none. However 8 ‘test whiles’ are printed out, from a database with over 100 records. The foreach loop is never entereded, and I am unsure why.
The problem (or at least one of them) is in the code that reads:
The $numRows variable is not a MySQL resultset, it is just a normal array returned by getRowsByProductSearch.
Change the code to read:
Then it should at least find some results for you.
Good luck, James
Hi there,
The next problem is with the line that reads:
It should be changed to read:
Would recommend adding the following lines to the start of you script at least while debugging:
As that would have thrown up a fatal error and saved you a whole lot of time.