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

时间:2018-09-24 04:53:47

标签: php pdo resultset associative

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

3 个答案:

答案 0 :(得分: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";
      }
    }
}

答案 1 :(得分:1)

我建议您将数据库连接作为函数参数传递,而不要使用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";
    }
}

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

答案 2 :(得分:-1)

您的处理方式有误... 当$ 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";
}