PDO 提供数据访问抽象层: PDO 可以抽象“数据库驱动程序”(例如 MySQL、PostgreSQL 等...)。
PDO 不提供数据库抽象: PDO 不能抽象 SQL 语句。
示例
此 SQL 适用于 MySQL,但不适用于 PostgreSQL。
// MySQL connection
$pdo = new PDO("mysql:host=$host;dbname=$dbname", $username, $password, $options);
$sql = "REPLACE INTO blog (uuid, title) VALUES (:uuid, :title)";
$pdo->prepare($sql)->execute(['uuid' => '1234', 'title' => 'test']);
// PostgreSQL connection
$pdo2 = new PDO("pgsql:host=$host;dbname=$dbname", $username, $password, $options);
// This should fail
$pdo2->prepare($sql)->execute(['uuid' => '1234', 'title' => 'test']);
PS:PDO 不提供“真正的”数据访问抽象层。
例如,PDO 对象有一个 lastInsertId() 函数。对于 SQLite 和 MySQL,您可以这样称呼它:
$id = $pdo->lastInsertId();
然而,PostgreSQL 需要一个明确的序列标识符。默认情况下,它遵循 tablename_idfield_seq 格式,所以我们可以这样指定:
$id = $pdo->lastInsertId('articles_id_seq');
幸运的是这个参数被 SQLite 和 MySQL 忽略了,所以我们可以一直指定它。