Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从PHP将MySQL结果输出为格式的正确方法是什么?_Php_Mysql - Fatal编程技术网

从PHP将MySQL结果输出为格式的正确方法是什么?

从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

当输出为格式时,如何显示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>' : '';
}
然后我就可以。

将您的业务逻辑与表示代码分离

我使用模板解析器,将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);