Я новичок в 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 вы получаете:
Вы не получаете:
Взгляните на https://phpdelusions.net/pdo для лучшего понимания.