3

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;
}

不清楚时,querymysqli_querynumRowsmysqli_num_rowsfetchAssocmysqli_fetch_assoc。数据库名称是“shareride”。

我知道我在这一行中遗漏了一些东西:

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

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

我错过了什么?任何帮助将不胜感激!

4

3 回答 3

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>

测试结果

在此处输入图像描述

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

你也可以把它们做成单独的函数。

于 2013-01-20T23:04:01.867 回答
4
  1. 切勿将您的数据库处理代码与 HTML 输出代码混用。这是两个完全不同的问题。让你的 allResults 函数只返回带有数据的数组,然后你可以让另一个函数以奇特的方式打印(而不是在数据库处理程序类中)。
  2. 您不需要信息架构来获取列名 - 您已经在返回的数组键中拥有它。
  3. 您也不需要 numRows - 使用 while() 和 foreach()
  4. 永远不要像您那样直接将任何内容插入查询$cols- 最终会导致错误和注入。
  5. 这样的函数,不接受查询的某些参数,绝对没有意义,特别是在从 mysql 迁移到 mysqli 的上下文中 - 你将使用它作为一个老式的 mysql 查询插入变量,而不是占位符。因此,它使迁移完全无用。
  6. 要知道“代码有什么问题”,必须运行它,而不是观看。运行和调试您的代码,输出关键变量并确保您可以看到发生的错误。
于 2013-01-21T05:24:18.150 回答
0

我会尝试用类似的东西替换数据部分:

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

我知道这不是一个正确的答案,但真的很难阅读该代码恕我直言

于 2013-01-20T23:02:35.250 回答