When using PHP's PDO (PHP Data Objects) to operate a database, there are many ways to obtain query results. PDOStatement::fetchObject() and PDOStatement::fetch() (together with PDO::FETCH_NUM to achieve a "fetchRow" effect) are the two most common ways. But many developers often wonder: Which one should I choose? What are the differences between them in terms of performance, structure, and convenience of use? This article will take you to gain an in-depth understanding of their similarities and differences and applicable scenarios.
$pdo = new PDO("mysql:host=localhost;dbname=test", "user", "password");
$stmt = $pdo->query("SELECT id, name, email FROM users");
$user = $stmt->fetchObject();
echo $user->name;
Return value : Return an object, which is an instance of stdClass by default, and can also be instantiated into a custom class.
Access method : Attribute method ( $user->name )
High readability , suitable for structured access to data.
Although there is no fetchRow() method, fetch(PDO::FETCH_NUM) can be regarded as its corresponding method:
$stmt = $pdo->query("SELECT id, name, email FROM users");
$row = $stmt->fetch(PDO::FETCH_NUM);
echo $row[1]; // name
Return value : Return the index array (each column is arranged by numeric keys)
Access method : Index method ( $row[0] , $row[1] )
It is more suitable for cases where the data structure is known and the column order is fixed.
Comparison items | fetchObject() | fetch(PDO::FETCH_NUM) |
---|---|---|
Return type | Object (default stdClass) | Array (index array) |
Attribute access | $obj->property | $row[0] |
Scalability | Class name can be passed in and class attributes can be automatically filled | Cannot map to class automatically |
performance | Slightly slow (create an object) | A little faster (pure array) |
readability | Higher | generally |
Recommended usage scenarios | ORM, object-oriented development, clear structure output | Simple report output, batch processing, temporary data processing |
Using fetchObject() is very suitable, it can directly map the results into objects, making subsequent business logic processing more natural and clear.
class User {
public $id;
public $name;
public $email;
}
$stmt = $pdo->query("SELECT id, name, email FROM users");
$user = $stmt->fetchObject("User");
echo $user->email;
Suitable scenarios: enterprise-level project, DDD architecture, RESTful interface return object
Using fetch (PDO::FETCH_NUM) can improve performance, avoid unnecessary object creation, and have clear control over field order.
while ($row = $stmt->fetch(PDO::FETCH_NUM)) {
echo implode(",", $row) . PHP_EOL;
}
Suitable for scenarios: batch processing, data export CSV, fast reporting system
Although fetchObject() provides higher readability, since each record generates an object, it performs slightly worse than fetch(PDO::FETCH_NUM) when processing large amounts of data. Take 100,000 pieces of data as an example:
fetchObject() : takes about 1.5 seconds
fetch(PDO::FETCH_NUM) : takes about 1.1 seconds
The test environment is based on local MySQL 8.0 and PHP 8.1, and the test code address is: https://gitbox.net/test/pdo_benchmark.php
If you are building API, ORM, or class encapsulation layers, it is recommended to use fetchObject() .
If you are dealing with temporary, well-structured reports or batch data, it is more appropriate to choose fetch (PDO::FETCH_NUM) .
Select objects when readability is preferred, and select arrays when performance is preferred.
Scene | Recommended method |
---|---|
Object-oriented processing | fetchObject() |
Quickly traverse and export data | fetch(PDO::FETCH_NUM) |
Needs clear structured data encapsulation | fetchObject() |
Very large amount of data, pursuing extreme performance | fetch(PDO::FETCH_NUM) |
In short, both have their own strengths and only by using them reasonably can the maximum effectiveness of PDO be exerted.