如何使用 PDO 从单行结果集中获取列名和值?

How to get column names and values from a single-row resultset with PDO?

我需要获取 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;
}

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

因此:

$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";
}

不需要做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";
      }
    }
}

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

fetch(PDO::FETCH_ASSOC) returns 一维关联数组或 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";
    }
}

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