如何使用PHP显示行范围内的mysql数据?
我从MySQL中获得的数据显示了客户获得的所有组织,以及每个组织中员工的所有详细信息。我只想列出每个组织的名称一次,即在单个单元格行范围内,并对照该名称列出该组织中的所有员工,如:如何使用PHP显示行范围内的mysql数据?,php,mysql,html,Php,Mysql,Html,我从MySQL中获得的数据显示了客户获得的所有组织,以及每个组织中员工的所有详细信息。我只想列出每个组织的名称一次,即在单个单元格行范围内,并对照该名称列出该组织中的所有员工,如: Org1 Emp1 Name, Emp1 Phone, Emp1 Address Emp2 Name, Emp2 Phone, Emp2 Address Org2 Emp1 Name, Emp1 Phone, Emp1 Address Emp2 Name, Em
Org1 Emp1 Name, Emp1 Phone, Emp1 Address
Emp2 Name, Emp2 Phone, Emp2 Address
Org2 Emp1 Name, Emp1 Phone, Emp1 Address
Emp2 Name, Emp2 Phone, Emp2 Address
我如何显示这些数据,因为每个组织的雇员人数在advanced中是未知的,所以我不知道rowspan的设置值。类似地,我如何为其他组织开始争吵?我必须写两个查询吗
非常感谢。经典
解决方法:仅在与上一个名称不同时显示名称。你甚至不必为你的空牢房的行数操心
$currentOrg = '';
while ($row = mysql_fetch_object($query)) {
if ($row->org != $currentOrg) {
echo "$row->org".
}
$currentorg = $row->org;
}
不是最美的,但很简单。经典
// Get the data
$data = mysql_query('SELECT org, emp_name, emp_phone, emp_address FROM x');
// Store it all in a 2D array, keyed by org
$rows = array();
while ($row = mysql_fetch_assoc($data))
{
// Initialise each org to an empty array (not really needed in PHP but I prefer it)
if (empty($rows[$row['org']]))
$rows[$row['org']] = array();
$rows[$row['org']][] = $row;
}
// Print it out
foreach ($rows as $org => $employees)
{
print('<tr><td rowspan="' . count($employees) . '">' . htmlentities($org) . '</td>');
foreach ($employees as $i => $employee)
{
// If $i == 0, we've already printed the <tr> before the loop
if ($i)
print('<tr>');
print('<td>......</td></tr>');
}
}
解决方法:仅在与上一个名称不同时显示名称。你甚至不必为你的空牢房的行数操心
$currentOrg = '';
while ($row = mysql_fetch_object($query)) {
if ($row->org != $currentOrg) {
echo "$row->org".
}
$currentorg = $row->org;
}
不是最漂亮的,但很简单。要获得正确的行间距,你需要事先知道数字
// Get the data
$data = mysql_query('SELECT org, emp_name, emp_phone, emp_address FROM x');
// Store it all in a 2D array, keyed by org
$rows = array();
while ($row = mysql_fetch_assoc($data))
{
// Initialise each org to an empty array (not really needed in PHP but I prefer it)
if (empty($rows[$row['org']]))
$rows[$row['org']] = array();
$rows[$row['org']][] = $row;
}
// Print it out
foreach ($rows as $org => $employees)
{
print('<tr><td rowspan="' . count($employees) . '">' . htmlentities($org) . '</td>');
foreach ($employees as $i => $employee)
{
// If $i == 0, we've already printed the <tr> before the loop
if ($i)
print('<tr>');
print('<td>......</td></tr>');
}
}
这就给你留下了:
迭代查询结果两次,计算值直到它们发生变化
向数据库服务器询问计数
就我个人而言,我会选择第二种方法。DB服务器在计算行数方面效率很高,当有许多行要显示时,这可能会快得多。要获得正确的行跨度,您需要提前知道数字
这就给你留下了:
迭代查询结果两次,计算值直到它们发生变化
向数据库服务器询问计数
就我个人而言,我会选择第二种方法。DB服务器在计算行数方面效率很高,当有许多行要显示时,这可能会快得多。对每个组织进行一次查询,再加上一次查询以确定大概有多少个组织,可能会更容易,但效率较低 一个更好的方法是预先循环数组。例如:
$sql = $mysqli->query('SELECT * FROM `organisation_members` ORDER BY `organisation` DESC');
if (!$sql || $sql->num_rows) {
// No data
} else {
$data = array();
while ($row = $sql->fetch_assoc()) {}
if (!array_key_exists($row['organisation'], $data)) {
$data[$row['organisation']] = array();
}
$data[$row['organisation']][]['name'] = $row['name'];
// ...
}
$sql->close();
echo '<table>';
foreach ($data as $org => $people) {
$people_in_org = count($data[$org]) - 1;
$counter = 0;
echo '<tr>';
echo '<td rowspan="' . $people_in_org + 1 . '">' . $org . '</td>';
while ($counter < $people_in_org) {
if (counter > 0) {
echo '<tr>';
}
echo '<td>' . $people[$counter]['name'] . '</td>';
// etc
echo '</tr>';
}
}
echo '</table>';
}
对每个组织进行一次查询,再加上一次查询以确定大概有多少个组织,可能会更容易,但效率较低 一个更好的方法是预先循环数组。例如:
$sql = $mysqli->query('SELECT * FROM `organisation_members` ORDER BY `organisation` DESC');
if (!$sql || $sql->num_rows) {
// No data
} else {
$data = array();
while ($row = $sql->fetch_assoc()) {}
if (!array_key_exists($row['organisation'], $data)) {
$data[$row['organisation']] = array();
}
$data[$row['organisation']][]['name'] = $row['name'];
// ...
}
$sql->close();
echo '<table>';
foreach ($data as $org => $people) {
$people_in_org = count($data[$org]) - 1;
$counter = 0;
echo '<tr>';
echo '<td rowspan="' . $people_in_org + 1 . '">' . $org . '</td>';
while ($counter < $people_in_org) {
if (counter > 0) {
echo '<tr>';
}
echo '<td>' . $people[$counter]['name'] . '</td>';
// etc
echo '</tr>';
}
}
echo '</table>';
}
为了节省内存,您可以在org缓冲行时迭代结果集,当org更改时,打印当前批并开始缓冲下一批。为了节省内存,您可以在org缓冲行时迭代结果集,当org更改时,打印当前批并开始缓冲下一批。它不会帮助您处理行范围,但会查看修改器。它以与您所需格式相似的格式返回数据。它不会帮助您处理行范围,但会查看修改器。它以与您想要的格式相似的格式返回数据。如何使用pear的HTML_表包,如下面的示例所示,通过我也喜欢Jrgns的汇总版本
<?php
require_once "HTML/Table.php";
$table = new HTML_Table(array('border'=>'1'));
$bo=array(
array('6','a2','a3','a4'),
array('1','b2','b3','b4'),
array('1','c2','c3','c4') ,
array('2','c2','c3','c4') ,
array('2','c2','c3','c4') ,
array('4','c2','c3','c4') );
foreach ($bo as $r => $borow)
$table->addRow($borow);
$rsFirst=0;
$rsLen=0;
foreach ($bo as $r => $borow) {
if ($r!=0 and $borow[0]!=$prevrow[0] ) {
//jump in values
$table->setCellAttributes ( $rsFirst,0, array('rowspan'=>$rsLen));
$rsFirst=$r;
$rsLen=0;
}
$prevrow=$borow;
$rsLen++;
if ($r==sizeof($bo) - 1) {
$table->setCellAttributes ( $rsFirst,0, array('rowspan'=>$rsLen));
}
}
echo $table->toHTML();
?>
servas,boerl如何使用pear的HTML_表包,如下面的示例所示,通过我也喜欢Jrgns的汇总版本
<?php
require_once "HTML/Table.php";
$table = new HTML_Table(array('border'=>'1'));
$bo=array(
array('6','a2','a3','a4'),
array('1','b2','b3','b4'),
array('1','c2','c3','c4') ,
array('2','c2','c3','c4') ,
array('2','c2','c3','c4') ,
array('4','c2','c3','c4') );
foreach ($bo as $r => $borow)
$table->addRow($borow);
$rsFirst=0;
$rsLen=0;
foreach ($bo as $r => $borow) {
if ($r!=0 and $borow[0]!=$prevrow[0] ) {
//jump in values
$table->setCellAttributes ( $rsFirst,0, array('rowspan'=>$rsLen));
$rsFirst=$r;
$rsLen=0;
}
$prevrow=$borow;
$rsLen++;
if ($r==sizeof($bo) - 1) {
$table->setCellAttributes ( $rsFirst,0, array('rowspan'=>$rsLen));
}
}
echo $table->toHTML();
?>
servas,boerl如果您使用的是INNODB引擎,我不推荐第二种方法。如果您使用的是INNODB引擎,我不推荐第二种方法。我投票支持您的答案,因为到目前为止,您是唯一一个使用htmlentities逃避输出的人。不过,我可能会在这里使用sprintf而不是串联。我投票支持你的答案,因为到目前为止,我是唯一一个使用htmlentities来逃避输出的人。不过,我可能会在这里使用sprintf而不是连接。