Php 了解PDO/Prepared语句如何处理多种数据库类型

Php 了解PDO/Prepared语句如何处理多种数据库类型,php,mysql,database,pdo,prepared-statement,Php,Mysql,Database,Pdo,Prepared Statement,我最近才开始使用PDO和Prepared语句,了解它们是如何工作的,但是我现在想支持多个数据库,并对它们的工作方式提出一些问题 据我所知,如果您在PHP中使用PDO,那么它将支持许多不同的数据库类型;然而,我想了解这是如何工作的 例如,如果我这样做: $data = array( 'name' => 'Cathy', 'addr' => '123 fake st', 'city' => 'fakesville' ); $sql = $db->("INSERT INTO

我最近才开始使用
PDO
Prepared语句
,了解它们是如何工作的,但是我现在想支持多个数据库,并对它们的工作方式提出一些问题

据我所知,如果您在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对特定DB引擎的熟悉程度越来越高,您可能会发现它的可移植性越来越差

如果要为特定数据库编写查询,可以使用db engine提供的所有技巧,但如果希望代码在任何支持PDO的数据库上运行,则可能需要编写更多的“普通”查询,即使它们稍微长一点

编辑:确保代码在多个数据库上受支持的最佳方法是只编写“简单”或“普通”查询。当您熟悉一个特定的数据库时,您通常知道每个数据库都有哪些窍门——并且您知道,这个特定的窍门只存在于该数据库中。例如,mySQL有一个
group\u concat()
函数在任何其他数据库中都不起作用,oracle有许多函数只在oracle数据库中起作用


然而,在大多数情况下,使用普通select、几乎任何聚合函数、普通(左、右、内)联接编写的查询在每个引擎上都能完美工作。您还可以使用众多网站中的一个(例如)来检查查询将在哪些引擎中工作,或者检查

,那么,确保您的代码支持其他数据库而不是“希望”它支持其他数据库的最佳方法是什么?您需要使用类似于
原则的东西吗。。。真的不能就这么做吗?太棒了。谢谢你的提示。我主要担心的是
连接
子选择
分组方式
具有
和db功能。同样感谢您提供有关SQLFIDLE的提示。如果您担心某个特定功能,最简单的方法是将您希望与数据库引擎一起使用的函数名(例如“oracle group_concat”)输入google,然后查看返回的结果。通常情况下,这些花哨的东西是不起作用的——而所有正常的常规查询都能100%起作用。