我是PHP的新手,决定开始学习PDO,但有一件事让我很困惑:PDO提供了一个数据访问抽象层和PDO不提供数据库抽象
什么意思?
参考链接
谁能说出来?
谢谢!!!
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忽略了该参数,因此我们可以一直指定它。
简单地说,数据访问抽象是指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,以便更好地理解。