Mysql PDO:获取查询中包含 "dynamic" 字段的行

Mysql PDO : get row with "dynamic" fields in query

我有一个包含动态字段的查询,如何在不知道其名称的情况下访问该字段?

define('FIELD_NAME',"name");
$stmt = $connexion->query('SELECT '.FIELD_NAME.' from mytable);   

while ($rs=$stmt->fetch(PDO::FETCH_OBJ)){
    echo $rs->FIELD_NAME;   // DOESN'T WORK
    echo $rs->name;         // WORK
}

将常量包装在 {} 中以创建动态变量。

echo $rs->{FIELD_NAME};

你可以从the documentation中看到一些例子。

Curly braces may also be used, to clearly delimit the property name.

演示:http://3v4l.org/sgvV4

define('FIELD_NAME',"name");
        $stmt = $connexion->query('SELECT '.FIELD_NAME.' from mytable');   

        while ($rs=$stmt->fetch(PDO::FETCH_NUM)){
            echo $rs[0];
        }

使用这种方法,如果 FIELD_NAME 被定义为 * 之类的东西,您仍然可以获得第一列。

如果您只想从每一行中获取一个值,您可以使用 PDOStatement::fetchColumn()

define('FIELD_NAME',"name");
$stmt = $connexion->query('SELECT '.FIELD_NAME.' from mytable');
while ($col = $stmt->fetchColumn()) {
    echo $col;
}

另请注意,您缺少 '

有很多方法可以解决这个问题。如果变量名与 column_name 匹配并不重要,您可以为 SELECT 语句

中的表达式分配一个别名

例如:

 SELECT whateverexpression AS mycol FROM mytable LIMIT 1;

然后,您 "know" 对象中变量的名称是 $mycol

    echo $rs->mycol;

我认为这种方法在更一般的情况下可能会更好,当你处理的表的列名是由 梅毒白痴 开发人员分配的一个很好的理由

CREATE TABLE t (`Hey!$I (can)^name.\my->column Wh@tever` INT);
INSERT INTO t VALUES (42);
SELECT `Hey!$I (can)^name.\my->column Wh@tever` FROM t;

显然,还有许多其他方法,例如避免使用 PDO::FETCH_OBJ 并改用 PDO::FETCH_NUM。如果您想坚持使用 PDO::FETCH_OBJ,我认为分配别名是可行的。

如果 getColumnMeta 还不是实验性的,我会考虑从结果集中检索元数据的方法。