Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 我是否可以发表声明->;fetchObject是否不使用非成员变量?_Php_Pdo - Fatal编程技术网

Php 我是否可以发表声明->;fetchObject是否不使用非成员变量?

Php 我是否可以发表声明->;fetchObject是否不使用非成员变量?,php,pdo,Php,Pdo,假设我有一门课是这样的: Class User { var $id var $name; } $user = new User($result['id'], $result['name']); 我在php中使用PDO运行一个查询,如下所示: $stm = $db->prepare('select * from users where id = :id'); $r = $stm->execute(array(':id' => $id)); $user = $r->

假设我有一门课是这样的:

Class User {
  var $id
  var $name;
}
$user = new User($result['id'], $result['name']);
我在php中使用PDO运行一个查询,如下所示:

$stm = $db->prepare('select * from users where id = :id');
$r = $stm->execute(array(':id' => $id));
$user = $r->fetchObject('User');
如果我vardump我的用户对象,它有我在用户类中没有定义的所有类型的其他字段。显然,我可以使我的查询具体化,以便它只返回我需要/想要的字段。但如果我不想这样做,有没有办法让这一切按我所希望的方式进行

我喜欢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或类似的东西,并自动执行这些未设置。希望不会有太大的开销,但我希望能够用一行代码轻松地获取对象:)

超级编辑:


多亏了马马尔的评论,我又回到了文档中。我发现了问题所在。然后向下滚动到PDO::FETCH_类,它解释了如果类中不存在属性,则使用神奇的方法_set()。我在我的目标类中过度编写了这个方法,tada也能工作。同样,这不是最优雅的解决方案。但现在我明白了原因,这对我来说很重要:我认为这是不可能的
fetchObject
将创建指定为
fetchObject
$class\u name
参数(默认为stdClass)的类名实例。它不会检查具有相同名称的现有类并创建实例,只为与结果中的列名匹配的成员变量赋值。我建议依赖一些更无聊的东西,比如:

Class User {
  var $id
  var $name;
}
$user = new User($result['id'], $result['name']);
这当然意味着给你的用户类一个构造函数:

Class User {
  var $id
  var $name;

  public function __construct($id, $name)
  {
     $this->id = $id;
     $this->name = $name;
  }

}

作为替代方案,您当然可以获取一个数组,然后自己简单地键入:

$user = (User) $r->fetch();

顺便说一句,我没见过这种行为。也许您激活了PDO::FETCH_LAZY,这可能会创建额外的数据。您可以使用->fetchObject(“stdClass”)对其进行测试,否则原因在于您的用户类或其父类?

您可能可以使用PDO::fetch_类或PDO::fetch_INTO作为$fetch_样式参数的PDOStatement->fetch方法

编辑:所以我自己也试过了,并且用它来工作


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

将第2行和第3行更改为

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

而且它很有效

对。我想避免这样的解决方案,因为fetchObject的吸引力在于它可以用一行代码来实现这一点。我可以扩展PDO语句并添加我自己的方法fetchIntoObject,或者做我希望它做的事情。希望性能可以。不幸的是,排版不起作用,只是出现了错误。您可以键入cast('object'),但不能键入(User),(Bar)等特定类。。。至于FETCH_LAZY,我尝试过使用FETCH、fetchObject、fetchInto的各种方法,并且总是得到相同的结果。它填充成员变量,然后将db给它的额外字段附加到末尾,因此在我的示例中,我的测试对象没有2个变量(id,name),而是有3个变量(id,name,descr)。我尝试使用FETCH()方法将_提取到类中并提取_类,但仍然得到相同的结果。我使用PDOStatement::setFetchMode使其工作,我的答案是用一个工作示例编辑的。谢谢更新。我尝试了你的确切代码(显然更改了数据库信息),但它仍然给我同样的问题。你的评论让我再次查看了文档,我发现了问题所在。然后向下滚动到PDO::FETCH_类,它解释了如果类中不存在属性,则使用神奇的方法_set()。我在我的目标类中重写了这个方法,tada,行得通。很抱歉,我来晚了一点,但我和你一样担心,所以我刚刚找到了这个帖子。在了解了这里的问题之后,我决定在所有类中使用基类覆盖
\uu set()
更容易,为什么不让这样的类从已经创建了
\uu set()
方法以抛出异常的基类继承呢?我使用行
$user=$stm->fetchObject('user')但我无法从$user检索数据。