输出为<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>
。
答案 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);
然后,您希望在其自己的段落中同时包含col1
和col2
。这已经是每个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);