This program creates a temporary database, adds a user, and fetches that user safely using PDO.
PHP
<?php
try {
$pdo = new PDO('sqlite::memory:');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$pdo->exec('CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT)');
$stmt = $pdo->prepare('INSERT INTO users (name) VALUES (:name)');
$stmt->execute([':name' => 'Bob']);
$stmt = $pdo->prepare('SELECT * FROM users WHERE name = :name');
$stmt->execute([':name' => 'Bob']);
$user = $stmt->fetch(PDO::FETCH_ASSOC);
print_r($user);
} catch (PDOException $e) {
echo'Error: ' . $e->getMessage();
}
?>
OutputSuccess
Important Notes
PDO supports many databases like MySQL, SQLite, PostgreSQL, and more.
Always use prepared statements to keep your app safe from SQL injection.
Setting error mode to exceptions helps find problems quickly.
Summary
PDO is a safe and flexible way to work with databases in PHP.
It uses prepared statements to protect your app from attacks.
PDO lets you switch databases easily without big code changes.
Practice
(1/5)
1. Why is PDO considered the standard way to access databases in PHP?
easy
A. Because it supports prepared statements to prevent SQL injection
B. Because it only works with MySQL databases
C. Because it requires no configuration to connect to any database
D. Because it automatically creates database tables
Solution
Step 1: Understand PDO's security feature
PDO uses prepared statements which separate SQL code from data, preventing attackers from injecting harmful SQL.
Step 2: Compare with other options
PDO works with many databases, requires configuration, and does not create tables automatically.
Final Answer:
Because it supports prepared statements to prevent SQL injection -> Option A
Quick Check:
PDO security = prepared statements [OK]
Hint: Remember PDO protects with prepared statements [OK]
Common Mistakes:
Thinking PDO only works with MySQL
Believing PDO auto-creates tables
Assuming PDO needs no setup
2. Which of the following is the correct way to create a PDO connection in PHP?
easy
A. $pdo = new PDO('mysql://user:pass@localhost/testdb');
B. $pdo = new PDO('mysql:host=localhost;dbname=testdb', 'user', 'pass');
C. $pdo = new PDO('connect:mysql://localhost/testdb', 'user', 'pass');
D. $pdo = new PDO('localhost', 'user', 'pass', 'testdb');
Solution
Step 1: Recall PDO constructor syntax
The PDO constructor requires a DSN string like 'mysql:host=localhost;dbname=testdb' plus username and password.
Step 2: Check each option
Only $pdo = new PDO('mysql:host=localhost;dbname=testdb', 'user', 'pass'); uses the correct DSN format and parameters.
Final Answer:
$pdo = new PDO('mysql:host=localhost;dbname=testdb', 'user', 'pass'); -> Option B
Quick Check:
PDO connection = DSN string + user/pass [OK]
Hint: DSN string format is 'driver:host=...;dbname=...' [OK]
Common Mistakes:
Using wrong DSN format
Passing parameters in wrong order
Confusing DSN with URL
3. What will be the output of this PHP code using PDO?
$pdo = new PDO('sqlite::memory:');
$pdo->exec('CREATE TABLE users (id INTEGER, name TEXT)');
$pdo->exec("INSERT INTO users VALUES (1, 'Alice')");
$stmt = $pdo->prepare('SELECT name FROM users WHERE id = :id');
$stmt->execute([':id' => 1]);
echo $stmt->fetchColumn();
medium
A. name
B. 1
C. Alice
D. Error: no such table
Solution
Step 1: Understand the code flow
The code creates an in-memory SQLite database, a table 'users', inserts one row with id=1 and name='Alice'.
Step 2: Analyze the prepared statement
The statement selects the 'name' where id=1, then fetchColumn() returns the first column of the first row, which is 'Alice'.
Final Answer:
Alice -> Option C
Quick Check:
PDO fetchColumn() returns 'Alice' [OK]
Hint: fetchColumn() returns first column of first row [OK]
Common Mistakes:
Expecting the id instead of name
Confusing fetchColumn() with fetchAll()
Assuming table does not exist
4. Identify the error in this PDO code snippet:
$pdo = new PDO('mysql:host=localhost;dbname=testdb', 'user', 'pass');
$stmt = $pdo->prepare('SELECT * FROM users WHERE id = ?');
$stmt->execute(['id' => 5]);
$result = $stmt->fetchAll();
print_r($result);
medium
A. No error, code runs fine
B. Missing database connection
C. Wrong method name 'fetchAll' instead of 'fetch_all'
D. Using named parameter array with positional placeholder
Solution
Step 1: Check placeholder and execute parameter usage
The SQL uses a positional placeholder '?', but execute() is called with an associative array ['id' => 5].
Step 2: Understand PDO parameter binding rules
Positional placeholders require a numeric-indexed array, not associative keys.
Final Answer:
Using named parameter array with positional placeholder -> Option D
Quick Check:
Positional placeholder needs numeric array [OK]
Hint: Match placeholder type with execute() array keys [OK]
Common Mistakes:
Mixing named and positional placeholders
Assuming fetchAll() is misspelled
Ignoring connection setup
5. You want to write PHP code that can switch easily between MySQL and SQLite databases without changing query code. Why is PDO the best choice for this?
hard
A. PDO provides a consistent interface and supports multiple databases with the same methods
B. PDO automatically converts MySQL queries to SQLite syntax
C. PDO requires no changes because it uses raw SQL strings only
D. PDO stores all data in memory for faster access
Solution
Step 1: Understand PDO's database abstraction
PDO offers a uniform API to connect and query different databases like MySQL and SQLite.
Step 2: Evaluate other options
PDO does not convert SQL syntax automatically, nor store data in memory, and raw SQL strings alone don't ensure portability.
Final Answer:
PDO provides a consistent interface and supports multiple databases with the same methods -> Option A
Quick Check:
PDO abstraction = easy DB switching [OK]
Hint: PDO abstracts DB differences with one API [OK]
Common Mistakes:
Thinking PDO converts SQL syntax automatically
Believing PDO stores data in memory
Assuming raw SQL means no changes needed
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.