这是什么意思“pdo提供数据访问抽象层”和“pdo不提供数据库抽象”?

bd1hkmkf  于 2021-06-21  发布在  Mysql
关注(0)|答案(2)|浏览(316)

我刚接触php,决定开始学习pdo,但有一件事让我很困惑:pdo提供了数据访问抽象层,而pdo不提供数据库抽象
什么意思?
参考链接
有人能看出来吗?
谢谢!!!

jm81lzqq

jm81lzqq1#

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

ffscu2ro

ffscu2ro2#

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

相关问题