Error handling with PDO exceptions in PHP - Time & Space Complexity
When using PDO exceptions for error handling, it's important to see how the program's steps grow as input changes.
We want to know how the time to handle errors changes when running database queries.
Analyze the time complexity of the following code snippet.
try {
$pdo = new PDO($dsn, $user, $password);
$stmt = $pdo->prepare('SELECT * FROM users WHERE id = ?');
$stmt->execute([$userId]);
$result = $stmt->fetchAll();
} catch (PDOException $e) {
echo 'Error: ' . $e->getMessage();
}
This code tries to run a database query and catches any errors using PDO exceptions.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: Fetching all rows with
fetchAll()which loops through the result set. - How many times: Once per row returned by the query, depending on the number of matching users.
As the number of rows returned grows, the time to fetch all results grows too.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | About 10 fetch steps |
| 100 | About 100 fetch steps |
| 1000 | About 1000 fetch steps |
Pattern observation: The time grows roughly in direct proportion to the number of rows fetched.
Time Complexity: O(n)
This means the time to fetch results grows linearly with the number of rows returned.
[X] Wrong: "Error handling with exceptions adds a lot of extra time regardless of input size."
[OK] Correct: The exception code runs only when an error happens, so normal queries run in time based on rows fetched, not exception overhead.
Understanding how error handling affects performance helps you write reliable and efficient database code, a useful skill in many projects.
"What if we used fetch() inside a loop instead of fetchAll()? How would the time complexity change?"
Practice
try and catch blocks when working with PDO exceptions in PHP?Solution
Step 1: Understand the role of try-catch
Thetryblock runs code that might cause an error, andcatchhandles that error safely.Step 2: Relate to PDO exceptions
PDO exceptions occur on database errors; using try-catch prevents the program from stopping abruptly.Final Answer:
To handle database errors without stopping the entire program -> Option BQuick Check:
try-catch handles errors safely = D [OK]
- Thinking try-catch speeds up queries
- Believing it fixes SQL errors automatically
- Confusing error handling with database creation
Solution
Step 1: Identify PDO error modes
PDO supports error modes: SILENT, WARNING, EXCEPTION, and IGNORE (not standard).Step 2: Choose the mode that throws exceptions
PDO::ERRMODE_EXCEPTION makes PDO throw exceptions on errors.Final Answer:
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); -> Option CQuick Check:
Exception mode = PDO::ERRMODE_EXCEPTION = B [OK]
- Using ERRMODE_SILENT which hides errors
- Confusing ERRMODE_WARNING with exceptions
- Using non-existent ERRMODE_IGNORE
$pdo = new PDO('sqlite::memory:');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
try {
$pdo->exec('CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT)');
$pdo->exec('INSERT INTO users (id, name) VALUES (1, "Alice")');
$pdo->exec('INSERT INTO users (id, name) VALUES (1, "Bob")');
echo "Insert successful";
} catch (PDOException $e) {
echo "Error: " . $e->getMessage();
}Solution
Step 1: Understand the code flow
The code creates a table with a primary key on 'id' and inserts two rows with the same id=1.Step 2: Identify the error
Inserting duplicate primary keys causes an integrity constraint violation, triggering a PDOException.Final Answer:
Error: SQLSTATE[23000]: Integrity constraint violation: UNIQUE constraint failed: users.id -> Option DQuick Check:
Duplicate primary key causes exception = C [OK]
- Expecting 'Insert successful' despite duplicate keys
- Thinking it's a syntax error
- Ignoring exception handling output
try {
$pdo = new PDO('mysql:host=localhost;dbname=testdb', 'user', 'pass');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$pdo->exec('INVALID SQL');
} catch (PDOException $e) {
echo 'Error: ' . $e->getMessage();
}Solution
Step 1: Check PDO connection and error mode
The connection string and error mode setting are correct for throwing exceptions.Step 2: Analyze the SQL statement
The SQL statement 'INVALID SQL' is not valid SQL, so it triggers a PDOException.Final Answer:
SQL statement is invalid causing exception -> Option AQuick Check:
Invalid SQL causes exception = A [OK]
- Assuming connection string is wrong
- Forgetting error mode is set correctly
- Thinking catch block is missing
Solution
Step 1: Check for proper error mode setting
try { $pdo = new PDO($dsn, $user, $pass); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $stmt = $pdo->prepare('INSERT INTO users (name, email) VALUES (:name, :email)'); $stmt->execute([':name' => $name, ':email' => $email]); echo 'User added'; } catch (PDOException $e) { echo 'Error: ' . $e->getMessage(); } sets PDO::ATTR_ERRMODE to ERRMODE_EXCEPTION, enabling exception handling.Step 2: Verify use of prepared statements and parameter binding
try { $pdo = new PDO($dsn, $user, $pass); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $stmt = $pdo->prepare('INSERT INTO users (name, email) VALUES (:name, :email)'); $stmt->execute([':name' => $name, ':email' => $email]); echo 'User added'; } catch (PDOException $e) { echo 'Error: ' . $e->getMessage(); } uses prepared statements with named parameters and executes safely with user data.Step 3: Confirm exception handling
try { $pdo = new PDO($dsn, $user, $pass); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $stmt = $pdo->prepare('INSERT INTO users (name, email) VALUES (:name, :email)'); $stmt->execute([':name' => $name, ':email' => $email]); echo 'User added'; } catch (PDOException $e) { echo 'Error: ' . $e->getMessage(); } catches PDOException and outputs the error message, providing safe error handling.Final Answer:
try { $pdo = new PDO($dsn, $user, $pass); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $stmt = $pdo->prepare('INSERT INTO users (name, email) VALUES (:name, :email)'); $stmt->execute([':name' => $name, ':email' => $email]); echo 'User added'; } catch (PDOException $e) { echo 'Error: ' . $e->getMessage(); } -> Option AQuick Check:
Prepared + ERRMODE_EXCEPTION + try-catch = A [OK]
- Not setting error mode to exceptions
- Using query() with unescaped variables
- Catching generic Exception instead of PDOException
- Using ERRMODE_WARNING which doesn't throw exceptions
Ready to prove it?
Pass the test and this pattern moves unknown
