这意味着什么“PDO提供数据访问抽象层”和“PDO不提供数据库抽象”?

时间:2018-01-16 13:08:12

标签: php mysql mysqli pdo

我是PHP的新手并决定开始学习PDO,但有一点令我困惑的是: PDO提供数据访问抽象层 PDO不提供数据库抽象

这意味着什么?

Reference link

谁能说出来?

谢谢!!!

2 个答案:

答案 0 :(得分:2)

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会忽略该参数,因此我们可以随时指定它。

答案 1 :(得分:0)

简单地说,数据访问抽象指的是PDO如何代表您与给定的数据库进行交互。一般来说,所有细节的细节,如连接特定属性,安全性,交易等,都是以标准方式为您实现的。您需要做的就是了解PDO如何实现这些,然后您就可以开始使用MySQL,MSSQL,Oracle,Postgres。

话虽如此,它并没有为您编写实际的SQL / DML。您仍然需要在物理上输入。这将我们带到第二点,数据库抽象。这是指隐藏执行查询所需的低级SQL / DML。如果您曾经使用过ORM,那么您将熟悉这个概念。而不是写

$query = 'SELECT * FROM ...'
你会写

$db->get(Person, $id)

总之,使用PDO可以获得:

  • 连接,安全性,错误处理和其他数据访问抽象

你没有得到:

  • 在幕后为您编写SQL / DML,就像您使用ORM
  • 一样

查看https://phpdelusions.net/pdo以便更好地理解。