Php Mysql PDO:在查询中获取带有“动态”字段的行
我有一个带有动态字段的查询,如何在不知道其名称的情况下访问此字段Php Mysql PDO:在查询中获取带有“动态”字段的行,php,mysql,pdo,row,fetch,Php,Mysql,Pdo,Row,Fetch,我有一个带有动态字段的查询,如何在不知道其名称的情况下访问此字段 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;
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};
您可以从中看到一些示例
也可以使用大括号来清楚地分隔属性名称
演示:
使用这种方法,如果FIELD_NAME被定义为*,您仍然可以获取第一列。如果您只想从每一行获取一个值,您可以使用
还要注意的是,您缺少了一个“.有很多方法可以做到这一点。如果变量名与列名称匹配并不重要,则可以在SELECT语句中为表达式指定别名 例如:
SELECT whateverexpression AS mycol FROM mytable LIMIT 1;
然后,您就知道对象中变量的名称是$mycl
我认为这种方法在更一般的情况下可能是好的,当您处理的表的列名是由梅毒白痴开发人员分配的,他们有很好的理由这样做
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,我认为分配一个别名是可行的
从ReultSet中检索元数据是一种方法,如果GETCalnMeta不是实验性的,我会考虑。
在查询结束时有一个键入。你忘了最后的报价。添加错误检查会向您展示这一点。不要使用::FETCH_OBJ,而是使用FETCH a并只获取第一个条目。OP为什么要尝试此操作?请解释一下你做了什么,以及你为什么这样做,不仅是为了OP,也是为了SO的未来访客。只是注意到mario已经在评论中提出了这一点。我不知道梅毒导致程序员创建这样的专栏,但我真的很惊讶这是一个有效的列名haha@Mike:对该列的引用必须用反勾号括起来。我不知道PDO::FETCH_OBJ对resultset中的列名做了什么,成员变量的名称是什么。接受挑战!objectstdClass4 1{[Hey!$I can^name.\my->columnWh@tever]=>int1}因此您可以使用$result->{'Hey!$I can^name.\my->column访问它Wh@tever'};. 恶心@迈克。很好,做得很好。现在我很想在我的下一个专栏名中加上一句恶毒的引语嘿嘿。。。咳,咳,咳,咳。 SELECT whateverexpression AS mycol FROM mytable LIMIT 1;
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;