gpt4 book ai didi

php - 我可以让 PDOStatement->fetchObject 不使用非成员变量吗?

转载 作者:可可西里 更新时间:2023-10-31 23:12:02 24 4
gpt4 key购买 nike

假设我有这样一个类:

Class User {
var $id
var $name;
}

然后我在 php 中使用 PDO 运行查询,如下所示:

$stm = $db->prepare('select * from users where id = :id');
$r = $stm->execute(array(':id' => $id));
$user = $r->fetchObject('User');

如果我 vardump 我的用户对象,它里面有我没有在 User 类中定义的各种其他字段。显然,我可以使我的查询具体化,以便它只返回我需要/想要的字段。但是,如果我不想这样做,是否有任何方法可以让这项工作按照我想要的方式进行?

我喜欢 fetchObject 的想法,因为只需一行代码即可创建此对象并为我设置成员变量。我只是不希望它设置我未在类里面定义的变量。

编辑:

好吧,karim79 似乎是对的,fetch 或 fetchObject 不会按照我想要的方式工作。在执行提取以获得所需结果后,我添加了以下代码。

$valid_vars = get_class_vars('User');
foreach (get_object_vars($user) as $key => $value) {
if (!array_key_exists($key, $valid_vars)) {
unset($user->$key);
}
}

显然不是最优雅的解决方案:/我将扩展 PDOStatement 类并添加我自己的方法 fetchIntoObject 或类似的东西并自动执行这些取消设置。希望不会有太多开销,但我希望能够使用 1 行代码轻松获取对象 :)

super 编辑:

感谢 mamaar 的评论,我又回到了文档。我发现了问题所在。 http://us.php.net/manual/en/pdo.constants.php并向下滚动到 PDO::FETCH_CLASS,它解释了如果类中不存在属性,则使用魔术方法 __set()。我覆盖了我的目标类中的方法并且 tada,有效。同样,这不是最优雅的解决方案。但现在我明白了为什么,这对我很重要 :D

最佳答案

PDOStatement->execute() 不返回对象 - 它返回 TRUE/FALSE。

将第 2 行和第 3 行更改为

if ( $stm->execute( array( ':id' => $id ) ) ){    
$user = $stm->fetchObject( 'User' );
}

它有效

关于php - 我可以让 PDOStatement->fetchObject 不使用非成员变量吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2933292/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com