【问题标题】:How to get column names and values from a single-row resultset with PDO?如何使用 PDO 从单行结果集中获取列名和值?
【发布时间】:2018-09-24 04:53:47
【问题描述】:

我需要获取id = $id所在行中的所有列名和值。

列名应回显为title;值应回显为story

类似这样的:

function story($id) {
    global $db;
    $sql = "select *  from users where id = :aid limit 1";
    $st = $db->prepare($sql);
    $st -> execute([":aid" => $id]);
    $row = $st->fetch();
    $sql = // select all column names;
    $columns = // array - result of $sql
    $story = "";
    foreach ($columns as $el) {
        $i = array_search($el, $columns);
        $val = $row[$i];
        $story .=
        "<div class='title'>" . $el . "</div>\n" .
        "<div class='story'>" . $val . "</div>\n";
    }
    echo $story;
}

【问题讨论】:

  • 你为什么使用array_search()?构建您想要使用的结果集。我建议将$db 作为函数参数传递,而不是声明global
  • @mickmackusa,因为我需要该索引才能在 row 数组中获取适当的元素;
  • -&gt;fetch(PDO::FETCH_ASSOC)?
  • @mickmackusa,抱歉,看不懂,我应该在哪里写?
  • 如果您只是这样做:$row = $st-&gt;fetch(PDO::FETCH_ASSOC);,您将获得作为关联数组的行。不需要其他任何东西。 Here's the manual

标签: php pdo resultset associative


【解决方案1】:

不用array_search(),如下:-

function story($id) {
    global $db;
    $sql = "select *  from users where id = :aid limit 1";
    $st = $db->prepare($sql);
    $st -> execute([":aid" => $id]);
    $row = $st->fetch(PDO::FETCH_ASSOC);
    if(count($row)>=1){
      foreach ($row as $column => $value) {
        echo "<div class='title'>" . $column . "</div>\n" .
        echo "<div class='story'>" . $value. "</div>\n";
      }
    }
}

【讨论】:

    【解决方案2】:

    我建议您将 db 连接作为函数参数传递,而不是使用 global 声明。

    fetch(PDO::FETCH_ASSOC) 返回一维关联数组或false

    http://php.net/manual/en/pdostatement.fetch.php

    在 sql 关键字上使用大写字母可以提高可读性。

    我已删除 LIMIT 子句,但如果您的 id 列是 PRIMARY KEY,则限制无关紧要。

    function story($db, $id) {
        $st = $db->prepare("SELECT * FROM users WHERE id = :aid");
        $st->execute([":aid" => $id]);
        if (!$row = $st->fetch(PDO::FETCH_ASSOC)) {
            echo "no row found";
        }
        foreach ($row as $key => $val) {
            echo "<div class='title'>" . $key . "</div>\n";
            echo "<div class='story'>" . $val . "</div>\n";
        }
    }
    

    我确实怀疑您的数据库表设计可能不是最佳的。通常,您需要一个稳定的列结构,允许您的行数增加。如果您的表格在垂直和水平方向都在扩展,我想知道您的要求是什么。

    【讨论】:

    • 有什么区别?
    • global 不建议使用作用域变量,而不是将连接作为参数传递给自定义函数。此外,行上的count() 不是必需的。如果id 是主键/唯一键(通常位于设计合理的表中),则不需要LIMIT 1
    【解决方案3】:

    你的方法有点不对... 当 $sql 以 mysqli 作为关联数组返回时,它返回列名作为键...

    因此:

    $columns = // array - result of $sql as an assoc array
    $story = "";
    foreach ($columns as $key => value) {
        $story .=
        "<div class='title'>" . $key . "</div>\n" .
        "<div class='story'>" . $value . "</div>\n";
    }
    

    【讨论】:

      猜你喜欢
      • 2020-03-14
      • 2019-07-20
      • 1970-01-01
      • 2014-05-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-29
      • 2015-03-11
      相关资源
      最近更新 更多