Php 从SQL查询生成HTML表

Php 从SQL查询生成HTML表,php,mysql,Php,Mysql,从上图中,我试图用PHP动态生成这个表。下面是我在mysql数据库中的表 下面是我用来从数据库中提取数据的SQL SELECT DISTINCT execution_date,class_name,method_name,status FROM test_cases INNER JOIN test_case_executions ON test_cases.id=test_case_executions.test_case_id WHERE version='$platform' AND e

从上图中,我试图用PHP动态生成这个表。下面是我在mysql数据库中的表

下面是我用来从数据库中提取数据的SQL

SELECT DISTINCT execution_date,class_name,method_name,status FROM test_cases INNER JOIN test_case_executions ON test_cases.id=test_case_executions.test_case_id WHERE version='$platform' AND execution_date >= ( CURDATE() - INTERVAL 2 DAY ) ORDER BY execution_date DESC;

这将返回所需的数据,但我正在努力找出如何构建表。我在考虑使用数组,当我有了所需的所有数据后,再回显表代码。我需要注意的是,考试并不总是保证考试有三个日期。提前感谢您的帮助。

您必须对数据集进行多次传递才能生成该输出。也就是说,您将有4行表示所有状态值,并且您必须在其上迭代几次以提取日期列标题和“类”行标识符

您可以在PHP中执行此操作。因此,在第一次传球时,你要抓取头球的日期。并且还存储第一列的“类”

在第二次循环中,您再次迭代数据,但这次它被包装在一个循环中,因此您可以提取该单元格的记录

以下是一些psuedo代码:

$records = $db->query("select * from your_query here...");

$dates = [];
$classes = [];

// first pass is to pull out the distinct dates & classes which represent our bounds
foreach($records AS $record) {
   $dates[] = $record['execution_date'];
   $classes[] = $record['class_name'];
}

// distinct the date set and sort them from lowest to highest
$dates = array_unique($dates);
$dates = sort($dates);
$classes = array_unique($classes);

// display the date row
echo "<tr><td>&nbsp;</td>"
foreach($dates AS $date) {
  echo $date;
}
echo "</tr>";

// start displaying each class+date pair

foreach($classes AS $klass) {
  echo "<tr>";
  echo "<td>" . $klass . "</td>";
  // display each date record for this class
  foreach($dates AS $date) {
    $class_and_date_record = filter($records, $klass, $date);
    if($class_and_date_record) {
      echo "<td>" . $class_and_date_record['status'] . "</td>";
    }
  }
  echo "</tr>";
}


function filter($records, $klass, $date) {
  foreach($records AS $row) {
    if($row['class_name'] == $klass && $row['execution_date'] == $date) {
      return $row;
    }
  }
  return NULL;
}
$records=$db->query(“从您的_查询中选择*);
$dates=[];
$classes=[];
//第一步是提取代表我们边界的不同日期和类
foreach($记录为$记录){
$dates[]=$record['execution_date'];
$classes[]=$record['class_name'];
}
//区分日期集,并将其从最低到最高排序
$dates=数组_唯一($dates);
$dates=排序($dates);
$classes=array_unique($classes);
//显示日期行
回声“”
foreach($日期作为$日期){
echo$日期;
}
回声“;
//开始显示每个类+日期对
foreach($klass类){
回声“;
回声“$klass.”;
//显示该类的每个日期记录
foreach($日期作为$日期){
$class_和_date_record=filter($records,$klass,$date);
if($class_和_date_记录){
回显“$class_和_date_记录['status'”;
}
}
回声“;
}
函数过滤器($records,$klass,$date){
foreach($记录为$行){
如果($row['class\u name']=$klass&$row['execution\u date']=$date){
返回$row;
}
}
返回NULL;
}

如果我正确理解您的问题,您只希望在“执行日期”中有值时将数据输出到表中

将检查返回的行的执行日期是否有值。

然后,您可以使用相同的
$result[“”]
格式打印其余项目

请放置一个示例输出数组。如果您的路径正确,您应该将数据存储到数组/对象中,然后在数据周围回显HTML代码。您还可以考虑在实际的fetch循环中执行此操作。现在,去试试:)是的,先试一试,如果失败了,我们可以进一步帮助你。所以这不是一个让人们为你做这件事的地方。你得到这个:)好的,我有一个问题,在过滤器功能。records变量似乎是select语句的数组。在filter函数中,它没有在foreach语句中执行任何操作,因此它似乎没有查询records变量中的PDO语句。我检查了它是一个select语句。Hmmm@jrock2004我提供的是90%的PHP和10%的伪代码,有语法问题等等。另外,我不知道您的SQL层是什么,所以我的
db->query
只是您需要做什么的一般概念。考虑整个事情的伪代码,并提出它提出的想法。再次谢谢你,我知道了。我需要在执行该操作的sql变量中重新执行该语句。谢谢
$query = "SELECT DISTINCT execution_date,class_name,method_name,status FROM test_cases INNER JOIN test_case_executions ON test_cases.id=test_case_executions.test_case_id WHERE version='$platform' AND execution_date >= ( CURDATE() - INTERVAL 2 DAY ) ORDER BY execution_date DESC;";

    if ($result = $mysqli->query($query)) {

        /* fetch associative array */
        while ($row = $result->fetch_assoc()) {
            echo '<table>';
            if(isset($result["execution_date") && !empty($result["execution_date"])){
                 echo '<tr><td>' . $result["execution_date"] . '</td></tr>';
                 ...
            }
            echo '</table>';
        }

        /* free result set */
        $result->free();
    }
 if(isset($result["execution_date") && !empty($result["execution_date"])){