【问题标题】:Possible to reduce complexity of fetching and displaying data?可以降低获取和显示数据的复杂性吗?
【发布时间】:2017-10-19 02:13:28
【问题描述】:

我对以下代码所做的是通过 PHP 从表中获取数据,以便在网站上显示数据。

$stri = "SELECT a, b, c, d, e, f FROM table";
$stat = $conn->prepare($stri);

if ($stat->execute()) {
  while ($resu = $stat->fetch(PDO::FETCH_ASSOC)) {
    foreach ($resu as $key=>$value) {
      echo $value . "<br>";
    }
    echo "<br><br>";
  }
}

但是,使用两个循环似乎是多余的。难道没有更有效的方法来完成同样的事情,同时允许独立处理每一行的每个项目吗?

我打算用它做类似以下的事情,这就是为什么我需要能够独立处理这些项目。

if ($stat->execute()) {
  while ($row = $stat->fetch(PDO::FETCH_ASSOC)) {
    echo '<div class="row">';
    foreach ($row as $key=>$value) {
      echo '<div class=' .$key. '>';
      if (empty($value)) echo '---<br>';
      else echo $value;
      echo '</div>';
    }
    echo '</div>';
  }
}

【问题讨论】:

  • 这对我来说似乎并不多余。您认为这在哪些方面显得多余?
  • @blubear 是绝对必要的两个循环来独立处理每一行的每个项目吗?
  • 如果你选择使用 fetch 方法就好了。如果您选择像下面的答案那样使用 fetchAll 方法,那么您将有一个循环。无论如何,与下面的答案相比,我看不出您的代码是多余的。这是您选择使用 fetch 导致的额外循环。
  • 您将需要循环获取每个配对。您可以在 mysql 中将空值设置为 ---&lt;br&gt;stackoverflow.com/questions/4101564/…
  • @blubear 所以与fetchAll相比,少一个循环不会提高性能/带来好处?

标签: php mysql pdo


【解决方案1】:

但是,使用两个循环似乎是多余的。

我不明白这是什么意思,但总的来说,降低复杂性是很有可能的。为此,您需要完全使用 PDO,而不是仅仅作为 mysql_query() 的替代品。关注点分离也会有所帮助

先以数组的形式获取你的数据

$sql = "SELECT a, b, c, d, e, f FROM table";
$stmt = $conn->prepare($sql);
$stmt->execute();
$data = $stmt->fetchAll();

然后在页面的HTML部分中的某处显示它

<?php foreach ($data as $row): ?>
    <div class="row">
    <?php foreach ($row as $key=>$value): ?>
        <div class="<?=$key?>">
        <?php if (!$value): ?>
            ---<br>
        <?php else ?>
            <?=$value?>
        <?php endif ?>
        </div>
    <?php endforeach ?>
    </div>
<?php endforeach ?>

【讨论】:

  • 我实际上只是实现了这个。首先获取数据,对其进行格式化,并将其存储为变量,然后再显示它。 :) 但是我最初的实现不是 PDO 吗?
【解决方案2】:
function checking($val)
{
    if(empty($val))
    {
        echo "---<br>";
    }
    else
    {
        echo $val;
    }
}
$stri = "SELECT a, b, c, d, e, f FROM t";

try
{
    $stat = $conn->prepare($stri);
    $stat->execute();
    $results = $stat->fetchAll(PDO::FETCH_ASSOC);

    foreach ($results as $key=>$value) 
    {
      echo implode('',array_map("checking",$value));
      echo "<br><br>";
    }

}
catch(Exception $e)
{
     error_log($e->getMessage());
}

我对你的代码做了一点改动。与其使用 if 来捕获错误,我更喜欢使用 try catch 方法。

【讨论】:

  • 我不想在单个字符串中禁止它们,因为我计划在每个元素周围插入某些 HTML
  • @Anthony 按照 Deno 向您展示的那样构建 $results 数组后,您可以在 try-catch 块之外使用它。您将循环遍历它 - 与 Deno 相同 - 并根据需要使用数组项构建您的 html 结构。写在$results = ...之后,以便在屏幕上看到数组结构:echo '&lt;pre&gt;' . print_r($results, TRUE) . '&lt;/pre&gt;';
  • @aendeerei 谢谢,我会试试的。我编辑了我的问题。我不确定你是否看到了。我认为我需要独立对待这些物品
  • @Anthony 是的,我现在看到了。我写了一个答案here。和 Deno 一样,我建议使用 fetchAll 来构建结果集。您会在那里看到我将获取代码与 html 代码分开。在我看来,fetchAll() 在获取多条记录时更优雅。当然,您也可以使用 fetch() 获取。 P.S:我从不在我的代码中使用while,但这只是我,害怕再次遇到无限循环:-)
猜你喜欢
  • 2011-01-10
  • 1970-01-01
  • 2021-09-22
  • 1970-01-01
  • 2017-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-29
相关资源
最近更新 更多