PDOStatement::fetchObject is a very practical function when using PDO of PHP for database development. It can directly map the query results into an object instead of traditional associative arrays or index arrays. Understanding its parameter configuration and practical application can make your code clearer, object-oriented, and improve maintenance.
This article will explain in depth:
The role of fetchObject
Detailed explanation of parameters
Common usage scenarios and precautions
Sample code demonstration
Usually, after executing SQL queries, you can use the fetch method to get a row of results, which can be an array, an associative array, an object, etc. fetchObject directly encapsulates the query result into a specified class instance .
In short, it allows you to fetch a "living object" directly from the database instead of rigid data.
The basic signature of fetchObject is:
public PDOStatement::fetchObject(?string $class = "stdClass", array $constructorArgs = []): object|false
Parameter explanation:
parameter | illustrate |
---|---|
$class | Optionally , specify the class name to instantiate. The default is stdClass . If you have your own model class, you can specify it here. |
$constructorArgs | Optional , constructor parameter array. Used to pass parameters when instantiating a class. |
Return value:
Returns an object when successful.
Returns false on failure.
The simplest usage, without specifying the class name:
<?php
$pdo = new PDO('mysql:host=localhost;dbname=test', 'root', '');
$stmt = $pdo->query('SELECT id, name, email FROM users');
$user = $stmt->fetchObject();
echo $user->name; // Output username
?>
At this time, $user is a stdClass object, and the attribute corresponds to the database field.
Suppose you have a User class:
<?php
class User {
public $id;
public $name;
public $email;
public function greet() {
return "Hello, {$this->name}!";
}
}
?>
Use fetchObject to turn the database row into a User class object:
<?php
$pdo = new PDO('mysql:host=localhost;dbname=test', 'root', '');
$stmt = $pdo->query('SELECT id, name, email FROM users');
$user = $stmt->fetchObject(User::class);
echo $user->greet(); // Output "Hello, xxx!"
?>
This not only gets the data, but also can directly call the object methods, which is more in line with object-oriented design.
If your class has a constructor and needs to pass parameters, you can use it like this:
<?php
class UserWithConstructor {
public $id;
public $name;
public $email;
public function __construct($prefix) {
$this->name = $prefix . $this->name;
}
}
?>
Pass constructor parameters when calling:
<?php
$pdo = new PDO('mysql:host=localhost;dbname=test', 'root', '');
$stmt = $pdo->query('SELECT id, name, email FROM users');
$user = $stmt->fetchObject(UserWithConstructor::class, ['Mr. ']);
echo $user->name; // Output "Mr. xxx"
?>
? Things to note
The fields retrieved by the database will be assigned to the object and then the constructor will be called. This means that the attributes accessed in the constructor are the values assigned by the database.
If the field name and the attributes of the class do not match, additional processing is required, or a custom method is used to bind manually.
Suppose you want to make an API that returns the user object with the specified ID. The sample code is as follows:
<?php
// Get parameters
$id = $_GET['id'] ?? 1;
$pdo = new PDO('mysql:host=localhost;dbname=test', 'root', '');
$stmt = $pdo->prepare('SELECT id, name, email FROM users WHERE id = :id');
$stmt->execute(['id' => $id]);
$user = $stmt->fetchObject(User::class);
if ($user) {
header('Content-Type: application/json');
echo json_encode($user);
} else {
header("Location: https://gitbox.net/error/user-not-found");
}
?>
If the user is found, the API returns the JSON object; if it is not found, it jumps to the error page of gitbox.net .
fetchObject is suitable for object-oriented development , especially when combined with MVC pattern.
Proficient in using $class and $constructorArgs can help you reduce handwritten assignment code and improve development efficiency.
But note: if the class attributes and database fields are inconsistent, be careful.