使用PHP在HTML表中显示MySQL结果

时间:2013-01-20 22:43:56

标签: php mysqli

CodingBiz更新:

我把它放在我的代码中:

for($i=1;$i<=$numRows;$i++) {
    $output .= '<tr>';
    $row = $this->fetchAssoc($result);
    $colRow = $this->fetchAssoc($colResult);
    foreach($colRow as $colName) {
        $output .= "<td>".$row[$colName]."</td>";
    }
    $output .= '</tr>';
}

取代

for($i=1;$i<=$numRows;$i++) {
    $output .= '<tr>';
    $row = $this->fetchAssoc($result);
    for($j=1;$j<=$colNumRows;$j++) {
        $colRow = $this->fetchAssoc($colResult);
        $output .= "<td>".$row[$colRow["COLUMN_NAME"]]."</td>";
    }
    $output .= '</tr>';
}

这有什么问题吗?

原帖:

我正在PHP类中编写一个函数来在表中显示查询结果。我自己并没有构建任何表,我希望使用PHP完成所有事情。到目前为止,这是我的代码:

function allResults($table,$cols) {
    if(isset($cols)) {
        $query = "SELECT $cols FROM $table";
    }
    else {
        $query = "SELECT * FROM $table";
    }
    $result = $this->query($query);
    $numRows =  $this->numRows($result);
    $colQuery ="SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA='shareride'  AND TABLE_NAME='$table'";
    $colResult = $this->query($colQuery);
    $colNumRows = $this->numRows($colResult);

    $output = '<table class="allResults">';
    $output .= '<tr>';
    for($i=1;$i<=$colNumRows;$i++) {
        $colRow = $this->fetchAssoc($colResult);
        $output .= "<td>".$colRow["COLUMN_NAME"]."</td>";
    }
    $output .= '</tr>';
    for($i=1;$i<=$numRows;$i++) {
        $output .= '<tr>';
        $row = $this->fetchAssoc($result);
        for($j=1;$j<=$colNumRows;$j++) {
            $colRow = $this->fetchAssoc($colResult);
            $output .= "<td>".$row[$colRow["COLUMN_NAME"]]."</td>";
        }
        $output .= '</tr>';
    }
    $output .= '</table>';
    return $output;
}

如果不清楚,query引用mysqli_querynumRows引用mysqli_num_rowsfetchAssoc引用mysqli_fetch_assoc。数据库名称为“shareride。”

我知道我错过了这一行:

$output .= "<td>".$row[$colRow["COLUMN_NAME"]]."</td>";

但我只是不知道它是什么。现在,我正确显示所有表列标题,并获得正确数量的内容行,但我无法使用数据库中的实际数据填充这些行。

我错过了什么?任何帮助都会非常赞赏!

3 个答案:

答案 0 :(得分:4)

从同一结果集中获取数据和列名

  <?php
  $i = 0;
  $colNames = array();
  $data = array();
  while($row = ***_fetch_assoc($res)) //where $res is from the main query result not schema information
  {
     //get the column names into an array $colNames
     if($i == 0) //make sure this is done once
     {
        foreach($row as $colname => $val)
           $colNames[] = $colname;
     }

     //get the data into an array
     $data[] = $row;

     $i++;
  }

 ?>

更新:@YourCommonSense建议更换上面的代码,它工作简单,更短 - 通过我喜欢的方式获取列名称/阵列键的方式

  $data = array();
  while($row = mysql_fetch_assoc($res))
  {
     $data[] = $row;
  }

  $colNames = array_keys(reset($data))

继续以前:打印表格

 <table border="1">
 <tr>
    <?php
       //print the header
       foreach($colNames as $colName)
       {
          echo "<th>$colName</th>";
       }
    ?>
 </tr>

    <?php
       //print the rows
       foreach($data as $row)
       {
          echo "<tr>";
          foreach($colNames as $colName)
          {
             echo "<td>".$row[$colName]."</td>";
          }
          echo "</tr>";
       }
    ?>
 </table>

测试结果

enter image description here

您可以看到我如何将数据检索与表生成分开。它们现在彼此依赖,您可以通过使用静态数据填充数组来测试没有数据库的表生成

您也可以将它们分成不同的功能。

答案 1 :(得分:3)

  1. 从不将数据库处理代码与HTML输出代码混合在一起。这些是两个完全不同的事情。使allResults函数仅返回包含数据的数组,然后您可以使用其他函数以奇特的方式打印(并且在数据库处理程序类中)。
  2. 您不需要信息模式来获取列名称 - 您已经在返回的数组键中拥有它。
  3. 您也不需要numRows - 使用while()和foreach()
  4. 从不直接在查询中插入任何内容,就像使用$cols一样 - 最终会导致错误和注入。
  5. 这样的函数,在不接受查询的某些参数的情况下,完全没有意义,特别是在从mysql迁移到mysqli的上下文中 - 你要用它作为旧学校的mysql查询插入变量,而不是占位符。因此,它使迁移变得毫无用处。
  6. 要知道“代码有什么问题”,必须运行,而不是观察。运行并调试代码,输出关键变量并确保可以看到发生的错误。

答案 2 :(得分:0)

我尝试用以下内容替换数据部分:

while($row = $this->fetchAssoc($colResult))
{
  echo "<tr>";
  foreach($row as $value)
  {
    echo sprintf("<td>%s</td>",$value)
  }
  echo "</tr>";
}

我知道这不是一个正确的答案,但是很难看到代码imho