Generic Table Display

strict warning: Only variables should be passed by reference in /home/newich/public_html/modules/book/book.module on line 560.

I found a snippet (http://drupal.org/node/45361) that displayed all the data in a database table and I liked it, but it was "dirty" code and needed to be fixed up. Meanwhile there was another post (http://drupal.org/node/204969) about creating a sortable table of data. I thought it might be nice to merge these two ideas.

I really like what I came up with. As a matter of fact, I liked it so much I added it to the Site Documentation module, so anyone can have it without doing any coding or even snippet pasting.

<?php
 
echo show_table('blocks', 50);

function
show_table($table = null, $rows_per_page = 20) {
  if (!
$table || !db_table_exists($table)) {
     
drupal_set_message(t('You must supply a valid database table name.'), 'error');
       
drupal_access_denied();
    }

 
// We get the first (or only) part of the Primary key to be added to the sort sequence.
 
$result = db_query("SHOW INDEX FROM {$table}");
 
$x = db_fetch_array($result);
  if (
$x === false) {
   
drupal_set_message(t("The '@table' table has no index defined. This is probably normal.", array('@table' => $table)), 'notice');
   
$first_key = null;
  }
  else {
   
$first_key = $x['Column_name'];
  }

 
drupal_set_title(t('@table Table Contents', array('@table' => ucwords($table))));
 
$output = '<p>'. t('Click on a column title to sort by that column.') .'</p><br/>';
 
$rows = array();

 
// Now we get the column names from the table and build the header.
 
$header = array();
 
$result = db_query("SHOW COLUMNS FROM {$table}");

  while (
$col_desc = db_fetch_array($result)) {
   
$header[] = array(
     
'data' => ucwords(str_replace('_', ' ', $col_desc['Field'])),
     
'field' => $col_desc['Field'],
      );
  }
 
 
// Get the data rows from the table.
 
$select = "SELECT * FROM {$table}";
 
// Set it up so that the user can sort on any column, but the primary key will always be the last value to sort on.
 
$select .= tablesort_sql($header) . ($first_key ? (', '. $first_key .' ASC') : null);
 
// Do the query so that we can page the data.
 
$result = pager_query($select, $rows_per_page);

  while (
$row = db_fetch_array($result)) {
   
$line = array();
    foreach (
$row as $key => $value) {
     
// We use check_markup to apply our filters.
     
$line[] = check_markup($value, FILTER_FORMAT_DEFAULT, true);
    }
   
$rows[] = $line;
  }

 
// Build the displayable table.
 
$output .= theme('table', $header, $rows);
 
$output .= theme('pager', $rows_per_page);
  return
$output;
}
?>