Sets a connection option such as the default fetch mode or error reporting mode.
The objective is to understand the behavior and operational limits, not only the method name.
What It Does
Sets a connection option such as the default fetch mode or error reporting mode.
Syntax and Return Value
PDO::setAttribute(Parameter #0 [ <required> int $attribute ], Parameter #1 [ <required> mixed $value ]): mixed
The return value and exceptional cases depend on the call described here: Options vary by driver and should be set before executing dependent queries.
Example 1: Basic Use
This self-contained SQLite example uses in-memory demo data; it requires the pdo_sqlite driver.
<?php
$pdo = new PDO('sqlite::memory:', null, null, [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]);
$pdo->exec('CREATE TABLE products (id INTEGER PRIMARY KEY, name TEXT NOT NULL, price INTEGER NOT NULL, active INTEGER)');
$pdo->exec("INSERT INTO products (id,name,price,active) VALUES (1,'Desk',120,1),(2,'Lamp',35,1),(3,'Chair',85,0)");
$pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
echo json_encode($pdo->query("SELECT name FROM products LIMIT 1")->fetch());
Example 2: A Second Scenario
This self-contained SQLite example uses in-memory demo data; it requires the pdo_sqlite driver. This additional check distinguishes the method's result from connection or statement state.
<?php
$pdo = new PDO('sqlite::memory:', null, null, [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]);
$pdo->exec('CREATE TABLE products (id INTEGER PRIMARY KEY, name TEXT NOT NULL, price INTEGER NOT NULL, active INTEGER)');
$pdo->exec("INSERT INTO products (id,name,price,active) VALUES (1,'Desk',120,1),(2,'Lamp',35,1),(3,'Chair',85,0)");
$pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
echo json_encode($pdo->query("SELECT name FROM products LIMIT 1")->fetch());
$pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_NUM);
echo $pdo->getAttribute(PDO::ATTR_DEFAULT_FETCH_MODE);
Example 3: Practical Checks
This self-contained SQLite example uses in-memory demo data; it requires the pdo_sqlite driver. This additional check distinguishes the method's result from connection or statement state.
<?php
$pdo = new PDO('sqlite::memory:', null, null, [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]);
$pdo->exec('CREATE TABLE products (id INTEGER PRIMARY KEY, name TEXT NOT NULL, price INTEGER NOT NULL, active INTEGER)');
$pdo->exec("INSERT INTO products (id,name,price,active) VALUES (1,'Desk',120,1),(2,'Lamp',35,1),(3,'Chair',85,0)");
$pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
echo json_encode($pdo->query("SELECT name FROM products LIMIT 1")->fetch());
$pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_OBJ);
echo get_debug_type($pdo->query("SELECT name FROM products LIMIT 1")->fetch());
Important Behavior and Edge Cases
Options vary by driver and should be set before executing dependent queries.
For production use, also account for error handling, data validation, resource limits and environment-specific driver behavior.
Comparison with Related Approaches
| Approach | Important distinction |
|---|---|
| PDO::setAttribute | Sets a connection option such as the default fetch mode or error reporting mode. |
| Related API / pattern | getAttribute reads a supported connection option. |
Common Beginner Mistakes
| Mistake | Correct approach |
|---|---|
| Assuming the happy path covers edge cases | Options vary by driver and should be set before executing dependent queries. |
| Using a related API interchangeably | getAttribute reads a supported connection option. |
Key Takeaways
- Sets a connection option such as the default fetch mode or error reporting mode.
- Options vary by driver and should be set before executing dependent queries.
- getAttribute reads a supported connection option.
Choose this API or pattern when its exact semantics match your task, and verify the result against the database driver and runtime used by your application.