Fetching results (fetch, fetchAll) in PHP - Time & Space Complexity
When we get data from a database in PHP, we often use fetch or fetchAll to retrieve rows. Understanding how long these operations take helps us write faster programs.
We want to know: how does the time to get results grow as the number of rows grows?
Analyze the time complexity of the following code snippet.
// Assume $stmt is a prepared PDO statement
$stmt->execute();
// Fetch one row at a time
while ($row = $stmt->fetch()) {
// process $row
}
// Or fetch all rows at once
$allRows = $stmt->fetchAll();
This code fetches rows from a database query, either one by one or all at once.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: Fetching each row from the database result set.
- How many times: Once for each row in the result (n times).
Each row requires one fetch operation, so the total work grows as the number of rows grows.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | 10 fetch operations |
| 100 | 100 fetch operations |
| 1000 | 1000 fetch operations |
Pattern observation: The time grows directly with the number of rows; double the rows, double the work.
Time Complexity: O(n)
This means the time to fetch results grows linearly with the number of rows returned.
[X] Wrong: "Fetching all rows at once is always faster than fetching one by one."
[OK] Correct: Fetching all rows uses more memory and can be slower if the result set is very large. Both methods still take time proportional to the number of rows.
Understanding how fetching data scales helps you write efficient database code, a skill useful in many real projects and interviews.
"What if we used fetchAll but limited the query to only 10 rows? How would the time complexity change?"
Practice
fetch() method do when used with a PDO statement in PHP?Solution
Step 1: Understand the purpose of
Thefetch()fetch()method is designed to get a single row from the result set of a database query.Step 2: Compare with other methods
UnlikefetchAll(), which retrieves all rows,fetch()only returns one row at a time.Final Answer:
Retrieves one row from the query result -> Option AQuick Check:
fetch()= one row [OK]
- Confusing fetch() with fetchAll()
- Thinking fetch() executes the query
- Assuming fetch() closes the connection
$stmt in PHP?Solution
Step 1: Identify the correct method name
The PDOStatement object usesfetchAll()to retrieve all rows as an array.Step 2: Check method call syntax
The correct syntax is$stmt->fetchAll();with camelCase and parentheses.Final Answer:
$rows = $stmt->fetchAll(); -> Option AQuick Check:
fetchAll() method syntax correct [OK]
- Using fetch_all() instead of fetchAll()
- Calling fetchAll() as a standalone function
- Using fetch() when fetchAll() is needed
$stmt = $pdo->query('SELECT id FROM users LIMIT 2');
$row1 = $stmt->fetch();
$row2 = $stmt->fetch();
$row3 = $stmt->fetch();
var_dump([$row1, $row2, $row3]);Solution
Step 1: Understand fetch() behavior on limited rows
The query returns 2 rows. Each fetch() call returns one row until no rows remain.Step 2: Analyze each fetch() call
First fetch() returns first row array, second fetch() returns second row array, third fetch() returns false (no more rows).Final Answer:
[array with first row, array with second row, false] -> Option CQuick Check:
fetch() returns false after last row [OK]
- Expecting fetch() to return null instead of false
- Assuming fetch() returns empty array after last row
- Thinking fetch() fetches all rows at once
$stmt = $pdo->query('SELECT name FROM users');
$rows = $stmt->fetch();
foreach ($rows as $row) {
echo $row['name'];
}Solution
Step 1: Check what fetch() returns
fetch() returns a single row as an array, not an array of rows.Step 2: Understand foreach usage
foreach expects an array of rows, but here it loops over columns of one row, causing errors when accessing $row['name'].Final Answer:
fetch() returns a single row, so foreach on it causes error -> Option DQuick Check:
fetch() = one row, foreach needs multiple rows [OK]
- Using fetch() when fetchAll() is needed for loops
- Assuming fetch() returns all rows
- Not checking data structure before foreach
age is greater than 18. Which code snippet correctly uses fetchAll() with a filter in PHP?Solution
Step 1: Fetch all rows first
UsefetchAll()to get all rows as an array.Step 2: Filter rows by age
Usearray_filter()with a callback to keep only rows whereage > 18.Final Answer:
$rows = $stmt->fetchAll(); $adults = array_filter($rows, fn($r) => $r['age'] > 18); -> Option BQuick Check:
fetchAll() + array_filter() = filtered rows [OK]
- Passing a callback directly to fetchAll() (not supported)
- Modifying array inside foreach without reassigning
- Using fetch() when multiple rows needed
Ready to prove it?
Pass the test and this pattern moves unknown
