从PHP格式输出MySQL结果的正确方法是什么?<table> </table>

时间:2011-12-31 19:11:16

标签: php mysql

输出为<table>格式时,如何显示MySQL结果?我觉得我自己的代码可以使用一些编辑。我是否正确地做到了这一点?

编辑:我的代码显然是错误的/丑陋的。在使用普通PHP代替Smarty时,最好的方法是什么?

$items_per_row = 3; // How many <td> I want to add for every <tr>

// Query the MySQL db
$sthandler = $dbhandler->prepare("SELECT col1, col2 FROM sampletable");
$sthandler->execute();

// Save each row to array
$allitems = array();
while($row = $sthandler->fetch(PDO::FETCH_ASSOC)){
    $allitems[] = $row;
}

$markup = '';
foreach($allitems as $key=>$val){
    $col1 = $allitems[$key]['col1'];
    $col2 = $allitems[$key]['col2'];

    // START THE MARKUP HERE
    $markup .= $key % $items_per_row == 0 ? '<tr>' : '';
    $markup .= <<<EOD
    <td>
        <p>$col1</p>
        <p>$col2</p>
    </td>
EOD;
    $markup .= ($key + 1) % $items_per_row == 0 ? '</tr>' : '';
}

然后我可以<table><?php echo $markup; ?></table>

3 个答案:

答案 0 :(得分:3)

将您的业务逻辑与演示代码分开!!!

我使用模板解析器,将HTML与PHP分开。例如,使用Smarty,我会使用类似的内容:

// Sample data
$tableData = array(
    array('col1', 'col2'),
    array('col1', 'col2'),
    array('col1', 'col2'),
    array('col1', 'col2'),
);

// Create the view
$tpl = new Smarty();
$tpl -> assign('table', $tableData);
$tpl -> display('myPage.tpl');

然后在模板文件中我构建表:

<table>
{foreach from=$table item=row}
    <tr>
        <td>{$row.0|escape}</td>
        <td>{$row.1|escape}</td>
    </tr>
{/foreach}
</table>

这将您的HTML与PHP代码分开,从而可以更轻松地添加新功能,并使代码更具可读性。

修改
哎呀,你真的要改变你的问题吗?

好的,请改用此模板:

<table>
<?php foreach ($tableData as $row) { ?>
    <tr>
        <td><?php echo htmlspecialchars($row[0]); ?></td>
        <td><?php echo htmlspecialchars($row[1]); ?></td>
    </tr>
<?php } ?>
</table>

用法:

// Sample data
$tableData = array(
    array('col1', 'col2'),
    array('col1', 'col2'),
    array('col1', 'col2'),
    array('col1', 'col2'),
);

// Create the view
include('myPage.php');

当然,这个解决方案比使用合适的模板引擎要脏得多。

答案 1 :(得分:1)

这是将数组显示为HTML模板的基本功能。

您可以通过添加可选参数来改进它,以便控制是否应将htmlspecialchars()应用于值,将某些样式添加到偶数/奇数行,告诉echo或{{1 HTML结果等

return

正如汤姆所建议的那样,你可以使用像Smarty这样的模板引擎(不过有利有弊)。在这种情况下,您可以将function formatToTable($array) { $str = "<table>\n"; foreach($array as $row) { $str .= "<tr>\n"; foreach($row as $value) $str .= "<td>".htmlspecialchars($value)."</td>\n"; $str .= "</tr>\n"; } $str .= "</table>\n"; echo $str; } 注册为新的Smarty函数:

formatToTable()

答案 2 :(得分:0)

你的代码可以稍微简化,对,但这是正常的。已经有一些提示可以更轻松地从数据库中获取数据:

// Query the MySQL db
$sthandler = $dbhandler->prepare("SELECT col1, col2 FROM sampletable");
$sthandler->execute();
$allitems = $sthandler->fetchAll(PDO::FETCH_ASSOC);

然后,您希望在其自己的段落中同时包含col1col2。这已经是每个sql结果行,所以这很好。

然后,您希望输出中每个表行有三个对。 PHP中有一个函数可以为您完成此任务:

array_chunk($allitems, $items_per_row, 1);

这将导致您正在寻找的表格行。由于这可能是空的但仍然代表一个表,我再次将它包装到另一个数组中:

### PROCESS DATA (here obviously for viewing)

$allitems = array(array_chunk($allitems, $items_per_row, 1));

所以现在数据输出的结构正确。但是对于这个数据的表示,每个元素需要在它周围获得一个HTML标记 - 递归。从外部到内部,标签是:

### RENDERER
$tags = array('table', 'tr', 'td', 'p');    

剩下的是在每个成员周围添加这些标签的装饰功能:

$decorate = function($array, $tags, $f) {
    $tag = array_shift($tags);
    foreach($array as $element)
        echo "<$tag>", 
            is_array($element)
                ? $f($element, $tags, $f)
                : htmlspecialchars($element),
            "</$tag>";
};

它会将标签递归地包装到数组的适当级别,这意味着如果内部有更多项目,函数会调用另一个函数(参见is_array测试)。

现在一切都准备就绪了,数组得到了标签,数组的内部元素将使用相同的函数,所以它也作为参数传递:

$decorate($allitems, $tags, $decorate);

完成。 Demo。示例代码一目了然:

<?php

### CONFIGURATION

$items_per_row = 3; // How many <td> I want to add for every <tr>

### GET DATA FROM STORE

IF (0):
// Query the MySQL db
$sthandler = $dbhandler->prepare("SELECT col1, col2 FROM sampletable");
$sthandler->execute();
$allitems = $sthandler->fetchAll(PDO::FETCH_ASSOC);
ELSE:
// Static test data
$allitems = array(
    array('col1', 'col2'),
    array('col1', 'col2'),
    array('col1', 'col2'),
    array('col1', 'col2'),
    array('col1', 'col2'),
    array('col1', 'col2'),
);
ENDIF;

### PROCESS DATA (here obviously for viewing)

$allitems = array(array_chunk($allitems, $items_per_row, 1));

### RENDERER
$tags = array('table', 'tr', 'td', 'p');
$decorate = function($array, $tags, $f) {
    $tag = array_shift($tags);
    foreach($array as $element)
        echo "<$tag>", 
            is_array($element)
                ? $f($element, $tags, $f)
                : htmlspecialchars($element),
            "</$tag>";
};
$decorate($allitems, $tags, $decorate);