Trying out PDO for the first time.
$dbh = new PDO(\"mysql:host=$hostname;dbname=animals\", $username, $password);
$stmt = $dbh->query(\"SELECT * FROM ani
Perhaps you could try extending the PDO class to automatically call the function for you... in brief:
class myPDO extends PDO { function animalQuery($sql) { $result = parent::query($sql); $result->setFetchMode(PDO::FETCH_INTO, new animals); return $result; } // // useful if you have different classes // function vegetableQuery($sql) // { // $result = parent::query($sql); // $result->setFetchMode(PDO::FETCH_INTO, new vegetables); // return $result; // } } $dbh = new myPDO("mysql:host=$hostname;dbname=animals", $username, $password); $stmt = $dbh->animalQuery("SELECT * FROM animals"); foreach($stmt as $animals) { echo $animals->name; }
Speaking of fetching objects in general, PDO has half a dozen different modes for this task. I had to write a dedicated article regarding fetching objects with PDO to list them all.
Regarding your particular questions,
How can I simply return objects in PDO?
Simply use the PDO::FETCH_OBJ
mode
Is there a way to set the default FetchMode?
It depends.
If your concern is just a syntax, and you simply want to use $animal->name
instead of $animal['name']
, then you can ask PDO to create instances of stdClass()
by default. To do so, just add
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_OBJ
to the list of your PDO connection options (the link is to another example I wrote, which I highly recommend to check out, because connection to PDO is a complex business that is anything but a single line from your example).
Having this option set you can have your object syntax right away:
$stmt = $dbh->query("SELECT * FROM animals");
foreach($stmt as $animal)
{
echo $animal->name;
}
While in case you need to fetch into a particular class, for a list of objects either use your current approach with setFetchMode()
/ foreach
or you can use fetchAll()
with a dedicated PDO::FETCH_CLASS
fetch mode:
$herd = $pdo->query('SELECT name FROM animals')->fetchAll(PDO::FETCH_CLASS, 'Animal');
This is all you can have, simply because you need to tell PDO, instances of which particular class you will need.
There are other options like providing constructor arguments and such. You can check them out in the article linked above.
Since PDO would need to know what object you want to fetch into, you would need to specify it manually. But of you just want to use the object to retrieve the data rather than an array and do not care if its not an animal object, you can use anonymous objects by default when you set the attribute after the connection string which could be done in a wrapped constructor
$connection = new PDO($connection_string);
//PDO::FETCH_OBJ: returns an anonymous object with property names that correspond to the column names returned in your result set
$connection->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_OBJ);
Then all queries will return objects. Though it's not exactly what you want its close.
You could also inject the data into your animal class:
while($dataObj = ...) {
$animal = new Animal($dataObj);
}
If you look at the query function it is possible to change some options by passing extra parameters: http://www.php.net/manual/en/pdo.query.php I haven't tested it but it looks like it gets you close to what you want
You can try this way:
$dbh = new PDO("mysql:host=$hostname;dbname=animals", $username, $password);
$stmt = $dbh->query("SELECT * FROM animals");
$stmt->setFetchMode(PDO::FETCH_CLASS, animals::class);
foreach($stmt as $animals)
{
echo $animals->name;
}