从PHP将MySQL结果输出为格式的正确方法是什么?
当输出为格式时,如何显示MySQL结果?我觉得我自己的代码可以使用一些编辑。我做得对吗 编辑:我的代码明显错误/难看。当只使用普通PHP而不是Smarty时,最好的方法是什么从PHP将MySQL结果输出为格式的正确方法是什么?,php,mysql,Php,Mysql,当输出为格式时,如何显示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 s
$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>' : '';
}
然后我就可以。将您的业务逻辑与表示代码分离
我使用模板解析器,将HTML与PHP分离。例如,对于,我将使用如下内容:
// 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模板的基本功能 您可以通过添加可选参数、允许控制是否应将htmlspecialchars应用于值、为偶数/奇数行添加一些样式、告诉回显或返回HTML结果等方便地改进它
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;
}
您的代码可以稍微简化一点,对吧,但这是正常的。已经有一些提示表明您可以更轻松地从数据库中获取数据:
// 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>";
};
完成。示例代码一览:
<?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);
/me通过codeFyi推送一个20000000记录表,您可以摆脱第一个循环,只需执行$allitems=$sthandler->fetchAllPDO::FETCH_ASSOC;您将花费数周时间学习最新的流行框架和模板系统,包括三次介入升级和错误修复,以及在ORM中穿鞋,在这一点上,通过将1/2打的对象链接在一起,并在附加库中进行分解,您有了一个基本的工作形式,但您不确定为什么。然后再花两周时间与framework/ORM/js libs进行斗争,以获得原始安装程序尚未实现的功能,并且可以正常工作。此时,尽管客户改变了主意,决定它是一个多页面的表单集,所有的表单都是ajax驱动的!关于PHP是否是自己的模板系统的宗教讨厌鬼之战!哦,人性@rdlowrey好吧,因为Smarty只是将TPL转换为PHP,所以我认为您是正确的。但是,通过使用TPL,您可以真正将视图逻辑与业务逻辑分离。我完全同意您的看法,我为什么要输出空表?@hakre您在哪里看到空表?我不想冒犯您,但对于一个非常简单的问题来说,这似乎是我见过的最糟糕的解决方案。这可能是因为Smarty无法轻松处理递归结构,即使它以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>";
};
$decorate($allitems, $tags, $decorate);
<?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);