我刚接触php,决定开始学习pdo,但有一件事让我很困惑:pdo提供了数据访问抽象层,而pdo不提供数据库抽象什么意思?参考链接有人能看出来吗?谢谢!!!
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 为了更好的理解。
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忽略了这个参数,所以我们可以一直指定它。
2条答案
按热度按时间jm81lzqq1#
简单地说,数据访问抽象是指pdo如何代表您与给定数据库进行交互。一般来说,所有的细节,如连接特定的属性、安全性、事务等,都是以标准的方式为您实现的。你需要做的就是学习pdo如何实现这些,然后你就可以开始使用mysql,mssql,oracle,postgres。
也就是说,它不能为您编写实际的sql/dml。你还需要亲自输入。这就引出了第二点,数据库抽象。这是指隐藏执行查询所需的低级sql/dml。如果您曾经使用过orm,那么您将熟悉这个概念。而不是写作
你会写信的
总之,使用pdo,您可以得到:
连接、安全性、错误处理和其他数据访问抽象
你不会得到:
sql/dml在幕后为您编写,就像使用orm一样
看一眼https://phpdelusions.net/pdo 为了更好的理解。
ffscu2ro2#
pdo提供了一个数据访问抽象层:pdo可以抽象“数据库驱动程序”(如mysql、postgresql等)。
pdo不提供数据库抽象:pdo不能抽象sql语句。
例子
此sql可用于mysql,但不能用于postgresql。
ps:pdo不提供“真正的”数据访问抽象层。
例如,pdo对象有一个lastinsertid()函数。对于sqlite和mysql,您可以这样称呼它:
然而,postgresql需要一个显式的序列标识符。默认情况下,它遵循tablename\ idfield\ seq格式,因此我们可以指定如下:
幸运的是,sqlite和mysql忽略了这个参数,所以我们可以一直指定它。