Always use PDO
PDO is the standard PHP database abstraction layer. Use it over mysqli or legacy mysql_ functions. It supports parameterised queries natively, which is your primary injection defence.
PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::ATTR_EMULATE_PREPARES => false,
]
);
Parameterised queries
// Named parameters (preferred for clarity)
$stmt = $pdo->prepare("SELECT * FROM orders WHERE customer_id = :id AND status = :status");
$stmt->execute([":id" => $customerId, ":status" => "shipped"]);
Transactions
try {
$pdo->beginTransaction();
$pdo->prepare("INSERT INTO orders ...")->execute([...]);
$pdo->prepare("UPDATE inventory ...")->execute([...]);
$pdo->commit();
} catch (Exception $e) {
$pdo->rollBack();
throw $e;
}
Persistent connections
Set PDO::ATTR_PERSISTENT => true to reuse connections across requests (poor man's pooling). On PHP-FPM, this is often the simplest way to reduce connection overhead without adding PgBouncer or ProxySQL.