使用PHP在数据库中输出数据时出现问题

时间:2011-11-09 13:12:01

标签: php database

请帮忙, 我在函数中调用数据库中的数据,并希望以表格格式将其显示给用户。我的目标是让我的数据库中的所有名称看起来像这样:

John   Peter   James    Steven
Jess   Syndey  Monique  Lynda

但我得到的是:

John   John   John   John
Peter  Peter  Peter  Peter
James  James  James  James
etc    etc    etc    etc

这是我的代码:

function public_navigation($sel_subject, $sel_page, $public = true) {
  $output = "<table border=\"1\">";
  $subject_set = get_all_subjects($public);
  $column_count = mysql_num_fields($subject_set);
  while ($subject = mysql_fetch_array($subject_set)) {
    $output .= "<tr>";
    for($column_num = 0; $column_num < $column_count; $column_num++) {
      $output .= "<td><a href=\"index.php?subj=" . urlencode($subject["id"]) . 
                 "\">{$subject["menu_name"]}</a></td>";
    }           
  }
  $output .= "</tr></table>";
  return $output;
}

3 个答案:

答案 0 :(得分:1)

尝试:

function public_navigation ($sel_subject, $sel_page, $public = true, $column_count = 4) {
  $output = '<table border="1">'; // Start table element
  $subject_set = get_all_subjects($public); // Get data
  for ($i = 1; $subject = mysql_fetch_array($subject_set); $i++) { // Loop data witha counter
    if ($i == 1) {
      // Start of a new row
      $output .= '<tr>';
    }
    // Cell for this record
    $output .= '<td><a href="index.php?subj='.htmlspecialchars(urlencode($subject["id"])).'">'.htmlspecialchars($subject["menu_name"]).'</a></td>';
    if ($i >= $column_count) {
      // End of this row
      $i = 0;
      $output .= '</tr>';
    }
  }
  if ($i > 1 && $i <= $column_count) {
    // Pad with an empty cell if needed
    $colspan = ($column_count + 1) - $i;
    $output .= "<td colspan=\"$colspan\" /></tr>";
  }
  $output .= '</table>'; // End of table
  return $output; // Return output
}

答案 1 :(得分:0)

遇到数据库查询问题时,应始终将查询与其一起发布。如果你伪装字段名称等,这很好,但如果没有更多细节,很难找出问题。

对于初学者来说,即使你不想这样,你似乎也在按名字排序。从查询中删除“ORDER BY [FIELDNAME]”应解决此问题。

其次,看起来你正在“分组”某些东西或“加入”某些内容而不过滤掉双重结果。至少,当你看到多次弹出相同的行时,这是最常见的问题。这可以通过在查询中使用“DISTINCT([FIELDNAME])”来修复。

而且,在旁注中,为什么使用get_all_subjects()和mysql_num_fields()而不仅仅是mysql_query()?事实上,我甚至不确定get_all_subjects()是什么,php.net没有它,它绝对不是一个标准的PHP函数...

function public_navigation($sel_subject, $sel_page, $public = true) {
  $RowCount = 1;
  $SQL = mysql_query("YOUR QUERY");
  while ($Row = mysql_fetch_array($SQL) {
    $RowHTML = '<td>[CONTENTS OF CELL]</td>'.(($RowCount % 4) ? '</tr><tr>' : '');
    $RowCount++;
    }

 return eregi_replace('<tr></tr>','','<table><tr>'.$output.'</tr></table>');
 }

答案 2 :(得分:0)

你有两个嵌套的循环,while总是读取一个新的行,而for的输出频率与行一样多。打开

<tr> 
之前的

然后关闭它。然后设置

$i=0;

之前。

同时这样做:

if ($i%5 == 0)
{
    echo "</tr><tr>";
}
$i++;

这应该这样做。