理解 PDO/Prepared Statements 如何与多种数据库类型一起工作
Understanding how PDO / Prepared Statements work with multiple databases types
我最近才开始使用 PDO
和 Prepared Statements
并了解它们如何正常工作,但是现在我想支持多个数据库并且对它们的工作方式有一些疑问。
据我了解,如果您在 PHP 中使用 PDO,那么它将立即支持许多不同的数据库类型;但是我想了解这是如何工作的。
例如,如果我这样做:
$data = array( 'name' => 'Cathy', 'addr' => '123 fake st', 'city' => 'fakesville' );
$sql = $db->("INSERT INTO folks (name, addr, city) value (:name, :addr, :city)");
$sql->execute($data);
我知道只要它受支持,它就可以在您想要的任何数据库上运行?
如果是这样,它是如何工作的?比如把SQL语句变成每个数据库引擎本身对应的语法?
如果以上内容属实,是否有任何我应该注意的不受支持的内容?我想我读到你不应该使用数据库特定的功能?
如果这是真的,如果需要的话,你会怎么做?您是否需要为每个要支持的数据库及其各自的功能编写 SQL?
常用的显然是MySQL中的COUNT
和SUM
;这将是我主要为之编写的数据库语言。
PDO 实际上只是数据库的连接驱动程序——这意味着它是一个函数,支持将 SQL 语句传递、准备语句、绑定参数、返回记录集等到许多不同的数据库类型- 而不是为每个数据库供应商提供一个驱动程序。
它不会以任何方式改变您的 SQL,并且如果您的语句仅受单一数据库类型支持,或者查询中的函数受一个数据库引擎支持,并且不是另一个 - 如果传递到错误的数据库,查询将失败。
绝大多数查询都适用于几乎任何 SQL 数据库,因为该语言有一个为其编写的标准并且大多数数据库都遵循该标准 - 然而,随着您的 SQL 增长更多熟悉特定的数据库引擎,您可能会发现它变得更难转移到其他引擎。
如果您正在为特定数据库编写查询,您可以使用数据库引擎必须提供的所有技巧,但如果您希望您的代码在任何支持 PDO 的数据库上运行,您可能必须编写更多 "vanilla" 个查询 - 即使它们稍微长一些。
编辑:确保您的代码在多个数据库上得到支持的最佳方法是简单地编写 "simple" 或 "plain" 查询。当您熟悉一个特定的数据库时,您通常会知道每个数据库都有哪些技巧——而且您知道,那个特定的技巧只存在于该数据库中。例如,mySQL 有一个 group_concat()
函数在任何其他数据库中都不起作用,oracle 有许多函数只能在 Oracle 数据库上起作用。
然而,在大多数情况下,使用普通 select 编写的查询,几乎所有聚合函数、普通(左、右、内)连接都可以在每个引擎上完美运行。您还可以使用众多网站之一(例如 http://sqlfiddle.com/) to check what engines a query will work in or check http://php.net/manual/en/book.pdo.php
我最近才开始使用 PDO
和 Prepared Statements
并了解它们如何正常工作,但是现在我想支持多个数据库并且对它们的工作方式有一些疑问。
据我了解,如果您在 PHP 中使用 PDO,那么它将立即支持许多不同的数据库类型;但是我想了解这是如何工作的。
例如,如果我这样做:
$data = array( 'name' => 'Cathy', 'addr' => '123 fake st', 'city' => 'fakesville' );
$sql = $db->("INSERT INTO folks (name, addr, city) value (:name, :addr, :city)");
$sql->execute($data);
我知道只要它受支持,它就可以在您想要的任何数据库上运行?
如果是这样,它是如何工作的?比如把SQL语句变成每个数据库引擎本身对应的语法?
如果以上内容属实,是否有任何我应该注意的不受支持的内容?我想我读到你不应该使用数据库特定的功能?
如果这是真的,如果需要的话,你会怎么做?您是否需要为每个要支持的数据库及其各自的功能编写 SQL?
常用的显然是MySQL中的COUNT
和SUM
;这将是我主要为之编写的数据库语言。
PDO 实际上只是数据库的连接驱动程序——这意味着它是一个函数,支持将 SQL 语句传递、准备语句、绑定参数、返回记录集等到许多不同的数据库类型- 而不是为每个数据库供应商提供一个驱动程序。
它不会以任何方式改变您的 SQL,并且如果您的语句仅受单一数据库类型支持,或者查询中的函数受一个数据库引擎支持,并且不是另一个 - 如果传递到错误的数据库,查询将失败。
绝大多数查询都适用于几乎任何 SQL 数据库,因为该语言有一个为其编写的标准并且大多数数据库都遵循该标准 - 然而,随着您的 SQL 增长更多熟悉特定的数据库引擎,您可能会发现它变得更难转移到其他引擎。
如果您正在为特定数据库编写查询,您可以使用数据库引擎必须提供的所有技巧,但如果您希望您的代码在任何支持 PDO 的数据库上运行,您可能必须编写更多 "vanilla" 个查询 - 即使它们稍微长一些。
编辑:确保您的代码在多个数据库上得到支持的最佳方法是简单地编写 "simple" 或 "plain" 查询。当您熟悉一个特定的数据库时,您通常会知道每个数据库都有哪些技巧——而且您知道,那个特定的技巧只存在于该数据库中。例如,mySQL 有一个 group_concat()
函数在任何其他数据库中都不起作用,oracle 有许多函数只能在 Oracle 数据库上起作用。
然而,在大多数情况下,使用普通 select 编写的查询,几乎所有聚合函数、普通(左、右、内)连接都可以在每个引擎上完美运行。您还可以使用众多网站之一(例如 http://sqlfiddle.com/) to check what engines a query will work in or check http://php.net/manual/en/book.pdo.php