Databases & PDO
⏱ 22 min read read
What is PDO?
PDO (PHP Data Objects) is a consistent interface for working with
databases. It supports MySQL, PostgreSQL, SQLite, and more. Always use
PDO over old mysql\_ functions.
Connecting to MySQL:
$dsn = 'mysql:host=localhost;dbname=mydb;charset=utf8mb4';
$pdo = new PDO($dsn, 'username', 'password', [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::ATTR_EMULATE_PREPARES => false,
]);
NEVER put user input directly in SQL strings --- SQL injection risk!
BAD: "SELECT * FROM users WHERE name = '$name'"
GOOD: Use prepared statements with placeholders.
ALWAYS set PDO::ERRMODE_EXCEPTION to catch database errors.
Use PDO::FETCH_ASSOC to get rows as associative arrays.
Prepared Statements --- The Safe Way:
// Named placeholders (:name)
$stmt = $pdo->prepare('SELECT * FROM users WHERE email =
:email');
$stmt->execute(['email' => $email]);
$user = $stmt->fetch();
// Positional placeholders (?)
$stmt = $pdo->prepare('INSERT INTO users (name, email) VALUES (?,
?)');
$stmt->execute([$name, $email]);
$newId = $pdo->lastInsertId();
Fetching Data:
// Fetch one row
$row = $stmt->fetch(); // one row as assoc array
// Fetch all rows
$rows = $stmt->fetchAll(); // all rows as array of arrays
// Fetch single value
$count = $stmt->fetchColumn(); // first column of first row
Transactions:
$pdo->beginTransaction();
try {
$pdo->prepare('UPDATE accounts SET balance = balance - ? WHERE id
= ?')->execute([100, 1]);
$pdo->prepare('UPDATE accounts SET balance = balance + ? WHERE id
= ?')->execute([100, 2]);
$pdo->commit();
} catch (Exception $e) {
$pdo->rollBack();
throw $e;
}
PDO (PHP Data Objects) is a consistent interface for working with
databases. It supports MySQL, PostgreSQL, SQLite, and more. Always use
PDO over old mysql\_ functions.
Connecting to MySQL:
$dsn = 'mysql:host=localhost;dbname=mydb;charset=utf8mb4';
$pdo = new PDO($dsn, 'username', 'password', [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::ATTR_EMULATE_PREPARES => false,
]);
NEVER put user input directly in SQL strings --- SQL injection risk!
BAD: "SELECT * FROM users WHERE name = '$name'"
GOOD: Use prepared statements with placeholders.
ALWAYS set PDO::ERRMODE_EXCEPTION to catch database errors.
Use PDO::FETCH_ASSOC to get rows as associative arrays.
Prepared Statements --- The Safe Way:
// Named placeholders (:name)
$stmt = $pdo->prepare('SELECT * FROM users WHERE email =
:email');
$stmt->execute(['email' => $email]);
$user = $stmt->fetch();
// Positional placeholders (?)
$stmt = $pdo->prepare('INSERT INTO users (name, email) VALUES (?,
?)');
$stmt->execute([$name, $email]);
$newId = $pdo->lastInsertId();
Fetching Data:
// Fetch one row
$row = $stmt->fetch(); // one row as assoc array
// Fetch all rows
$rows = $stmt->fetchAll(); // all rows as array of arrays
// Fetch single value
$count = $stmt->fetchColumn(); // first column of first row
Transactions:
$pdo->beginTransaction();
try {
$pdo->prepare('UPDATE accounts SET balance = balance - ? WHERE id
= ?')->execute([100, 1]);
$pdo->prepare('UPDATE accounts SET balance = balance + ? WHERE id
= ?')->execute([100, 2]);
$pdo->commit();
} catch (Exception $e) {
$pdo->rollBack();
throw $e;
}
Log in to track your progress and earn badges as you complete lessons.
Log In to Track Progress