0

正如标题所述,我的目标是使用 MySQL 数据库中的数据生成一个 HTML 表。

我使用的一般方法是合理的,因为我手动编写了一系列单元格,但我正在尝试将其缩放以包含大量字段,因此我正在尝试使用 PHP 和 foreach 循环为单元格编写 HTML与数组。我已经写出了我工作的背景和步骤,既可以为我的问题提供背景,也可以为处于类似情况的人们提供一般帮助。但是,我知道我遇到的问题特别在于代码的一部分 - 如果您想直接跳到它,请在下面清楚地指出。

第 1 步为我希望字段具有的标题和 MySQL 数据库中的列名定义数组:

$titles  = array('Name', 'Age', 'Height', 'Weight');
$headers = array('q1', 'q2', 'q3', 'q4');

第二步:连接数据库(之前定义的$username和$password):

try {
    $pdo = new PDO('mysql:host=localhost; dbname=db01', $username, $password);
    $pdo->exec("SET CHARACTER SET utf8");

第 3 步:通过一些连接创建我的 SQL 语句,并获取 $result:

$sql ="SELECT";

foreach(array_combine($headers, $titles) as $header => $title) {
    $sql .= "`$header` AS `$title`,";
}

$sql .= "`q5` AS `Eye Color`";
$sql .= "FROM samdata.CO_data";


$result = $pdo->query($sql);

第 4 步:通过连接静态 HTML 和上述 SQL 查询的结果来创建 $html_table

if($result !== false) {
    $html_table = '<table><tr>';
    foreach($titles as $title) {
        $html_table .= "<th> $title </th>";                          
    }

    $html_table .='</tr> <tr>';


//*********PROBLEM SECTION BELOW **************************
    foreach(array_combine($result, $titles) as $row => $title) {                            
        $html_table .= "<td>' .$row\['$title'\]. '</td>";
    }
}
//*********PROBLEM SECTION ABOVE **************************

$html_table .= '</tr> </table>';
$conn = null;   

echo $html_table;       
}

我知道问题出在指示的部分,因为我已经测试了所有其他部分,并且如果我手动写出而不是组合数组/ foreach 循环,例如:

foreach($result as $row) {
             $html_table .= '
             <tr>
                <td>' .$row['Names']. '</td>
                <td>' .$row['Age']. '</td>
                <td>' .$row['Height']. '</td>
            </tr>';
}

代替循环,它可以正常工作并显示这些标题的每个结果的数据,问题是我有数百个并且想要更优雅(和懒惰)而不是一个一个地写出来!

我哪里错了?非常感谢您的帮助。

4

3 回答 3

4

看起来您的问题行中有一些不匹配的引号:

$html_table .= "<td>' .$row\['$title'\]. '</td>";

您以双引号开头。在双引号内,单引号不能用于终止字符串。相反,双引号只能用双引号终止。单引号也是如此。意思是,这可以通过以下两种方式之一解决:

$html_table .= "<td>" . $row[$title] . "</td>";

或者:

$html_table .= '<td>' . $row[$title] . '</td>';

还要注意我是如何从 around 中删除引号的$title。它们是不必要的,并且会使 PHP 进行比必要更多的处理。

注意引号现在是如何匹配的。确保在编辑器中编写代码时,查看语法是如何突出显示的。您应该看到,在您的原始代码中,变量和索引都在字符串中,因为它们都是相同的颜色。

如果您依赖双引号字符串(如echo "Hello $name";)中的变量扩展,请知道访问数组的字符串键将不起作用,除非它们用括号括起来,如下所示:

echo "Hello {$person['FirstName']}";

但是,您可以像这样使用数字索引:

echo "Hello $people[0]";

因此,对于您的代码,如果您不想结束字符串并连接值然后再次开始字符串,则需要执行此操作:

$html_table .= "<td>{$row[$title]}</td>";

但是,我发现这种语法很难看,它使 PHP 进行额外的处理以找到需要扩展变量的位置。恕我直言,使用连接来避免所有这些问题。

于 2012-10-21T00:07:38.977 回答
3

你没有正确循环。$result 是您必须获取的 PDOStatement。尝试

foreach( $result->fetchAll() as $row ) {
    $html_table .= '<tr>' . "\n";
    foreach( $row as $col ) {
        $html_table .= '<td>' .$col. '</td>';
    }
    $html_table .= '</tr>' . "\n";
}
于 2012-10-21T00:14:27.903 回答
-1

这个解决方案似乎在我的项目中工作,并允许我从查询中获取列并将记录放入 html 表中,希望它也可以帮助其他人:

$conn = (...)

$sqlselect = "SELECT name, last, othercol FROM persontable";

// I prepare and execute my query
$stmt = $conn->prepare($sqlselect);
$stmt->execute();

//get full recordset: header and records
$fullrs = $stmt->fetchAll(PDO::FETCH_ASSOC); 

//get the first row (column headers) but do not go to next record
$colheaders = current($fullrs)

out = ""; //variable that will hold my table

out .= <table>;

//get my columns headers in the table          
foreach($colheaders as $key=>$val) 
{
    $out .= '<th>'.$key.'</th>';
}

//get my records in the table
foreach($fullrs as $row) 
{
   $out .= "<tr>"; 
      $out .= '<td>'.$row['name'].'</td>';
      $out .= '<td>'.$row['last'].'</td>';
      $out .= '<td>'.$row['othercol'].'</td>';
   $out .= "</tr>";
}

out .= </table>;  

//spit my table out
echo $out;
于 2015-07-13T04:22:33.483 回答