Lets say I have a class like this:
Class User {
var $id
var $name;
}
And I run a query using PDO in php like so:
$stm = $db->prepare('select * from users where id = :id');
$r = $stm->execute(array(':id' => $id));
$user = $r->fetchObject('User');
If I vardump my user object it has all kinds of other fields in it that I have not defined in the User class. Obviously I could make my query specific so that it only gives me back the fields I need/want. But if I don’t want to do that is there any way to make this work the way I want it to?
I like the idea of fetchObject, because it’s one line of code to create this object and set member variables for me. I just don’t want it to set variables I haven’t defined in my class.
EDIT:
Well it seems like karim79 is right and the fetch or fetchObject won’t work the way I want it to. I’ve added the following bit of code after I do the fetch to get the desired results.
$valid_vars = get_class_vars('User');
foreach (get_object_vars($user) as $key => $value) {
if (!array_key_exists($key, $valid_vars)) {
unset($user->$key);
}
}
Obviously not the most elegant solution :/ I’m going to extend the PDOStatement class and add my own method fetchIntoObject or something like that and automatically do these unsets. Hopefully shouldn’t be to much overhead, but I want to be able to easily fetch into an object with 1 line of code 🙂
SUPER EDIT:
Thanks to mamaar’s comment I went back to the documentation again. I found what the problem is. http://us.php.net/manual/en/pdo.constants.php and scroll down to PDO::FETCH_CLASS and it explains that the magic method __set() is used if properties don’t exist in the class. I overwrote the method in my target class and tada, works. Again, not the most elegant solution. But now I understand the WHY, and that’s important to me 😀
I don’t think that’s possible.
fetchObjectwill create an instance of the classname specified asfetchObject‘s$class_nameparameter (which defaults to stdClass). It will not check for existing classes with the same name and create an instance, assigning values only to member variables which match column names in the result. I would suggest relying on something more boring, like this:Which would of course mean giving your User class a constructor: