【问题标题】:What does this mean "PDO provides a data-access abstraction layer" and "PDO does not provide a database abstraction"?这意味着“PDO 提供数据访问抽象层”和“PDO 不提供数据库抽象”是什么意思?
【发布时间】:2018-01-16 13:08:12
【问题描述】:

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

什么意思?

Reference link

谁能告诉我?

谢谢!!!

【问题讨论】:

  • 这在您的链接的第二段中进行了解释...
  • 我认为您的链接所指向的页面解释得很好。在为不同的数据库使用 PDO 时,您可以使用相同的 PHP 函数,但您可能需要使 SQL 适应您正在使用的数据库。
  • @KIKO-我得到了你的第一点,但你的第二点有点混乱你能提供一个完整的答案,我会标记它有用!!!
  • 我建议继续学习PDO,这一点你会很清楚。例如,为 MySQL 数据库编写的 SQL 并不总是适用于 SQLite 数据库。所以你需要改变SQL。

标签: php mysql mysqli pdo


【解决方案1】:

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 忽略了,所以我们可以一直指定它。

【讨论】:

  • 你能给我举一个例子吗?
  • 好的,这意味着数据库功能相同,但不同数据库中的 SQL 语句可能不同,即 MySQL 在创建新表时与 Oracle 数据库相比具有不同的 SQL 语句。您的意思是我们必须手动处理 SQL 语句,而 PDO 不会手动处理它,这取决于程序员。我说的对吗?
【解决方案2】:

简单地说,数据访问抽象指的是 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 以获得更好的理解。

【讨论】:

  • 好的,这意味着数据库功能相同,但不同数据库中的 SQL 语句可能不同,即 MySQL 在创建新表时与 Oracle 数据库相比具有不同的 SQL 语句。您的意思是我们必须手动处理 SQL 语句,而 PDO 不会手动处理它,这取决于程序员。我说的对吗?
  • 好的,这意味着数据库功能相同...。不,它们不一样;但 PDO 使它们保持一致。
  • 我的意思是数据库的所有 PDO 函数都是相同的,即 PDO->exec() 但数据库的 SQL 语句可能不同。我是对的吗?
  • 是的,你明白了。
猜你喜欢
  • 2015-06-09
  • 1970-01-01
  • 2011-04-07
  • 2014-09-30
  • 2011-06-13
  • 1970-01-01
  • 2014-02-08
  • 2011-02-19
  • 2019-07-24
相关资源
最近更新 更多