我最近才开始使用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
;这将是我主要编写的数据库语言。
答案 0 :(得分:2)
PDO实际上只是数据库的连接驱动程序 - 这意味着它是一个支持传递SQL语句,准备语句,绑定params,将记录集等返回到许多不同数据库类型的函数 - 而不是单个数据库每个数据库供应商的驱动程序。
它不会以任何方式更改您的SQL,并且如果您的语句仅由单个数据库类型支持,或者您的查询中的函数由一个数据库引擎而不是另一个数据库引擎支持 - 如果传递给错误的数据库,查询将失败。
绝大多数查询几乎可以在任何SQL数据库上运行,因为该语言有针对它编写的标准,并且大多数数据库都遵循该标准 - 但是,随着您的SQL越来越熟悉特定的数据库引擎,您可能会发现它变得不太可以转移到其他引擎。
如果您正在为特定数据库编写查询,则可以使用db engine必须提供的所有技巧,但如果您希望代码在任何支持PDO的数据库上运行,则可能需要编写更多"香草"查询 - 即使它们稍长一些。
编辑:确保在多个数据库上支持您的代码的最佳方法是简单地编写"简单"或"普通"查询。当你熟悉一个特定的数据库时,你通常知道每个人都有什么技巧 - 你知道,那个特殊的技巧只存在于那个数据库中。例如,mySQL有一个group_concat()
函数,它不能在任何其他数据库中工作,oracle有很多只能在Oracle数据库上运行的函数。
但是,在大多数情况下,使用普通选择,几乎所有聚合函数,正常(左,右,内)连接编写的查询将在每个引擎上完美地工作。您还可以使用众多网站之一(例如http://sqlfiddle.com/)来查看查询可以使用的引擎,或查看http://php.net/manual/en/book.pdo.php